content-distribution — Claude Code MCP server: post to 8 channels
Takes one piece of writing and pushes prepared variants to DEV.to, Hashnode, Reddit, Bluesky and more, with retries and a post log.
claude mcp add content-distribution -e DEV_TO_API_KEY=<DEV_TO_API_KEY> -e HASHNODE_TOKEN=<HASHNODE_TOKEN> -e GITHUB_TOKEN=<GITHUB_TOKEN> -e REDDIT_CLIENT_ID=<REDDIT_CLIENT_ID> -e REDDIT_CLIENT_SECRET=<REDDIT_CLIENT_SECRET> -e REDDIT_PASSWORD=<REDDIT_PASSWORD> -e BLUESKY_PASSWORD=<BLUESKY_PASSWORD> -- npx -y @automatelab/content-distribution-mcpWhat content-distribution does
The server expects your agent to hand it finished per-channel variants: a rewritten title, a trimmed body, tags that fit the platform. It then publishes each one. There are no model calls inside — just adapters for devto, hashnode, github-discussions, reddit, bluesky and a browser fallback. State lives in YAML files under ~/.distribution-mcp.
Publishing is idempotent on the content.id plus channel pair. Call post_publish again and you get the stored live_url back without a second request to the platform. Variants carrying schedule_at wait in ~/.distribution-mcp/scheduled.yaml until post_drain runs; that call fits a cron job.
Credentials come from a profile in ~/.distribution-mcp/profiles.yaml. LinkedIn, Medium and Twitter/X behave differently: the server answers with needs_browser and a compose URL instead of posting, so no keys are involved. Node.js 18 or newer is required. Version 2.2.0 renamed the tools from flat names (publish, schedule) to dotted ones (post_publish, post_schedule), so any prompt or n8n node still using the old names needs editing.
What it helps with
- ship one article to several platforms at once
- produce copy that fits each channel's limits and rules
- avoid double-posting when an agent run repeats
- queue posts for later and fire them from cron
- see which channel already has the piece and its URL
Example prompts for the agent
- Publish the
n8n-webhook-setuparticle to devto and to the ClaudeAI subreddit - Schedule this post for tomorrow at 9 and publish the rest now
- Show me what has already gone live for this piece and where
How to install content-distribution
Platform CLI
claude mcp add content-distribution -e DEV_TO_API_KEY=<DEV_TO_API_KEY> -e HASHNODE_TOKEN=<HASHNODE_TOKEN> -e GITHUB_TOKEN=<GITHUB_TOKEN> -e REDDIT_CLIENT_ID=<REDDIT_CLIENT_ID> -e REDDIT_CLIENT_SECRET=<REDDIT_CLIENT_SECRET> -e REDDIT_PASSWORD=<REDDIT_PASSWORD> -e BLUESKY_PASSWORD=<BLUESKY_PASSWORD> -- npx -y @automatelab/content-distribution-mcpReplace <…> with your own values. 8 more environment variables are in the server README
Platform CLI
codex mcp add content-distribution --env DEV_TO_API_KEY=<DEV_TO_API_KEY> --env HASHNODE_TOKEN=<HASHNODE_TOKEN> --env HASHNODE_PUBLICATION_ID=<HASHNODE_PUBLICATION_ID> --env GITHUB_TOKEN=<GITHUB_TOKEN> --env GITHUB_DISCUSSION_REPO=<GITHUB_DISCUSSION_REPO> -- npx -y @automatelab/content-distribution-mcpReplace <…> with your own values. 8 more environment variables are in the server README
Config file
{
"mcpServers": {
"content-distribution": {
"command": "npx",
"args": [
"-y",
"@automatelab/content-distribution-mcp"
],
"env": {
"DEV_TO_API_KEY": "<DEV_TO_API_KEY>",
"HASHNODE_TOKEN": "<HASHNODE_TOKEN>",
"HASHNODE_PUBLICATION_ID": "<HASHNODE_PUBLICATION_ID>",
"GITHUB_TOKEN": "<GITHUB_TOKEN>",
"GITHUB_DISCUSSION_REPO": "<GITHUB_DISCUSSION_REPO>"
}
}
}
}Replace <…> with your own values. 8 more environment variables are in the server README
Config file
{
"servers": {
"content-distribution": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@automatelab/content-distribution-mcp"
],
"env": {
"DEV_TO_API_KEY": "<DEV_TO_API_KEY>",
"HASHNODE_TOKEN": "<HASHNODE_TOKEN>",
"HASHNODE_PUBLICATION_ID": "<HASHNODE_PUBLICATION_ID>",
"GITHUB_TOKEN": "<GITHUB_TOKEN>",
"GITHUB_DISCUSSION_REPO": "<GITHUB_DISCUSSION_REPO>"
}
}
}
}Replace <…> with your own values. 8 more environment variables are in the server README
Platform CLI
gemini mcp add -e DEV_TO_API_KEY=<DEV_TO_API_KEY> -e HASHNODE_TOKEN=<HASHNODE_TOKEN> -e HASHNODE_PUBLICATION_ID=<HASHNODE_PUBLICATION_ID> -e GITHUB_TOKEN=<GITHUB_TOKEN> -e GITHUB_DISCUSSION_REPO=<GITHUB_DISCUSSION_REPO> content-distribution npx -y @automatelab/content-distribution-mcpReplace <…> with your own values. 8 more environment variables are in the server README
Step by step, with commands for each platform: How to add an MCP server to Claude Code, Codex, Cursor, VS Code, Gemini CLI and more
Questions about content-distribution
How do I install content-distribution in Claude Code?
Run `claude mcp add content-distribution -e DEV_TO_API_KEY=<DEV_TO_API_KEY> -e HASHNODE_TOKEN=<HASHNODE_TOKEN> -e GITHUB_TOKEN=<GITHUB_TOKEN> -e REDDIT_CLIENT_ID=<REDDIT_CLIENT_ID> -e REDDIT_CLIENT_SECRET=<REDDIT_CLIENT_SECRET> -e REDDIT_PASSWORD=<REDDIT_PASSWORD> -e BLUESKY_PASSWORD=<BLUESKY_PASSWORD> -- npx -y @automatelab/content-distribution-mcp`, replacing the environment values with your own.
What does content-distribution do?
It posts prepared variants to DEV.to, Hashnode, GitHub Discussions, Reddit and Bluesky, and for LinkedIn, Medium and Twitter/X it hands back a compose URL. Scheduling and the post log are kept in YAML files.
Do I need credentials for every platform?
No. Fill in only the ones you plan to use — LinkedIn, Medium and Twitter/X need none, since those go through the browser.