
Content Distribution
Distributes a single piece of content across DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, Medium, and Twitter through eight MCP tools. You generate platform-specific variants (rewritten titles, trimmed bodies, audience-matched tone), then call post.publish or post.schedule to send them out. The server handles OAuth, API retries, idempotency on content ID plus channel pairs, and platform constraints like Reddit cooldowns and character limits. Scheduling uses post.drain fired from cron. LinkedIn, Medium, and Twitter return compose URLs instead of auto-posting. Credentials live in a YAML profile. Reach for this when you're syndicating blog posts, tutorials, or announcements and want to avoid hand-posting eight times with different formatting rules.
- GitHub stars
- 2
- tools
- 8
- auth
- Secret needed
- transport
- STDIO
- env vars
- 13
- last updated
- May 21, 2026
Tools
8 toolsPublic tool metadata for what this MCP can expose to an agent.
post.publishPublish one or more channel variants immediately. Side effects: makes external HTTP requests to each channel platform; writes publish state to the local YAML backend; requires valid credentials in the named profile. Idempotent on (content.id, channel) — re-running with the sam...3 params
Publish one or more channel variants immediately. Side effects: makes external HTTP requests to each channel platform; writes publish state to the local YAML backend; requires valid credentials in the named profile. Idempotent on (content.id, channel) — re-running with the sam...
contentobjectprofile_namestringvariantsarraypost.scheduleEnqueue channel variants with schedule_at for future publishing; variants without schedule_at are published immediately. Side effects: writes entries to the local YAML schedule store; makes external HTTP requests for any immediately-published variants; requires credentials in...3 params
Enqueue channel variants with schedule_at for future publishing; variants without schedule_at are published immediately. Side effects: writes entries to the local YAML schedule store; makes external HTTP requests for any immediately-published variants; requires credentials in...
contentobjectprofile_namestringvariantsarraypost.drainFire all scheduled posts due at or before the given time boundary. Side effects: makes external HTTP requests for each due entry; writes results to the YAML backend. Idempotent — already-published (content.id, channel) pairs are skipped; no-op when no entries are due. Safe to...1 params
Fire all scheduled posts due at or before the given time boundary. Side effects: makes external HTTP requests for each due entry; writes results to the YAML backend. Idempotent — already-published (content.id, channel) pairs are skipped; no-op when no entries are due. Safe to...
nowstringpost.statusReturn publish state for content pieces. Filters by content_id, channel, or both; returns all entries when neither is given. Side effects: read-only; no external HTTP calls; no auth needed. Deterministic given unchanged backend state. Use post.status to inspect what has been p...2 params
Return publish state for content pieces. Filters by content_id, channel, or both; returns all entries when neither is given. Side effects: read-only; no external HTTP calls; no auth needed. Deterministic given unchanged backend state. Use post.status to inspect what has been p...
channelstringcontent_idstringpost.unpublishBest-effort delete of a published post on the target platform. Side effects: makes an external HTTP DELETE or update request; DEV.to sets published=false (soft delete); platforms without a delete API return success=false without error. Non-idempotent — calling on an already-de...2 params
Best-effort delete of a published post on the target platform. Side effects: makes an external HTTP DELETE or update request; DEV.to sets published=false (soft delete); platforms without a delete API return success=false without error. Non-idempotent — calling on an already-de...
channelstringlive_urlstringchannel.hintsReturn static per-channel metadata: character limits, Markdown support flags, tag vocabulary, and CTA placement rules. Side effects: read-only; no external HTTP calls; no auth needed. Fully deterministic — returns compile-time adapter constants. Use channel.hints before compos...1 params
Return static per-channel metadata: character limits, Markdown support flags, tag vocabulary, and CTA placement rules. Side effects: read-only; no external HTTP calls; no auth needed. Fully deterministic — returns compile-time adapter constants. Use channel.hints before compos...
channelstringprofile.listReturn all distribution profile names configured in the YAML backend. Side effects: read-only; no external HTTP calls. Deterministic given backend state. Use profile.list to discover available profiles before calling post.publish, post.schedule, or subreddit.list; then pass th...
Return all distribution profile names configured in the YAML backend. Side effects: read-only; no external HTTP calls. Deterministic given backend state. Use profile.list to discover available profiles before calling post.publish, post.schedule, or subreddit.list; then pass th...
No parameter schema in public metadata yet.
subreddit.listReturn all subreddits in the Subreddit Catalog with cooldown windows, flair vocabulary, and last-posted metadata. Optionally filtered to subreddits allowed by the named profile. Side effects: read-only; no external HTTP calls. Deterministic given backend state. Use subreddit.l...1 params
Return all subreddits in the Subreddit Catalog with cooldown windows, flair vocabulary, and last-posted metadata. Optionally filtered to subreddits allowed by the named profile. Side effects: read-only; no external HTTP calls. Deterministic given backend state. Use subreddit.l...
profile_namestringSponsors
Configuration
DEV_TO_API_KEYsecretDEV.to API key for publishing articles
HASHNODE_TOKENsecretHashnode personal access token
HASHNODE_PUBLICATION_IDHashnode publication ID
GITHUB_TOKENsecretGitHub personal access token for GitHub Discussions
GITHUB_DISCUSSION_REPOGitHub repo for Discussions in owner/repo format
REDDIT_CLIENT_IDsecretReddit OAuth app client ID
REDDIT_CLIENT_SECRETsecretReddit OAuth app client secret
REDDIT_USERNAMEReddit account username
REDDIT_PASSWORDsecretReddit account password
BLUESKY_IDENTIFIERBluesky handle (e.g. you.bsky.social)
BLUESKY_PASSWORDsecretBluesky app password
DISTRIBUTION_BACKENDState backend (default: yaml)
DISTRIBUTION_BACKEND_DIRDirectory for YAML state files (default: ~/.distribution-mcp)
Readme
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
Details
- Repository
- github.com/automatelab-tech/content-distribution-mcp
- Category
- Developer Tools
- Package
@automatelab/content-distribution-mcp- Transport
- STDIO
- Auth
- Required
- Registry
- MCP registry, active