Content Distribution Mcp について
Content Distribution Mcpは、1つのコンテンツを複数のソーシャル・公開チャネルに配信し、各プラットフォームに合わせた形式と公開状態を管理します。繰り返し投稿を行うエージェントやチーム向けで、冪等な再試行、予約投稿、一部チャネルのブラウザー引き継ぎに対応します。
主な機能
- 01記載された8チャネルへの公開
- 02チャネルごとの形式ヒント
- 03予約投稿とキューの実行
- 04チャネル別の投稿状態追跡
- 05冪等な公開再試行
- 06一部チャネルのブラウザー作成リンク
活用シーン
- 01製品告知を複数チャネルに配信
- 02投稿を後の時刻に予約
- 03チャネルでの公開成功を確認
MCP 対応
公開、予約、状態確認、チャネルヒント、プロファイル、subreddit情報を扱う8つのMCPツールを提供します。MCPクライアントはstdioで接続し、LinkedIn、Medium、X/Twitterではブラウザーの投稿画面に引き継ぎます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @automatelab/content-distribution-mcpDEV_TO_API_KEYシークレットDEV.to API key for publishing articlesHASHNODE_TOKENシークレットHashnode personal access tokenHASHNODE_PUBLICATION_IDHashnode publication IDGITHUB_TOKENシークレットGitHub personal access token for GitHub DiscussionsGITHUB_DISCUSSION_REPOGitHub repo for Discussions in owner/repo formatREDDIT_CLIENT_IDシークレットReddit OAuth app client IDREDDIT_CLIENT_SECRETシークレットReddit OAuth app client secretREDDIT_USERNAMEReddit account usernameREDDIT_PASSWORDシークレットReddit account passwordBLUESKY_IDENTIFIERBluesky handle (e.g. you.bsky.social)BLUESKY_PASSWORDシークレットBluesky app passwordDISTRIBUTION_BACKENDState backend (default: yaml)DISTRIBUTION_BACKEND_DIRDirectory for YAML state files (default: ~/.distribution-mcp)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
8掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| content | object | はい | |
| content.id | string | はい | 安定した識別子。例:'my-post@2026-05-20'。channel と組み合わせて冪等性キーとして使用します。コンテンツごとに一意である必要があります。 |
| content.tags | array | いいえ | 標準タグリストです。各チャネルアダプターが正規化、切り詰め、またはプラットフォームのタグ構文に変換します。 |
| content.title | string | はい | コンテンツのタイトルです。ほとんどのチャネルで投稿タイトルとして使用されます。 |
| content.author | string | はい | 作成者の表示名です。作成者メタデータに対応するチャネルで使用されます。 |
| content.body_md | string | はい | Markdown 形式の本文全体です。各チャネルアダプターがプラットフォームの要件に合わせて変換または切り詰めます。 |
| content.subtitle | string | いいえ | 任意のサブタイトルです。Hashnode と DEV.to のサブタイトルフィールドで使用され、サブタイトルに対応していないチャネルでは無視されます。 |
| content.cta_block | string | いいえ | 任意の行動喚起ブロックです。対応するチャネルでは投稿本文に追加されます。Markdown 形式で指定します。 |
| content.cover_image | string | いいえ | カバー画像の URL(任意)。Hashnode と DEV.to でヘッダー画像として使用します。画像がない場合は省略してください。 |
| content.canonical_url | string | いいえ | 正式なソースの正規 URL です。DEV.to と Hashnode で canonical_url に設定して、SEO 向けにオリジナルを示します。そのチャネルへの初回公開時は省略してください。 |
| content.source_task_id | string | いいえ | 任意のトレース ID(例:Notion タスク ID)です。関連付けのため公開状態に保存されますが、プラットフォームには送信されません。 |
| variants | array | はい | |
| profile_name | string | はい | 配信プロファイル(認証情報ストア)の名前です。profile.list を使用して利用可能な名前を確認します。 |
詳細
content-distribution-mcp
コンテンツをプラットフォームごとに書き直すことなく、あらゆる場所に公開できます。
1つのコンテンツを8つ以上のチャネル(DEV.to、Hashnode、GitHub Discussions、Reddit、Bluesky、LinkedIn、Medium、Twitter)に配信するMCPサーバーです。プラットフォームに応じた自動調整、冪等な公開、コミュニティごとのスパム対策ルール、一元的な状態管理に対応しています。
解決する課題
コンテンツを大量に作成して公開するには、多くの手間がかかります。
- 形式の違い:Redditでは書式が削除され、Twitterには文字数制限があり、DEV.toは埋め込みやリッチメディアに対応しています。それぞれに合わせて文章を調整する必要があります。
- プラットフォームのルール:サブレディットではクールダウンやフレアの指定が求められます。コミュニティには投稿パターンや自動モデレーターによる制限があります。LinkedInでは外部リンクの表示が抑制されます。
- 状態の混乱:どの投稿がどこで公開されたのか。公開が途中で失敗した場合はどうなるのか。Redditの投稿がスパムフィルターによって自動削除されたのか。
このMCPが配信の複雑さを処理します。核となるメッセージを一度書けば、プラットフォームに合わせたバリエーションを生成し、安全に各所へ公開できます。
仕組み
- エージェントがチャネルごとの文章のバリエーション(タイトルの書き換え、テキストの短縮、プラットフォームに適したタグ、対象読者に合わせたトーン)を生成します。
- このMCPが、冪等性、OAuth、APIの再試行、スケジュール設定を使って各バリエーションを公開し、プラットフォームの制約を自動的に適用します。
- プラットフォームごとの内容はあなたが決めます。MCPはチャネルごとのヒント(文字数制限、タグの語彙、クールダウン)を返しますが、創作上の判断はあなたに委ねます。
内部でLLMを呼び出すことはありません。特定の環境に閉じ込められたエージェントもありません。大規模なマルチプラットフォームコンテンツ配信用の、シンプルなAPIです。
インストール
npx -y @automatelab/content-distribution-mcp
または、MCPホストに恒久的に追加します。
MCPホストへの接続
Claude Code — .claude/mcp.json に追加します。
{
"mcpServers": {
"content-distribution": {
"command": "npx",
"args": ["-y", "@automatelab/content-distribution-mcp"]
}
}
}
Claude Desktop — claude_desktop_config.json に追加します。
{
"mcpServers": {
"content-distribution": {
"command": "npx",
"args": ["-y", "@automatelab/content-distribution-mcp"]
}
}
}
n8n — MCP Clientノードを使用し、stdio経由で npx -y @automatelab/content-distribution-mcp を指定します。
Cursor / Windsurf / その他のMCPホスト — 同じ npx -y @automatelab/content-distribution-mcp のパターンを使用します。
認証情報の設定
サーバーは、~/.distribution-mcp/profiles.yaml に保存されたDistribution Profileから認証情報を読み込みます。
# ~/.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
使用するチャネルの認証情報だけを設定してください。LinkedIn、Medium、Twitter/Xは作成画面のURLとともに needs_browser を返すため、認証情報は不要です。
MCPツール一覧
8つのツールがあり、ドット記法の名前で階層構造をたどれます(post.*、channel.*、profile.*、subreddit.*)。各ツールは outputSchema(呼び出し元がレスポンスの型をチェックできます)と、MCPの annotations(読み取り専用/破壊的操作/冪等/オープンワールドのヒント)を宣言します。サーバー内部でLLMを呼び出すことはありません。
| ツール | 目的 |
|---|---|
post_publish | 即時公開。(content.id, channel) に対して冪等です |
post_schedule | バリエーションを schedule_at に登録し、残りを即時公開します |
post_drain | 現在公開時刻を迎えている予約済み投稿をすべて実行します — cronから実行してください |
post_status | コンテンツまたはチャネルのチャネルごとの状態 |
post_unpublish | 可能な範囲で削除します(DEV.toでは非公開に設定され、ほかは異なる場合があります) |
channel_hints | チャネルごとのメタデータ:文字数制限、Markdown対応状況、タグの語彙 |
profile_list | 設定済みのDistribution Profileの名前 |
subreddit_list | Subreddit Catalog:クールダウン、フレアの語彙、最終投稿日時 |
v2.2.0の破壊的変更。 ツール名が、フラットな名前(
publish、schedule、...)からドット記法(post_publish、post_schedule、...)に変更されました。旧名を参照しているプロンプト、エージェントスキル、n8nノードを更新してください。
チャネル
| チャネルキー | ティア | 認証 |
|---|---|---|
devto | 自動 | DEV_TO_API_KEY |
hashnode | 自動 | HASHNODE_TOKEN + HASHNODE_PUBLICATION_ID |
github_discussions | 自動 | GITHUB_TOKEN + GITHUB_DISCUSSION_REPO |
reddit | 自動ゲート付き | REDDIT_CLIENT_ID/SECRET/USERNAME/PASSWORD |
bluesky | 自動 | BLUESKY_IDENTIFIER + BLUESKY_PASSWORD |
linkedin | ブラウザーのフォールバック | needs_browser + 作成ページの URL を返します |
medium | ブラウザーのフォールバック | needs_browser + 作成ページの URL を返します |
twitter / x | ブラウザーのフォールバック | needs_browser + 作成ページの URL を返します |
エージェント呼び出しの例
// 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"
}
冪等性
同じ content.id と channel の組み合わせで post_publish を再実行すると、プラットフォーム API を再度呼び出さず、既存の live_url をすぐに返します。失敗した場合も安全に再試行できます。
スケジュール設定
schedule_at を指定したバリアント(タイムゾーン付きの ISO-8601 形式。例:"2026-05-21T09:00:00+00:00")は ~/.distribution-mcp/scheduled.yaml に保存され、次回の post_drain 呼び出し時に実行されます。cron から drain を実行してください。
# fire due posts every 5 minutes
*/5 * * * * npx -y @automatelab/content-distribution-mcp drain
または、エージェントから post_drain MCP ツールを直接呼び出してください。
環境変数
| 変数 | デフォルト値 | 用途 |
|---|---|---|
DISTRIBUTION_BACKEND | yaml | 状態バックエンド(v1 では yaml のみ) |
DISTRIBUTION_BACKEND_DIR | ~/.distribution-mcp | YAML 状態ファイルのディレクトリ |
要件
- Node.js 18 以降
アーキテクチャ
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)
あらゆる MCP クライアントで動作
Anthropic 固有のコードは一切ありません。次の方法で確認できます。
grep -ri "anthropic" node_modules/content-distribution-mcp/dist/ # returns nothing
AutomateLab スタックの一部
- agency-os — コントロールプレーン
- content-distribution-mcp — このパッケージ
- automatelab.tech — ブログとチュートリアル
ライセンス
MIT
メンテナンスと検証
解釈上の制限、該当する場合の現在のツール名、再現可能な検証方法については、メンテナンスガイドを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。