io.github.AutomateLab-tech/content-distribution

السجل الرسمي أدوات المطورين

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

التثبيت

أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: ‏.cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «mcpServers»).

NPM package @automatelab/content-distribution-mcp
Claude Code
claude mcp add content-distribution -e 'DEV_TO_API_KEY=<your dev_to_api_key>' -e 'HASHNODE_TOKEN=<your hashnode_token>' -e 'HASHNODE_PUBLICATION_ID=<HASHNODE_PUBLICATION_ID>' -e 'GITHUB_TOKEN=<your github_token>' -e 'GITHUB_DISCUSSION_REPO=<GITHUB_DISCUSSION_REPO>' -e 'REDDIT_CLIENT_ID=<your reddit_client_id>' -e 'REDDIT_CLIENT_SECRET=<your reddit_client_secret>' -e 'REDDIT_USERNAME=<REDDIT_USERNAME>' -e 'REDDIT_PASSWORD=<your reddit_password>' -e 'BLUESKY_IDENTIFIER=<BLUESKY_IDENTIFIER>' -e 'BLUESKY_PASSWORD=<your bluesky_password>' -e 'DISTRIBUTION_BACKEND=<DISTRIBUTION_BACKEND>' -e 'DISTRIBUTION_BACKEND_DIR=<DISTRIBUTION_BACKEND_DIR>' -- npx -y @automatelab/content-distribution-mcp@2.2.1
إعداد JSON (Claude Desktop وCursor وVS Code)
{
    "mcpServers": {
        "content-distribution": {
            "command": "npx",
            "args": [
                "-y",
                "@automatelab/content-distribution-mcp@2.2.1"
            ],
            "env": {
                "DEV_TO_API_KEY": "<your dev_to_api_key>",
                "HASHNODE_TOKEN": "<your hashnode_token>",
                "HASHNODE_PUBLICATION_ID": "<HASHNODE_PUBLICATION_ID>",
                "GITHUB_TOKEN": "<your github_token>",
                "GITHUB_DISCUSSION_REPO": "<GITHUB_DISCUSSION_REPO>",
                "REDDIT_CLIENT_ID": "<your reddit_client_id>",
                "REDDIT_CLIENT_SECRET": "<your reddit_client_secret>",
                "REDDIT_USERNAME": "<REDDIT_USERNAME>",
                "REDDIT_PASSWORD": "<your reddit_password>",
                "BLUESKY_IDENTIFIER": "<BLUESKY_IDENTIFIER>",
                "BLUESKY_PASSWORD": "<your bluesky_password>",
                "DISTRIBUTION_BACKEND": "<DISTRIBUTION_BACKEND>",
                "DISTRIBUTION_BACKEND_DIR": "<DISTRIBUTION_BACKEND_DIR>"
            }
        }
    }
}

متغيرات البيئة

  • DEV_TO_API_KEY سري DEV.to API key for publishing articles
  • HASHNODE_TOKEN سري Hashnode personal access token
  • HASHNODE_PUBLICATION_ID Hashnode publication ID
  • GITHUB_TOKEN سري GitHub personal access token for GitHub Discussions
  • GITHUB_DISCUSSION_REPO GitHub repo for Discussions in owner/repo format
  • REDDIT_CLIENT_ID سري Reddit OAuth app client ID
  • REDDIT_CLIENT_SECRET سري Reddit OAuth app client secret
  • REDDIT_USERNAME Reddit account username
  • REDDIT_PASSWORD سري Reddit account password
  • BLUESKY_IDENTIFIER Bluesky handle (e.g. you.bsky.social)
  • BLUESKY_PASSWORD سري Bluesky app password
  • DISTRIBUTION_BACKEND State backend (default: yaml)
  • DISTRIBUTION_BACKEND_DIR Directory for YAML state files (default: ~/.distribution-mcp)

التوثيق

مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.

المحتويات
  1. content-distribution-mcp
  2. The Problem It Solves
  3. How It Works
  4. Install
  5. Wire into your MCP host
  6. Configure credentials
  7. MCP tool surface
  8. Channels
  9. Example agent call
  10. Idempotency
  11. Scheduling
  12. Environment variables
  13. Requirements
  14. Architecture
  15. Works with any MCP client
  16. Part of the AutomateLab stack
  17. License

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

npx @automatelab/content-distribution-mcp

Or 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
    - 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

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

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

Part of the AutomateLab stack

License

MIT

الأسئلة الشائعة

ما هو io.github.AutomateLab-tech/content-distribution؟

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

كيف أثبّت io.github.AutomateLab-tech/content-distribution؟

يعمل على جهازك. في Claude Code: claude mcp add content-distribution -e 'DEV_TO_API_KEY=<your dev_to_api_key>' -e 'HASHNODE_TOKEN=<your hashnode_token>' -e 'HASHNODE_PUBLICATION_ID=<HASHNODE_PUBLICATION_ID>' -e 'GITHUB_TOKEN=<your github_token>' -e 'GITHUB_DISCUSSION_REPO=<GITHUB_DISCUSSION_REPO>' -e 'REDDIT_CLIENT_ID=<your reddit_client_id>' -e 'REDDIT_CLIENT_SECRET=<your reddit_client_secret>' -e 'REDDIT_USERNAME=<REDDIT_USERNAME>' -e 'REDDIT_PASSWORD=<your reddit_password>' -e 'BLUESKY_IDENTIFIER=<BLUESKY_IDENTIFIER>' -e 'BLUESKY_PASSWORD=<your bluesky_password>' -e 'DISTRIBUTION_BACKEND=<DISTRIBUTION_BACKEND>' -e 'DISTRIBUTION_BACKEND_DIR=<DISTRIBUTION_BACKEND_DIR>' -- npx -y @automatelab/content-distribution-mcp@2.2.1. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.

هل يحتاج io.github.AutomateLab-tech/content-distribution إلى مفتاح API؟

نعم. يتطلب DEV_TO_API_KEY, HASHNODE_TOKEN, GITHUB_TOKEN, REDDIT_CLIENT_ID, REDDIT_CLIENT_SECRET, REDDIT_PASSWORD, BLUESKY_PASSWORD، وتضبطها في إعداداته.

هل io.github.AutomateLab-tech/content-distribution مفتوح المصدر؟

نعم. شيفرته متاحة على GitHub بترخيص MIT.

من يصون io.github.AutomateLab-tech/content-distribution؟

ينشره AutomateLab-tech. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.

من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.