关于 Facebook Publisher
Facebook Publisher 是通过 Meta Graph API 向多个 Facebook Pages 发布或排期内容的 MCP 服务,面向需要按页面配置发布规则的运营者。它在发布前运行可离线检查的校验,并支持近期内容查重。
主要功能
- 01向配置的页面发布或排期帖子
- 02发布前检查并返回放行或拦截结果
- 03按近期帖子检测内容重复
- 04通过 OpenAI 或 fal.ai 生成图片
- 05按页面配置品牌语气与禁发主题
适用场景
- 01为多个客户页面设置不同发布规则
- 02检查帖子是否与近期内容重复
- 03生成配图后发布营销内容
- 04为促销内容安排发布时间
MCP 相关
向 MCP 客户端提供 Facebook 帖子发布、校验、查重和图片生成工具,并通过 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
一个 MCP 服务,可通过 Meta Graph API,让 Claude(或任何兼容 MCP 的大模型)安全地向多个 Facebook 专页发布帖子,并内置防护措施:品牌语气配置、违禁话题黑名单、强制要求图片,以及针对近期动态帖子的反重复检查。
为什么要开发这个项目
如果不先设置防护措施,让 LLM Agent 直接向你的 Facebook 专页发帖,就像给自己埋下隐患。我在运营 5 个以上专页时遇到过以下常见问题:
- 令牌悄然过期——帖子在午夜发布失败,3 天后才有人发现。
- 14 天内发布两篇角度相同的帖子——受众失去兴趣,触达率下降。
- 只发文字,而品牌语气规范要求配图——互动率骤降。
- 泄露违禁话题——提及竞争对手名称、内部代号或已停用的产品。
mcp-fb-publisher 提供了一个 MCP 服务,通过 4 个确定性工具封装 Meta Graph API,所有工具均由一个 config.yaml 驱动。默认情况下,每次发布都会经过验证。验证使用纯 Python 实现(不依赖 LLM),可在 CI 中复现,也可离线运行。
功能
4 个 MCP 工具:
| 工具 | 功能 |
|---|---|
fb_publish_post | 在已配置的专页上发布(或定时发布)帖子。默认执行完整验证;传入 skip_validation=True 可跳过验证。 |
fb_validate_pre_publish | 试运行所有防护措施。返回 `verdict: go |
fb_anti_duplicate_check | 使用基于单词 4-gram 的 Jaccard 相似度,将候选消息与专页近期帖子进行比较。 |
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
将生成、验证和发布分开是有意为之:这样 LLM 可以反复调整视觉内容,而不会消耗 Meta API 配额;同时也便于在没有 Meta 账号的情况下,于 CI 中检查防护措施。
反重复策略
我们会使用基于单词 4-gram 的 Jaccard 相似度,将候选消息与 anti_duplicate_lookback_days 指定时间范围内的每篇帖子进行比较(按专页设置,默认 14 天):
- 规范化:转为小写、去除重音符号(NFKD)、删除 URL、删除标点符号、合并空白字符。
- 分别为两段文本生成单词级 4-gram 集合。
similarity = |A ∩ B| / |A ∪ B|- 如果
similarity >= similarity_threshold(默认值为 0.5),则阻止发布。
为什么不用嵌入:结果确定、免费、无需额外的 API 密钥,对于每次调用检查 50 个候选项来说速度足够快。如果你想进行 LLM 级别的语义比较,可以在此基础上添加一层检查——fb_validate_pre_publish 工具会返回相似度分数,供你的 Agent 作出判断。
品牌语气配置
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 页面。每个页面都有自己的品牌语调、禁用话题(竞争对手名称)和图片政策。将它们全部配置在一个 config.yaml 中,把工具提供给 Claude,然后让 Agent 在安全措施的保障下,为所有页面起草、验证并发布内容。
2. 独立创始人
你运营一个产品页面,希望 Claude 安排接下来 30 天的帖子。设置 image_required: true,向 Agent 提供你的产品简介,并使用 fb_anti_duplicate_check 确保两周内没有两篇帖子采用相同的切入角度。
3. 电商
你会轮换发布限时促销。为促销页面设置 anti_duplicate_lookback_days: 7,为常青内容页面设置 14。结合 scheduled_at,一次性将一周的帖子加入队列。
开发
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。
- 可选工具:基于大模型的品牌语调评分。
- 令牌轮换助手(
fb_check_token_expiry)。
En français — ce projet, et pourquoi
项目在新喀里多尼亚开发,用于并行管理 5 个 FB 页面(驾校、宾果市场、应用工作室、T 恤品牌、媒体页面)。上述所有陷阱都是我亲身遇到过的 bug。MCP 服务正是我希望第一天就能拥有的那一层——现在它已开源。
许可证
MIT — 参见 LICENSE。
参与贡献
欢迎提交 Issues 和 PR。提交 PR 前,请运行 pytest 和 ruff check .。对于重要功能,请先开 Issue 进行讨论。
#BuiltOnClaudeCode
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。