Bundle Pluginsource linked

automatelab-content-distribution-mcpv2.2.1

Multi-channel content distribution MCP server. Publish one piece of content to DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, Medium, and Twitter with idempotent state.

@automatelab/content-distribution-mcp·runtime @automatelab/content-distribution-mcp·by @automatelab
openclaw bundles install clawhub:@automatelab/content-distribution-mcp
Latest release: v2.2.1Download zip

Capabilities

Bundle format
claude
Runtime ID
@automatelab/content-distribution-mcp

Compatibility

Built With Open Claw Version
2.2.1
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Suspicious
high confidence
!
Purpose & Capability
The publishing capability matches the stated purpose, but it can immediately post or retract public content using stored account credentials; the runtime also has profile-scoping bugs where unpublish uses the first profile and scheduled drain falls back to default.
!
Instruction Scope
The docs disclose publishing and scheduling, but they do not require an explicit final confirmation before live API calls, and the skill tool overview appears out of sync with the implemented post.* tool names.
!
Install Mechanism
Most artifacts identify @automatelab/content-distribution-mcp, but .mcp.json invokes @ratamaha/content-distribution-mcp, creating a concrete install-source ambiguity for a high-impact publishing tool.
Credentials
Network access, local YAML state, and platform credentials are proportionate for content distribution, but the README and pipeline docs normalize plaintext profile secrets without strong protection guidance.
!
Persistence & Privilege
The server persists profiles, post logs, and scheduled content under ~/.distribution-mcp; scheduled jobs do not preserve the requested profile, which can cause future posts to run under the wrong account.
Scan Findings in Context
[LP3] expected: External API calls and credentials are expected for this MCP, but the artifact lacks a clear permission/trust-boundary declaration for a tool that publishes publicly.
[SDI-1] unexpected: Confirmed: post.unpublish has no profile_name and loads the first configured profile, which is not appropriate for multi-profile account control.
[SQP-2] expected: Public posting and local credential profiles are purpose-aligned, but warnings and confirmation controls are weak; the Medium Playwright/draft behavior is described in the spec but not implemented in the current TypeScript adapter.
[PE3] unexpected: Confirmed as documentation risk: docs/PIPELINE.md names a concrete local .env path and shows reading it into a profile, but this is not runtime credential harvesting code.
[suspicious.exposed_secret_literal] expected: The static scan appears to flag profile credential variable usage, not hardcoded secrets; this does not support a malicious finding.
What to consider before installing
Install only if you intend to let an agent publish to your external accounts. Verify the package source before running because one config points to a different npm scope, use least-privilege tokens, protect ~/.distribution-mcp/profiles.yaml, avoid shared machines, and require your own review step before any publish, schedule, drain, or unpublish action.
src/adapters/bluesky.ts:26
File appears to expose a hardcoded API secret or token.
src/adapters/devto.ts:19
File appears to expose a hardcoded API secret or token.
Patterns worth reviewing
These patterns may indicate risky behavior. Check the VirusTotal and OpenClaw results above for context-aware analysis before installing.

Verification

Tier
source linked
Scope
artifact only
Summary
Validated package structure and linked the release to source metadata.
Commit
5a3b1899a2ce
Tag
main
Provenance
No
Scan status
suspicious

Tags

latest
2.2.1

content-distribution-mcp

Publish your content everywhere—without rewriting for every platform.

A MCP server that distributes a single piece of content across 8+ channels (DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, Medium, Twitter) with automatic platform-specific adaptation, idempotent publishing, per-community anti-spam rules, and centralized state management.

The Problem It Solves

Creating and publishing content at scale is friction-heavy:

  • Different formats: Reddit strips formatting, Twitter has character limits, DEV.to supports embeds and rich media. Each needs customized copy.
  • Platform rules: Subreddits enforce cooldowns and flair requirements. Communities have posting patterns and automoderator gates. LinkedIn suppresses external links.
  • State chaos: Which posts went live where? What if a publish fails halfway? Did that Reddit post get auto-removed by spam filters?

This MCP handles distribution complexity. Write your core message once, generate platform-specific variants, publish everywhere safely.

How It Works

  1. Your agent generates channel-specific copy variants (rewritten titles, trimmed text, platform-appropriate tags, audience-matched tone).
  2. This MCP publishes each variant with idempotency, OAuth, API retries, and scheduling—enforcing platform constraints automatically.
  3. You control which platforms get what. The MCP returns per-channel hints (character limits, tag vocabularies, cooldowns) but leaves creative decisions to you.

No LLM calls inside. No walled-in agents. Just a clean API for multi-platform content distribution at scale.

Install

npx @automatelab/content-distribution-mcp

Or add it permanently to your MCP host.

Wire into your MCP host

Claude Code — add to .claude/mcp.json:

{
  "mcpServers": {
    "content-distribution": {
      "command": "npx",
      "args": ["-y", "@automatelab/content-distribution-mcp"]
    }
  }
}

Claude Desktop — add to claude_desktop_config.json:

{
  "mcpServers": {
    "content-distribution": {
      "command": "npx",
      "args": ["-y", "@automatelab/content-distribution-mcp"]
    }
  }
}

n8n — use the MCP Client node, point it at npx @automatelab/content-distribution-mcp over stdio.

Cursor / Windsurf / any MCP host — same npx -y content-distribution-mcp pattern.

Configure credentials

The server reads credentials from a Distribution Profile stored in ~/.distribution-mcp/profiles.yaml:

# ~/.distribution-mcp/profiles.yaml
default:
  credentials:
    DEV_TO_API_KEY: "your-devto-api-key"
    HASHNODE_TOKEN: "your-hashnode-token"
    HASHNODE_PUBLICATION_ID: "your-pub-id"
    GITHUB_TOKEN: "ghp_..."
    GITHUB_DISCUSSION_REPO: "owner/repo"
    REDDIT_CLIENT_ID: "..."
    REDDIT_CLIENT_SECRET: "..."
    REDDIT_USERNAME: "..."
    REDDIT_PASSWORD: "..."
    BLUESKY_IDENTIFIER: "you.bsky.social"
    BLUESKY_PASSWORD: "..."
  subreddits:
    - ClaudeAI
    - LocalLLaMA

Only set credentials for channels you intend to use. LinkedIn, Medium, and Twitter/X return needs_browser with a compose URL — no credentials needed.

MCP tool surface

Eight tools, dot-notation names form a navigable tree (post.*, channel.*, profile.*, subreddit.*). Every tool declares an outputSchema (callers can type-check responses) and MCP annotations (read-only / destructive / idempotent / open-world hints). No LLM calls inside the server.

ToolPurpose
post.publishImmediate publish; idempotent on (content.id, channel)
post.scheduleQueue variants for schedule_at, publish the rest immediately
post.drainFire all scheduled posts due now — run from cron
post.statusPer-channel state for a content piece or channel
post.unpublishBest-effort delete (DEV.to sets unpublished; others vary)
channel.hintsPer-channel metadata: char limits, Markdown support, tag vocab
profile.listNames of configured distribution profiles
subreddit.listSubreddit Catalog: cooldowns, flair vocab, last-posted

v2.2.0 breaking change. Tools were renamed from flat names (publish, schedule, ...) to dot-notation (post.publish, post.schedule, ...). Update any prompts, agent skills, or n8n nodes that referenced the old names.

Channels

Channel keyTierAuth
devtoAutoDEV_TO_API_KEY
hashnodeAutoHASHNODE_TOKEN + HASHNODE_PUBLICATION_ID
github_discussionsAutoGITHUB_TOKEN + GITHUB_DISCUSSION_REPO
redditAuto-gatedREDDIT_CLIENT_ID/SECRET/USERNAME/PASSWORD
blueskyAutoBLUESKY_IDENTIFIER + BLUESKY_PASSWORD
linkedinBrowser fallbackreturns needs_browser + compose URL
mediumBrowser fallbackreturns needs_browser + compose URL
twitter / xBrowser fallbackreturns needs_browser + compose URL

Example agent call

// post.publish tool
{
  "content": {
    "id": "n8n-webhook-setup@2026-05-20",
    "title": "How to set up an n8n webhook",
    "body_md": "...",
    "tags": ["automation", "n8n", "tutorial"],
    "canonical_url": "https://yourblog.com/n8n-webhook-setup",
    "author": "You"
  },
  "variants": [
    {
      "channel": "devto:main",
      "title": "How to set up an n8n webhook",
      "body": "...",
      "tags": ["automation", "n8n", "tutorial", "devops"],
      "canonical_url": "https://yourblog.com/n8n-webhook-setup",
      "extras": {}
    },
    {
      "channel": "reddit:ClaudeAI",
      "title": "Built a webhook automation with n8n",
      "body": "Here's how I set it up...",
      "tags": [],
      "extras": { "flair": "Project" }
    }
  ],
  "profile_name": "default"
}

Idempotency

Re-running post.publish with the same content.id + channel pair returns the existing live_url immediately without making another platform API call. Safe to retry on failure.

Scheduling

Variants with schedule_at (ISO-8601 with timezone, e.g. "2026-05-21T09:00:00+00:00") are stored in ~/.distribution-mcp/scheduled.yaml and fired on the next post.drain call. Run drain from cron:

# fire due posts every 5 minutes
*/5 * * * * npx -y content-distribution-mcp drain

Or call the post.drain MCP tool directly from an agent.

Environment variables

VariableDefaultPurpose
DISTRIBUTION_BACKENDyamlState backend (yaml only in v1)
DISTRIBUTION_BACKEND_DIR~/.distribution-mcpDirectory for YAML state files

Requirements

  • Node.js 18 or later

Architecture

Agent (Claude Code / n8n / Cursor / any MCP host)
  │  generates per-channel copy, calls MCP tools
  ▼
content-distribution-mcp  (this package, stdio transport)
  │  no LLM calls — pure I/O
  ├── adapters/   devto · hashnode · github-discussions · reddit · bluesky · browser
  └── backends/   yaml (post log · profiles · schedule queue · subreddit catalog)

Works with any MCP client

No Anthropic-specific code anywhere. Verify:

grep -ri "anthropic" node_modules/content-distribution-mcp/dist/  # returns nothing

Part of the AutomateLab stack

License

MIT