mcpField
F
Facebook Publisher

Facebook Publisher

ローカル
github.comソーシャルメディア025 週間前に更新

Facebook Publisher について

Facebook Publisherは、Meta Graph API経由で複数のFacebook Pagesに投稿または予約投稿するMCPサーバーです。ページごとの公開ルールを管理する運用者向けで、オフラインで実行できる公開前チェックと最近の投稿との重複確認を備えています。

主な機能

  1. 01設定済みページへの投稿・予約投稿
  2. 02公開前チェックと可否判定
  3. 03最近の投稿との重複確認
  4. 04OpenAIまたはfal.aiで画像を生成
  5. 05ページ別のブランドボイスと禁止トピック設定

活用シーン

  1. 01顧客ページごとに公開ルールを設定
  2. 02最近の投稿との重複を確認
  3. 03キャンペーン投稿用の画像を生成
  4. 04販促投稿をまとめて予約

MCP 対応

Facebookへの投稿、検証、重複確認、画像生成のツールをMCPクライアントに提供し、Meta Graph APIでページを操作します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"anthonyjbolo-mcp-fb-publisher": {
"command": "uvx",
"args": [
"mcp-fb-publisher"
],
"env": {
"META_USER_TOKEN": "<META_USER_TOKEN>",
"MCP_FB_PUBLISHER_CONFIG": "<MCP_FB_PUBLISHER_CONFIG>",
"MCP_FB_PUBLISHER_CONFIG_JSON": "<MCP_FB_PUBLISHER_CONFIG_JSON>",
"OPENAI_API_KEY": "<OPENAI_API_KEY>",
"FAL_KEY": "<FAL_KEY>"
}
}
}
}
起動コマンドuvx mcp-fb-publisher
設定が必要な環境変数
META_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypimcp-fb-publisher0.1.1

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

mcp-fb-publisher

Claude(またはMCP互換のLLM)がMeta Graph APIを通じて複数のFacebookページに安全に投稿できるようにするMCPサーバーです。ブランドの声の設定、禁止トピックのブロックリスト、画像必須の適用、最近のフィード投稿との重複防止チェックなど、組み込みのガードレールを備えています。

Tests License: MIT Python 3.12+ #BuiltOnClaudeCode

なぜこれが必要なのか

LLM エージェントにFacebookページへの直接投稿を許可するのは、ガードレールを設けない限り危険です。5つ以上のページを運用する中で遭遇した、よくある失敗例を紹介します。

  1. トークンが気づかれないまま期限切れになる — 深夜に投稿が失敗しても、3日間誰も気づきません。
  2. 14日以内に同じ切り口で2回投稿する — オーディエンスが飽き、リーチが低下します。
  3. ブランドの声で画像が必須なのに、テキストのみの投稿になる — エンゲージメントが急落します。
  4. 禁止トピックが漏れる — 競合他社の名前、社内コードネーム、または廃止済みの製品に言及してしまいます。

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_checkJaccard類似度を使い、単語の4-gramで候補メッセージとページの最近の投稿を比較します。
fb_generate_post_with_imageOpenAI(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類似度で比較します。

  1. 正規化します。小文字に変換し、アクセント記号を除去(NFKD)し、URLと句読点を削除して、空白をまとめます。
  2. 両方のテキストについて、単語単位の4-gramの集合を作成します。
  3. similarity = |A ∩ B| / |A ∪ B|
  4. 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

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。