Content Distribution MCP
The Content Distribution MCP server enables publishing a single piece of content across multiple platforms with automatic adaptation, idempotency, scheduling, and state management. Here's what you can do:
Publish immediately — Send content variants to multiple channels at once (DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, Medium, Twitter). Idempotent: re-running with the same content ID and channel returns cached results without re-posting.
Schedule future posts — Queue variants with a
schedule_atdatetime for deferred delivery; immediate variants are published right away and scheduled entries are stored locally in YAML.Drain the scheduled queue — Fire all scheduled posts due at or before a given time boundary. Safe to run from cron; already-published pairs are automatically skipped.
Check publish status — Inspect the current state (published, queued, errored) of any content piece across all channels, filterable by content ID and/or channel. Read-only, no external calls.
Unpublish posts — Best-effort deletion of a live post on a target platform (e.g., DEV.to performs a soft delete; platforms without a delete API return a failure indicator gracefully).
Get per-channel hints — Retrieve metadata for any channel: character limits, Markdown support flags, tag vocabulary, and CTA placement rules. Useful for composing valid variants before publishing.
List configured profiles — Discover all credential-backed distribution profiles configured in the local YAML backend.
List subreddits — Browse the Subreddit Catalog with cooldown windows, flair vocabulary, and last-posted timestamps, optionally filtered by profile.
Enables publishing content to Bluesky with automatic adaptation to platform-specific constraints such as character limits and formatting.
Allows publishing articles to DEV.to with automatic adaptation to platform-specific constraints including formatting and tag vocabularies.
Enables publishing content to GitHub Discussions with automatic adaptation to platform-specific constraints.
Allows publishing articles to Hashnode with automatic adaptation to platform-specific constraints.
Enables publishing content to Medium via browser fallback, returning a compose URL for manual posting when direct API is unavailable.
Allows publishing content to Reddit with automatic adaptation, enforcement of subreddit rules, and support for flairs and cooldowns.
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.
Related MCP server: ViralTransformer MCP Server
How It Works
Your agent generates channel-specific copy variants (rewritten titles, trimmed text, platform-appropriate tags, audience-matched tone).
This MCP publishes each variant with idempotency, OAuth, API retries, and scheduling—enforcing platform constraints automatically.
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-mcpOr 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
- LocalLLaMAOnly 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.
Tool | Purpose |
| Immediate publish; idempotent on |
| Queue variants for |
| Fire all scheduled posts due now — run from cron |
| Per-channel state for a content piece or channel |
| Best-effort delete (DEV.to sets unpublished; others vary) |
| Per-channel metadata: char limits, Markdown support, tag vocab |
| Names of configured distribution profiles |
| Subreddit 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 key | Tier | Auth |
| Auto |
|
| Auto |
|
| Auto |
|
| Auto-gated |
|
| Auto |
|
| Browser fallback | returns |
| Browser fallback | returns |
| Browser fallback | returns |
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 drainOr call the post_drain MCP tool directly from an agent.
Environment variables
Variable | Default | Purpose |
|
| State backend ( |
|
| Directory 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 nothingPart of the AutomateLab stack
agency-os — control plane
content-distribution-mcp — this package
automatelab.tech — blog and tutorials
License
MIT
Maintenance
Latest Blog Posts
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AutomateLab-tech/content-distribution-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server