automatelab-tech avatar

Content Distribution

automatelab-tech/content-distribution-mcp

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 tools

Public 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...

Parameters* required
contentobject
profile_namestring
Name of the distribution profile (credentials store). Use profile.list to discover available names.
variantsarray
post.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...

Parameters* required
contentobject
profile_namestring
Name of the distribution profile (credentials store). Use profile.list to discover available names.
variantsarray
post.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...

Parameters* required
nowstring
ISO-8601 datetime boundary, e.g. '2026-05-21T09:00:00Z'; defaults to current UTC time when omitted.
post.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...

Parameters* required
channelstring
Filter to a specific channel slug, e.g. 'devto', 'reddit:ClaudeAI'; omit to return state for all channels.
content_idstring
Filter to a specific content piece by its stable ID; omit to return state for all content.
post.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...

Parameters* required
channelstring
Channel slug the post was published to, e.g. 'devto', 'hashnode', 'reddit:ClaudeAI'.
live_urlstring
URL of the live published post to retract, e.g. 'https://dev.to/user/post-slug'.
channel.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...

Parameters* required
channelstring
Channel platform name, e.g. 'devto', 'reddit', 'hashnode', 'bluesky'. Use the platform prefix only, not the full 'platform:account' form.
profile.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...

Parameters* required
profile_namestring
Optional profile name to filter subreddits to those allowed by that profile; omit to return the full catalog.

Sponsors

Configuration

DEV_TO_API_KEYsecret

DEV.to API key for publishing articles

HASHNODE_TOKENsecret

Hashnode personal access token

HASHNODE_PUBLICATION_ID

Hashnode publication ID

GITHUB_TOKENsecret

GitHub personal access token for GitHub Discussions

GITHUB_DISCUSSION_REPO

GitHub repo for Discussions in owner/repo format

REDDIT_CLIENT_IDsecret

Reddit OAuth app client ID

REDDIT_CLIENT_SECRETsecret

Reddit OAuth app client secret

REDDIT_USERNAME

Reddit account username

REDDIT_PASSWORDsecret

Reddit account password

BLUESKY_IDENTIFIER

Bluesky handle (e.g. you.bsky.social)

BLUESKY_PASSWORDsecret

Bluesky app password

DISTRIBUTION_BACKEND

State backend (default: yaml)

DISTRIBUTION_BACKEND_DIR

Directory 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


View the full README on GitHub

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

More from automatelab-tech

Related Developer Tools MCP servers

View all
1lu-zhengda avatarVirtual Filesystemlu-zhengda/mcp-virtual-fsPostgreSQL-backed virtual filesystem for agents: session isolation, shared stores, POSIX ops, RLS.2stars
2scrape-badger avatarScrapeBadgerscrape-badger/scrapebadger-mcpTwitter/X, Google, Facebook Marketplace, Yelp, GitHub and AutoScout24 for AI agents.2stars
3jonesrobm avatarPhysboundjonesrobm/physboundPhysical Layer Linter: validates RF and radar calculations against hard physical limits.2stars
4marin1321 avatarMcp Devtoolsmarin1321/mcp-devtoolsMCP server giving AI agents safe access to filesystem, databases, processes, and APIs.2stars
5qiuwenzheng avatarInterminalqiuwenzheng/interminalLightweight MCP server providing terminal access (SSH & local shells) for AI assistants.2stars
6rbfinch avatarHindsight MCPrbfinch/hindsight-mcpMCP server for AI-assisted coding with development history: git, tests, Copilot.2stars