Facebook Publisher について
Facebook Publisherは、Meta Graph API経由で複数のFacebook Pagesに投稿または予約投稿するMCPサーバーです。ページごとの公開ルールを管理する運用者向けで、オフラインで実行できる公開前チェックと最近の投稿との重複確認を備えています。
主な機能
- 01設定済みページへの投稿・予約投稿
- 02公開前チェックと可否判定
- 03最近の投稿との重複確認
- 04OpenAIまたはfal.aiで画像を生成
- 05ページ別のブランドボイスと禁止トピック設定
活用シーン
- 01顧客ページごとに公開ルールを設定
- 02最近の投稿との重複を確認
- 03キャンペーン投稿用の画像を生成
- 04販促投稿をまとめて予約
MCP 対応
Facebookへの投稿、検証、重複確認、画像生成のツールをMCPクライアントに提供し、Meta Graph APIでページを操作します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx mcp-fb-publisherMETA_USER_TOKENシークレットLong-lived Meta Graph API user or page token. Required for publishing.MCP_FB_PUBLISHER_CONFIGAbsolute path to your config.yaml (per-page brand voices, banned topics, image policy).MCP_FB_PUBLISHER_CONFIG_JSONInline JSON config (alternative to file path, useful for serverless deploys).OPENAI_API_KEYシークレットOpenAI API key for image generation via gpt-image-1 (optional).FAL_KEYシークレットfal.ai API key for image generation via Flux Pro (optional).ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
mcp-fb-publisher
Claude(またはMCP互換のLLM)がMeta Graph APIを通じて複数のFacebookページに安全に投稿できるようにするMCPサーバーです。ブランドの声の設定、禁止トピックのブロックリスト、画像必須の適用、最近のフィード投稿との重複防止チェックなど、組み込みのガードレールを備えています。
なぜこれが必要なのか
LLM エージェントにFacebookページへの直接投稿を許可するのは、ガードレールを設けない限り危険です。5つ以上のページを運用する中で遭遇した、よくある失敗例を紹介します。
- トークンが気づかれないまま期限切れになる — 深夜に投稿が失敗しても、3日間誰も気づきません。
- 14日以内に同じ切り口で2回投稿する — オーディエンスが飽き、リーチが低下します。
- ブランドの声で画像が必須なのに、テキストのみの投稿になる — エンゲージメントが急落します。
- 禁止トピックが漏れる — 競合他社の名前、社内コードネーム、または廃止済みの製品に言及してしまいます。
mcp-fb-publisher は、単一の config.yaml で動作する4つの決定論的なツールを介して、Meta Graph APIをラップするMCPサーバーを提供します。すべての公開呼び出しでは、デフォルトで検証が実行されます。検証は純粋なPythonで行われ(LLMは不要)、CIで再現可能で、オフラインで実行できます。
機能
4つのMCPツール:
| ツール | 機能 |
|---|---|
fb_publish_post | 設定済みページに投稿を公開(または予約投稿)します。デフォルトで完全な検証を実行します。省略するには skip_validation=True を渡します。 |
fb_validate_pre_publish | すべてのガードレールをドライランで実行します。`verdict: go |
fb_anti_duplicate_check | Jaccard類似度を使い、単語の4-gramで候補メッセージとページの最近の投稿を比較します。 |
fb_generate_post_with_image | OpenAI(gpt-image-1)またはfal.ai(flux-pro)を使って画像を生成し、fb_publish_post ですぐに使えるURLを返します。 |
5分で始める
# 1. Install
pip install mcp-fb-publisher
# 2. Copy and edit the example config
cp config.example.yaml config.yaml
# -> set page_id values, brand voices, banned_topics
# 3. Set required env
export META_USER_TOKEN="<your long-lived Meta page/user token>"
export MCP_FB_PUBLISHER_CONFIG="$PWD/config.yaml"
# 4. (Optional) for image generation
export OPENAI_API_KEY="sk-..." # or
export FAL_KEY="..."
# 5. Run the MCP server (stdio transport)
mcp-fb-publisher
Claude Desktop / Claude Code に接続する
claude_desktop_config.json に追加します。
{
"mcpServers": {
"fb-publisher": {
"command": "mcp-fb-publisher",
"env": {
"META_USER_TOKEN": "your_token_here",
"MCP_FB_PUBLISHER_CONFIG": "/absolute/path/to/config.yaml",
"OPENAI_API_KEY": "sk-..."
}
}
}
}
次のような内容をClaudeに依頼します。
「マーケティングページに『新コレクションは金曜日に登場』と投稿してください。まず画像を生成し、検証してから公開してください。」
Claudeは fb_generate_post_with_image → fb_validate_pre_publish → fb_publish_post の順に呼び出します。
アーキテクチャ
flowchart LR
A[Claude / MCP client] -->|tool call| B[FastMCP server]
B --> C{tool}
C -->|generate| D[OpenAI / fal.ai]
C -->|validate| E[Validator<br/>pure Python]
C -->|anti-dup| F[Meta Graph API<br/>fetch_recent_posts]
C -->|publish| G[Meta Graph API<br/>POST /feed or /photos]
E -.reads.-> H[(config.yaml<br/>per-page rules)]
G -.reads.-> H
F -.reads.-> H
生成、検証、公開を分けているのは意図的です。Meta APIの利用枠を消費せずにLLMがビジュアルを調整でき、MetaアカウントがなくてもCIでガードレールを検査できます。
重複防止の仕組み
ページごとの anti_duplicate_lookback_days(デフォルトは14日)の期間内にあるすべての投稿と候補メッセージを、単語の4-gramによるJaccard類似度で比較します。
- 正規化します。小文字に変換し、アクセント記号を除去(NFKD)し、URLと句読点を削除して、空白をまとめます。
- 両方のテキストについて、単語単位の4-gramの集合を作成します。
similarity = |A ∩ B| / |A ∪ B|similarity >= similarity_threshold(デフォルトは0.5)の場合、ブロックします。
埋め込みではなくこの方法を使う理由:決定論的で無料、追加のAPIキーが不要で、1回の呼び出しで50件の候補を処理するのに十分な速さがあるためです。LLM相当の意味比較が必要な場合は、もう1つのレイヤーを追加してください。fb_validate_pre_publish ツールはスコアを返すため、エージェントが判断できます。
ブランドの声の設定
defaults:
language: en
brand_voice: |
Direct, professional, no fluff.
banned_topics: []
image_required: true
anti_duplicate_lookback_days: 14
pages:
marketing_main:
page_id: "0000000000000000"
name: "My Brand — Main"
brand_voice: |
Confident, concise, customer-first.
banned_topics:
- competitor_brand_a
- leaked_codename
image_required: true
community:
page_id: "0000000000000002"
name: "Community"
image_required: false
注:brand_voice フィールドは情報提供用です。ツールの説明を通じて呼び出し元のLLMに提示されますが、サーバー自体がこれに照らしてLLMによる検証を行うことはありません。これは意図的な設計です(テストはオフラインで実行できる必要があります)。適用を強制したい場合は、独自のLLMチェックを追加してください。
ユースケース
1. 複数ページを運用する代理店
クライアント向けに5つのFacebookページを運用しています。それぞれに独自のブランドボイス、禁止トピック(競合他社の名前)、画像ポリシーがあります。すべてを1つの config.yaml に設定し、Claudeにツールを渡せば、安全策を設けたうえで、エージェントがすべてのページで投稿の下書き作成・検証・公開を行えます。
2. ひとりで事業を運営する創業者
単一の製品ページを運営していて、Claudeに今後30日分の投稿をスケジュールしてもらいたいとします。image_required: true を設定し、製品概要をエージェントに渡して、fb_anti_duplicate_check を使えば、2週間以内に同じ切り口の投稿が重複しないようにできます。
3. Eコマース
期間限定プロモーションを繰り返し実施しています。プロモーションページには anti_duplicate_lookback_days: 7 を、継続的なコンテンツを掲載するページには 14 を設定します。scheduled_at と組み合わせれば、1週間分の投稿をまとめて予約できます。
開発
git clone https://github.com/anthonyjbolo/mcp-fb-publisher.git
cd mcp-fb-publisher
python3.12 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev,openai,fal]"
# Run the test suite (offline, no Meta credentials needed)
pytest
# Lint
ruff check .
すべてのテストで httpx.MockTransport と pytest-mock を使用します。テストでは実際のMeta APIを呼び出しません。
セキュリティ
- Metaトークンは
META_USER_TOKENからのみ読み込みます。ハードコードしないでください。 - トークン文字列は、プロセス外に出る前にエラーメッセージ内で
***REDACTED***に置き換えられます。 - バリデーターは同期処理かつオフラインで動作するため、認証情報を漏らすことなくCIで安全に実行できます。
config.yamlは.gitignoreに含まれています。コミットされるのはconfig.example.yamlのみです。
ロードマップ
- Instagram Graph API のサポート(バリデーターはすでに動作しており、調整が必要なのは
meta_clientの公開処理のみです)。 - 公開失敗時のオプションのntfy Webhook。
- オプトイン形式のツールとして、LLMによるブランドボイスのスコアリング機能。
- トークンローテーション用ヘルパー(
fb_check_token_expiry)。
En français — pourquoi ce projet
Nouvelle-Calédonieで、5つのFacebookページ(自動車学校、ビンゴのマーケットプレイス、アプリ開発スタジオ、Tシャツブランド、メディアページ)を並行して運営するために開発しました。上記の落とし穴はすべて、私が実際に経験したバグです。MCPサーバーは、初日から使いたかったレイヤーです。今では自由に利用できます。
ライセンス
MIT — LICENSE を参照してください。
コントリビューション
IssueとPRを歓迎します。PRを作成する前に、pytest と ruff check . を実行してください。大規模な機能を追加する場合は、まずIssueを作成して相談してください。
#BuiltOnClaudeCode
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。