Content Distribution

io.github.AutomateLab-techPublished by GitHub account AutomateLab-techv2.2.1Updated Oct 24, 2026

Publish content to DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, and Medium.

The publisher's own server: Distribution

Overview

AI-generated overview

A local MCP server that publishes one piece of content to DEV.to, Hashnode, GitHub Discussions, Reddit and Bluesky, with browser fallbacks for LinkedIn, Medium,

What you can do
Publish or schedule per-channel content variants to DEV.to, Hashnode, GitHub Discussions, Reddit and Bluesky, with idempotent retries on the same content ID and channel. Drain scheduled posts that are due, and check per-channel status for a content piece or channel. Unpublish or best-effort delete posts, with behavior varying by platform. Look up channel hints such as character limits, Markdown support and tag vocabularies. List configured distribution profiles and subreddit catalog entries with cooldowns, flair options and last-posted dates. For LinkedIn, Medium and Twitter/X it returns a needs_browser result with a compose URL instead of posting.
When to use it
Use it when you write content once and want an assistant to adapt and distribute it across several developer and social channels, or to queue posts on a schedule and track where each one went live. It suits repeat publishing workflows driven from an MCP host or cron rather than one-off manual posting.
Requirements
Runs locally over stdio via npx, requiring Node.js 18 or later. Credentials are read from a profile file in the distribution state directory, or from environment variables: DEV_TO_API_KEY, HASHNODE_TOKEN and HASHNODE_PUBLICATION_ID, GITHUB_TOKEN and GITHUB_DISCUSSION_REPO, Reddit client ID, secret, username and password, and BLUESKY_IDENTIFIER with BLUESKY_PASSWORD. Only set credentials for channels you use. Desktop only.
Before you install
It holds publishing credentials for several accounts, including a Reddit account password and a Bluesky app password, stored in a local profile file. Publishing, scheduling and unpublishing write to external platforms and are visible to the public; unpublish is best-effort and may not fully remove a post. Reddit posting is subject to subreddit cooldowns and anti-spam rules. Tool names changed in v2.2.0, so older prompts may break.

Installation

In SourceWeft

  1. Open Content Distribution in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

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

  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

bash
npx -y @automatelab/content-distribution-mcp

Or add it permanently to your MCP host.

Wire into your MCP host

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

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

Claude Desktop — add to claude_desktop_config.json:

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

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

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

Configure credentials

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

yaml
# ~/.distribution-mcp/profiles.yamldefault:  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

jsonc
// 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:

bash
# fire due posts every 5 minutes*/5 * * * * npx -y @automatelab/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:

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

Part of the AutomateLab stack

License

MIT

Maintenance and verification

See the maintenance guide for interpretation limits, current tool names where applicable, and reproducible verification.

Source: README.md at commit 72486f9

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v2.2.1LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Distribution integrations