使用说明
元广告MCP服务器
A Model Context Protocol server for the Meta (Facebook) Ads API, written in TypeScript.
54 tools — 35 read tools (always on) plus 19 opt-in write/lifecycle tools — covering ad accounts, campaigns, ad sets, ads, creatives, media, insights, targeting catalog, Facebook Pages, budget schedules, and activity logs via the Meta Graph API v22.0.
Works with Cursor, Claude Desktop (stdio) and Claude.ai custom connectors (HTTP).
免责声明: 这是一个非官方的第三方工具,与Meta没有任何关联、认可或附属关系。该项目独立维护,并根据Meta的公共API使用 服务条款.Meta、Facebook、Instagram和其他Meta品牌名称是其各自所有者的商标。
目录
特性
| 类别 | 它的作用 |
|---|---|
| 账户 | 列出广告帐户,获取帐户详细信息 |
| 活动 | 获取/列出/创建/更新/暂停/恢复/删除 |
| 广告集 | 获取/列出/批量获取/创建/更新/暂停/恢复/删除 |
| 广告 | 获取/列出/创建/更新/暂停/恢复/删除 |
| 创意作品 | 获取/列出、创建+更新、计算图像裁剪 |
| 媒体 | 列出广告图片、上传图片、按哈希查找、获取广告预览和视频 |
| 洞察 | 帐户、活动、广告集和广告级别的性能分析 |
| 定向 | 搜索兴趣/行为/人口统计/地理、受众规模估计 |
| 页面 | 列出可从令牌访问的Facebook页面,按名称搜索 |
| 预算明细表 | 在一段时间内安排临时预算波动 |
| 活动 | 更改广告帐户和广告集的历史日志 |
| 分页 | 获取后续结果页面的实用工具 |
所有突变工具(创建/更新/删除/暂停/恢复/上传/预算计划) 默认情况下关闭 只有当你选择加入时才能注册——请参阅 启用写入工具.
需求
- Node.js >= 18
- A. 元用户访问令牌 对您计划做的事情拥有正确的权限——见下文。
安装
# From npm
npx meta-ads-mcp-server --access-token YOUR_META_ACCESS_TOKEN
# From source
git clone https://github.com/hashcott/meta-ads-mcp.git
cd meta-ads-mcp
npm install
npm run build
node dist/index.js --access-token YOUR_META_ACCESS_TOKEN
获取元访问令牌
此服务器使用 元营销API。您需要将具有正确权限的访问令牌附加到Meta App。
快速选项-图形API资源管理器(只读实验)
- 打开 图形API资源管理器.
- 从右上角的下拉列表中选择您的Meta App(在 developers.facebook.com/apps 如果你没有,请选择“商务”类型)。
- 点击 生成访问令牌,然后在 权限 至少添加:
ads_read--对于所有的阅读工具。ads_management--任何编写工具(创建/更新/删除/暂停/恢复/上传/预算计划)都需要。business_management--如果您通过Business Manager操作,建议使用。pages_show_list,pages_read_engagement--Pages工具所必需的。
- 复制生成的令牌。 这是一个短暂的令牌(约1小时) --适合测试。
生产选项——长期用户令牌
Explorer中的短期令牌将在大约一小时后过期。将您的代币兑换成60天代币:
curl -G "https://graph.facebook.com/v22.0/oauth/access_token" \
--data-urlencode "grant_type=fb_exchange_token" \
--data-urlencode "client_id=YOUR_APP_ID" \
--data-urlencode "client_secret=YOUR_APP_SECRET" \
--data-urlencode "fb_exchange_token=YOUR_SHORT_LIVED_TOKEN"
响应包含 "access_token": "..." --该令牌的有效期约为60天。在它过期之前以同样的方式刷新它,或者如果你需要永久访问权限,可以构建一个完整的OAuth流。
生产选项——系统用户令牌(建议用于服务器)
对于无人值守的生产使用(无过期),生成 系统用户 Business Manager中的令牌:
- 首选 业务经理→ 业务设置→ 用户→ 系统用户.
- 创建系统用户(或使用现有用户),分配相关广告帐户,并授予
ads_read/ads_management. - 点击 生成新令牌 → 选择你的元应用→ 选择相同的权限→ 从不 过期。
系统用户令牌不会过期,非常适合后端部署。
验证您的令牌
curl "https://graph.facebook.com/v22.0/me?access_token=YOUR_TOKEN"
应返回您的用户/系统用户对象。如果返回错误,请仔细检查权限,并确保令牌未过期。
认证
使用以下任一方法传递您的Meta访问令牌:
CLI参数(建议用于Cursor/Claude Desktop):
node dist/index.js --access-token YOUR_META_ACCESS_TOKEN
环境变量:
export META_ADS_ACCESS_TOKEN=YOUR_META_ACCESS_TOKEN
node dist/index.js
令牌仅保存在正在运行的进程的内存中,此服务器从不将其写入磁盘。
启用写入工具
默认情况下,服务器会注册 只有35个阅读工具 --创建/更新/删除/暂停/恢复/上传/预算计划工具 未暴露.这是故意的:一个错误的发布 meta_ads_delete_campaign 可以永久删除广告系列及其广告。
要选择加入,请设置:
META_ADS_ENABLE_WRITE_TOOLS=true
公认的真理价值观: true, 1, yes, on 不区分大小写其他任何(或未设置的)都会导致核销。
启用后,服务器在启动时向stderr记录一行警告:
[meta-ads-mcp] WARNING: META_ADS_ENABLE_WRITE_TOOLS is on — create/update/delete/pause/resume tools are EXPOSED. These can permanently delete campaigns/ad sets/ads or change live delivery.
您的访问令牌还需要 ads_management 允许写入成功。
启用写入的Cursor/Claude桌面配置示例:
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server"],
"env": {
"META_ADS_ACCESS_TOKEN": "YOUR_META_ACCESS_TOKEN",
"META_ADS_ENABLE_WRITE_TOOLS": "true"
}
}
}
}
运输方式
| 模式 | 用例 | 如何启用 |
|---|---|---|
stdio (默认) |
光标、克劳德桌面、本地工具 | 无需配置 |
http |
Claude.ai远程连接器,多客户端设置 | 设置 TRANSPORT=http |
光标/克劳德桌面设置
将以下内容之一添加到MCP客户端配置文件中:
通过npx(推荐--无需本地安装):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server", "--access-token", "YOUR_META_ACCESS_TOKEN"]
}
}
}
通过本地构建:
{
"mcpServers": {
"meta-ads": {
"command": "node",
"args": ["/path/to/meta-ads-mcp/dist/index.js", "--access-token", "YOUR_META_ACCESS_TOKEN"]
}
}
}
通过环境变量(和选择加入写入):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "meta-ads-mcp-server"],
"env": {
"META_ADS_ACCESS_TOKEN": "YOUR_META_ACCESS_TOKEN",
"META_ADS_ENABLE_WRITE_TOOLS": "true"
}
}
}
}
远程HTTP服务器
作为持久HTTP服务器运行,用于Claude.ai自定义连接器或任何远程MCP客户端。
# Start on default port 3000
TRANSPORT=http META_ADS_ACCESS_TOKEN=YOUR_TOKEN node dist/index.js
# Start on a custom port, writes enabled
TRANSPORT=http \
META_ADS_ACCESS_TOKEN=YOUR_TOKEN \
META_ADS_ENABLE_WRITE_TOOLS=true \
PORT=8080 \
node dist/index.js
终点:
POST /mcp--MCP协议端点GET /health--健康检查({"status":"ok"})
添加到Claude.ai
- 首选 设置→ 连接器→ 添加自定义连接器
- 请输入您的服务器URL:
https://your-domain.com/mcp - 点击 添加
使用ngrok进行本地测试
# Terminal 1 — start the server
TRANSPORT=http META_ADS_ACCESS_TOKEN=YOUR_TOKEN PORT=8080 node dist/index.js
# Terminal 2 — expose publicly
ngrok http 8080
使用生成的HTTPS URL(例如。 https://xxxx.ngrok-free.app/mcp)作为您的连接器URL。
部署到云平台
在您的托管服务提供商(Railway、Render、Fly.io等)上设置以下环境变量:
| 变量 | 值 |
|---|---|
TRANSPORT |
http |
META_ADS_ACCESS_TOKEN |
您的Meta访问令牌 |
META_ADS_ENABLE_WRITE_TOOLS |
true 还公开变异工具(默认情况下为关闭) |
PORT |
由平台自动分配 |
可用工具
传说:🔍 阅读•✏️ 写(由 META_ADS_ENABLE_WRITE_TOOLS) • 🛠️ 纯实用程序(无API调用)。
账户
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_list_ad_accounts |
🔍 | 列出所有可使用您的令牌访问的广告帐户 |
meta_ads_get_ad_account_details |
🔍 | 获取特定广告帐户的详细信息 |
活动
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_get_campaign_by_id |
🔍 | 按ID获取特定活动 |
meta_ads_get_campaigns_by_adaccount |
🔍 | 列出广告帐户中的广告系列,包括过滤器和分页 |
meta_ads_create_campaign |
✏️ | 创建新的ODAX活动(CBO或ABO) |
meta_ads_update_campaign |
✏️ | 更新名称/状态/预算/出价;支持CBO→ ABO移民 adset_budgets |
meta_ads_delete_campaign |
✏️ | 永久删除广告系列及其广告集/广告 |
meta_ads_pause_campaign |
✏️ | 便利性:将状态设置为 PAUSED |
meta_ads_resume_campaign |
✏️ | 便利性:将状态设置为 ACTIVE |
meta_ads_create_campaign 输入:
act_id(字符串) --广告帐户ID,格式act_XXXXXXXXX.name(字符串) --活动名称。objective(枚举) --ODAX基于结果的目标:OUTCOME_AWARENESS,OUTCOME_TRAFFIC,OUTCOME_ENGAGEMENT,OUTCOME_LEADS,OUTCOME_SALES,OUTCOME_APP_PROMOTION.- 遗留目标(
BRAND_AWARENESS,LINK_CLICKS,CONVERSIONS,APP_INSTALLS,…) 不 Meta v22+已接受,并将返回HTTP 400。
status(默认值PAUSED),special_ad_categories(默认值[])daily_budget/lifetime_budget(美分) --在以下情况下省略两者use_adset_level_budgets=true.bid_strategy—LOWEST_COST_WITHOUT_CAP(默认),LOWEST_COST_WITH_BID_CAP,COST_CAP,LOWEST_COST_WITH_MIN_ROAS.投标上限策略要求bid_amount在每个儿童广告集上。bid_cap,spend_cap,campaign_budget_optimization,use_adset_level_budgets,ab_test_control_setups,buying_type.
{
"act_id": "act_123456789012345",
"name": "2026 - Spring Sale - Awareness",
"objective": "OUTCOME_AWARENESS",
"special_ad_categories": [],
"status": "PAUSED",
"bid_strategy": "LOWEST_COST_WITHOUT_CAP",
"daily_budget": 10000
}
广告集
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_get_adset_by_id |
🔍 | 按ID获取单个广告集 |
meta_ads_get_adsets_by_ids |
🔍 | 批量获取多个广告集 |
meta_ads_get_adsets_by_adaccount |
🔍 | 在广告帐户中列出广告集 |
meta_ads_get_adsets_by_campaign |
🔍 | 在广告系列中列出广告集 |
meta_ads_create_adset |
✏️ | 在活动下创建新的广告集 |
meta_ads_update_adset |
✏️ | 更新广告集的字段(注意: frequency_control_specs 创建后不可变) |
meta_ads_delete_adset |
✏️ | 永久删除广告集 |
meta_ads_pause_adset |
✏️ | 将状态设置为 PAUSED |
meta_ads_resume_adset |
✏️ | 将状态设置为 ACTIVE |
meta_ads_create_adset 亮点:
- 必修的:
act_id,campaign_id,name,optimization_goal,billing_event. targeting(对象) --完整的目标规格;记住targeting_automation.advantage_audience默认为0在Meta v24+上--如果您想要Advantage+Audience,请显式设置它。bid_amount--需要LOWEST_COST_WITH_BID_CAP/COST_CAP.bid_constraints--需要LOWEST_COST_WITH_MIN_ROAS例如。,{"roas_average_floor": 20000}2.0×ROAS地板。dsa_beneficiary/dsa_payor--欧盟定向广告集所需。promoted_object--需要APP_INSTALLS.frequency_control_specs--必须在创建时设置;Meta使其在之后不可变。regional_regulated_categories/regional_regulation_identities-台湾/澳大利亚/新加坡/印度监管的垂直市场。
广告
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_get_ad_by_id |
🔍 | 按ID获取单个广告 |
meta_ads_get_ads_by_adaccount |
🔍 | 在广告帐户中列出广告 |
meta_ads_get_ads_by_campaign |
🔍 | 在广告系列中列出广告 |
meta_ads_get_ads_by_adset |
🔍 | 在广告集中列出广告 |
meta_ads_create_ad |
✏️ | 创建引用现有创意的新广告 |
meta_ads_update_ad |
✏️ | 更新名称/状态/出价/跟踪规格/创意参考 |
meta_ads_delete_ad |
✏️ | 永久删除广告 |
meta_ads_pause_ad |
✏️ | 将状态设置为 PAUSED |
meta_ads_resume_ad |
✏️ | 将状态设置为 ACTIVE |
ℹ️ 交换
creative_id在FLEX上,广告可能会失败error_subcode 3858355如果新创意asset_feed_spec图像与其不匹配object_story_spec在这种情况下,用新创意创建一个新广告,暂停旧广告(你失去了社会认同,但广告仍在运行)。
创意作品
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_get_ad_creative_by_id |
🔍 | 取一个创意 |
meta_ads_get_ad_creatives_by_ad_id |
🔍 | 列出广告附带的创意 |
meta_ads_get_adcreatives_by_adaccount |
🔍 | 在广告帐户中列出创意 |
meta_ads_compute_image_crops |
🛠️ | 计算6元概念长宽比的居中裁剪框(无API调用) |
meta_ads_create_ad_creative |
✏️ | 创造创意——3种简单模式加上完整模式 object_story_spec 逃生舱 |
meta_ads_update_ad_creative |
✏️ | 更新 name / asset_feed_spec (Meta限制了大多数其他内容更新) |
meta_ads_create_ad_creative --三种常见模式:
- 提升现有职位:仅通过
object_story_id以...形式{page_id}_{post_id}. - 单幅图片链接广告:
page_id+image_hash+link_url+message+可选headline,description,call_to_action_type. - 单视频广告:
page_id+video_id+link_url+message+可选headline,call_to_action_type,thumbnail_url.
对于高级布局(FLEX/DOF、布局资产定制、动态创意、多标题、潜在客户表单、品牌内容、图像裁剪),通过一个完整的组合 object_story_spec 和 asset_feed_spec --这些优先于简单模式自动构造。
媒体
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_get_ad_images |
🔍 | 列出广告帐户中的图像资产 |
meta_ads_get_image_by_hash |
🔍 | 按哈希值查找单幅图像(URL+维度) |
meta_ads_get_ad_previews |
🔍 | 跨广告位生成广告的渲染预览 |
meta_ads_get_ad_video |
🔍 | 视频详细信息(源URL、缩略图、长度)按 ad_id 或 video_id |
meta_ads_upload_ad_image |
✏️ | 将图像上传到帐户的广告图像库并取回其 image_hash |
meta_ads_upload_ad_image 接受 正好一个 关于:
file--数据URL(data:image/png;base64,iVBORw0KG...)或者一个原始的base64字符串。image_url--公共URL;服务器下载字节并上传。
返回 image_hash 然后,您将转到 meta_ads_create_ad_creative.
洞察
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_get_adaccount_insights |
🔍 | 客户层面的绩效指标 |
meta_ads_get_campaign_insights |
🔍 | 特定活动的绩效指标 |
meta_ads_get_adset_insights |
🔍 | 特定广告集的性能指标 |
meta_ads_get_ad_insights |
🔍 | 特定广告的性能指标 |
所有四个都接受相同的选项表面: fields, date_preset, time_range, time_ranges, time_increment, level, action_attribution_windows, action_breakdowns, breakdowns, filtering, sort、分页和区域设置。
时间范围优先级: time_ranges > time_range > since/until > date_preset.
目标目录
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_search_interests |
🔍 | 按关键字搜索Meta的兴趣目录 |
meta_ads_get_interest_suggestions |
🔍 | 从种子列表中获取相关兴趣 |
meta_ads_search_behaviors |
🔍 | 列出可用的行为定位选项 |
meta_ads_search_demographics |
🔍 | 列出人口统计选项(人口统计/生活事件/行业/收入/家庭状态/用户设备/用户操作) |
meta_ads_search_geo_locations |
🔍 | 搜索国家/地区/城市/邮编/地理_市场/电子_限制 |
meta_ads_estimate_audience_size |
🔍 | 通过以下方式估算目标规格的覆盖范围 /act_X/delivery_estimate |
页面
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_get_account_pages |
🔍 | 列出可从访问令牌访问的Facebook页面(/me/accounts) |
meta_ads_search_pages_by_name |
🔍 | 在令牌页面上设置子字符串过滤器(客户端-Meta不公开服务器端名称过滤器) |
回归 page_id 值是你传递给的值 meta_ads_create_ad_creative.
预算明细表
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_create_budget_schedule |
✏️ | 在Unix时间戳窗口内为活动安排临时预算增加 |
输入:
campaign_id(字符串)budget_value(int,正)budget_value_type—ABSOLUTE(账户货币为美分)或MULTIPLIER(例如。,2预算翻倍)time_start,time_end(Unix时间戳(秒)) —time_end > time_start
活动
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_get_activities_by_adaccount |
🔍 | 检索广告帐户的更改历史记录日志 |
meta_ads_get_activities_by_adset |
🔍 | 检索广告集的更改历史日志 |
分页工具
| 工具 | 类型 | 描述 |
|---|---|---|
meta_ads_fetch_pagination_url |
🛠️ | 跟随 paging.next / paging.previous 来自任何其他工具响应的URL |
端到端:从头开始创建广告
典型的“构建新广告”工作流程使用跨多个类别的工具。随着 META_ADS_ENABLE_WRITE_TOOLS=true:
1. meta_ads_list_ad_accounts → pick an act_id
2. meta_ads_get_account_pages → pick a page_id
3. meta_ads_search_geo_locations(q="Vietnam") → grab the country/region keys
4. meta_ads_search_interests(q="cooking") → grab interest IDs
5. meta_ads_estimate_audience_size(act_id, targeting) → sanity-check reach
6. meta_ads_upload_ad_image(act_id, image_url) → returns image_hash
7. meta_ads_create_campaign(act_id, ...) → returns campaign_id
8. meta_ads_create_adset(act_id, campaign_id, targeting, ...) → returns adset_id
9. meta_ads_create_ad_creative(act_id, page_id, image_hash, link_url, message, ...) → returns creative_id
10. meta_ads_create_ad(act_id, name, adset_id, creative_id, status="PAUSED") → returns ad_id
11. (Optional) meta_ads_get_ad_previews(ad_id, ...) → render placements before going live
12. meta_ads_resume_ad(ad_id) → flip to ACTIVE when ready
所有更改状态的步骤默认为 status: "PAUSED" 因此,除非您明确调用简历工具,否则任何内容都不会上线。
分页
许多列表工具返回分页结果。当响应包含 paging.next URL,使用 meta_ads_fetch_pagination_url 要检索后续页面,请执行以下操作:
1. Call meta_ads_get_campaigns_by_adaccount → receive first page
2. Check if response.paging.next exists
3. Call meta_ads_fetch_pagination_url(url=response.paging.next) → receive next page
4. Repeat until paging.next is absent
发展
npm run dev # Watch mode — auto-recompile on change
npm run build # Compile TypeScript to dist/
npm run clean # Remove dist/
npm run clean && npm run build # Full rebuild from scratch
快速烟雾测试:
# Default (read-only)
META_ADS_ACCESS_TOKEN=dummy node dist/index.js
# → "Meta Ads MCP server running via stdio"
# With writes enabled
META_ADS_ACCESS_TOKEN=dummy META_ADS_ENABLE_WRITE_TOOLS=true node dist/index.js
# → WARNING line + "Meta Ads MCP server running via stdio"
项目结构
meta-ads-mcp/
├── src/
│ ├── index.ts # Entry point, server setup, transport selection, write-tools warning
│ ├── constants.ts # API version, base URLs, isWriteToolsEnabled() flag
│ ├── types.ts # Shared TypeScript interfaces
│ ├── services/
│ │ └── graph-api.ts # HTTP client (GET/POST/DELETE), auth, error handling, param builders
│ ├── schemas/
│ │ ├── common.ts # Shared Zod schemas (pagination, date ranges, filters)
│ │ └── insights.ts # Insights-specific Zod schemas
│ └── tools/
│ ├── accounts.ts # Account tools
│ ├── insights.ts # Insights tools (account/campaign/adset/ad level)
│ ├── campaigns.ts # Campaign read + write/lifecycle tools
│ ├── adsets.ts # Ad set read + write/lifecycle tools
│ ├── ads.ts # Ad read + write/lifecycle tools
│ ├── creatives.ts # Creative read tools, image crops utility, create/update creative
│ ├── media.ts # Image list / upload / hash lookup / video / preview
│ ├── activities.ts # Activity log tools
│ ├── pagination.ts # Pagination utility tool
│ ├── targeting.ts # Interest/behavior/demographic/geo search + audience-size estimate
│ ├── pages.ts # Facebook Pages list and name search
│ └── budget-schedules.ts # Campaign budget schedule create
├── dist/ # Compiled JavaScript output (generated)
├── package.json
└── tsconfig.json