使用说明
元广告MCP服务器
Cloudflare Workers MCP服务器,用于Meta Ads帐户设置、活动管理、广告集、创意、受众、报告和批处理工作流。
此回购基于 xmcp 并公开了一个可流式传输的HTTP MCP端点以及面向浏览器的Meta OAuth路由。
开源/自托管
此存储库旨在使用您自己的Meta应用程序凭据部署在您自己的Cloudflare帐户中。
它不附带:
- 托管控制平面
- 一个共享的Meta应用
- 内置的终端用户仪表板
- 为您的用户和工作区提供JWT发行器
你带来:
- 您的Cloudflare Worker部署
- 你的Meta开发者应用
- 您的JWT发行者或身份验证提供者
- 您自己的UI或后端启动OAuth流
它的作用
- 以Cloudflare Worker身份运行
- 使用直接的Meta Graph API
fetch调用而不是Meta SDK - 在D1中存储每个工作区的元用户连接
- 在KV中存储短期OAuth状态
- 加密存储的Meta访问令牌
- 使用您的应用程序发布的JWT保护MCP请求
端点
GET /healthGET /appPOST /mcpGET /oauth/meta/startGET /oauth/meta/callback
身份验证模型
此服务器是多租户服务器。每个MCP请求都必须包含您的应用程序发出的承载JWT。
如果你将这个项目开源,重要的含义是消费者必须将其连接到自己的身份验证系统中。没有JWT,服务器不知道如何识别用户或工作区。
所需JWT索赔:
sub或userIdworkspaceId- 可选的
roles
有效载荷示例:
{
"sub": "user_123",
"workspaceId": "workspace_abc",
"roles": ["admin"]
}
为什么 /oauth/meta/start 不是通用公共链接:
- 服务器必须知道元帐户应附加到哪个工作区
- 工作空间上下文来自JWT
- 没有它,服务器就无法安全地绑定生成的Meta令牌
刀具表面
已实施的工具系列:
- 帐户和设置
- 活动管理
- 广告集管理
- 创意和广告
- 受众和目标
- 报告和见解
- 批处理助手
服务器当前注册了39个工具。
项目布局
src/tools按域分组的工具定义src/libauth、存储、OAuth、运行时和Meta客户端帮助程序src/services域特定元服务逻辑src/middleware.tsOAuth路由和MCP JWT认证cloudflare-entry.mjsCloudflare特定路由拦截的Worker包装器条目schema.sqlD1架构test单位和合同风格测试
本地开发
安装依赖项:
pnpm install
运行本地dev:
pnpm dev
有用的脚本:
pnpm build
pnpm test
pnpm deploy
Cloudflare绑定
所需绑定:
- D1数据库绑定为
META_DB - KV命名空间绑定为
META_OAUTH_STATE
所需机密:
JWT_SECRET或JWT_JWKS_URLMETA_APP_IDMETA_APP_SECRETMETA_TOKEN_ENCRYPTION_KEYAPP_UI_PASSWORD对于内置管理页面,请访问/app
可选配置:
JWT_ISSUERJWT_AUDIENCEAPP_SESSION_SECRETAPP_UI_WORKSPACE_IDAPP_UI_USER_IDMETA_REDIRECT_URIMETA_GRAPH_VERSIONMETA_OAUTH_SCOPESMETA_OAUTH_ALLOWED_RETURN_ORIGINS
默认值:
META_GRAPH_VERSION=v25.0META_OAUTH_SCOPES=ads_management,business_managementAPP_UI_WORKSPACE_ID=workspace_adminAPP_UI_USER_ID=app_admin
内置管理UI
Worker现在包括一个小型浏览器UI,位于 /app.
它的作用:
- 提示输入管理员密码
- 启动现有的Meta OAuth流,而不需要您手动创建承载JWT
- 显示管理员工作区是否连接了Meta帐户
- 使用与相同的服务逻辑加载可访问的广告帐户
get_ad_accounts
所需设置:
- 集
APP_UI_PASSWORD关于工人。 - 确保
META_REDIRECT_URI匹配您的公共主机,例如:
https://meta-mcp.gestalt.xyz/oauth/meta/callback
- 打开:
https://meta-mcp.gestalt.xyz/app
元应用程序设置
在Meta应用程序中:
- 添加营销API产品。
- 添加网站平台。
- 将网站平台URL设置为您的Worker来源。
- 集
App Domains转到您的Worker域。 - 将回调URL设置为:
https://<your-worker-host>/oauth/meta/callback
如果你的应用程序使用 Facebook Login 或 Facebook Login for Business,还将该确切的回调URL添加到产品特定的重定向URI设置中。
对于部署在上的Worker workers.dev,这些字段通常需要与Worker主机完全匹配。
数据库
应用D1模式:
pnpm wrangler d1 execute META_DB --remote --file schema.sql -y
桌子:
meta_connectionsmeta_ad_accounts_cache
部署
部署Worker:
pnpm deploy
部署后:
- 注意公共Worker URL
- 集
META_REDIRECT_URI到https://<your-worker-host>/oauth/meta/callback - 在Meta应用程序设置中更新相同的回调
如果您计划在另一个源上使用单独的前端或仪表板,请允许该源进行OAuth后浏览器重定向:
META_OAUTH_ALLOWED_RETURN_ORIGINS=https://your-ui.example.com,http://localhost:3000
在生产中使用您真正的前端来源。
手动测试流程
1.生成一个短暂的JWT
使用您的应用程序用于Worker的相同JWT密钥。
export JWT_SECRET="YOUR_JWT_SECRET"
TOKEN=$(node --input-type=module <<'NODE'
import { SignJWT } from 'jose';
const secret = new TextEncoder().encode(process.env.JWT_SECRET);
const token = await new SignJWT({ workspaceId: 'workspace_test', roles: ['admin'] })
.setProtectedHeader({ alg: 'HS256' })
.setSubject('user_test')
.setIssuedAt()
.setExpirationTime('10m')
.sign(secret);
console.log(token);
NODE
)
2.启动Meta OAuth
curl -i \
-H "Authorization: Bearer $TOKEN" \
"https://<your-worker-host>/oauth/meta/start?workspace_id=workspace_test"
复制 Location 进入浏览器并完成Meta登录流程。
预期成功页面:
Meta account connected.
3.初始化MCP
curl -s https://<your-worker-host>/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":"init-1","method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"manual-test","version":"1.0.0"}}}'
4.列出工具
curl -s https://<your-worker-host>/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":"tools-1","method":"tools/list","params":{}}'
5.调用真正的工具
OAuth成功后,这应该返回该工作区的可访问广告帐户:
curl -s https://<your-worker-host>/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":"call-1","method":"tools/call","params":{"name":"get_ad_accounts","arguments":{}}}'
如果您遇到连接/重新连接错误,OAuth流和MCP调用将使用不同的 workspaceId 价值观。
备注
- 云耀
workers.dev在Meta应用程序设置中,域可能需要额外的关注。 - Worker入口点在委托给生成的XMCP Worker之前显式拦截OAuth路由。
- Cloudflare Worker构建路径与本地路径不同
xmcp dev,因此请务必在OAuth相关更改后验证部署的路由。