Daily account health check
Open Ads Manager, click into each campaign, hit Columns → Performance, screenshot the table, paste into a Slack thread. 25 minutes — every morning.
Campaigns, ad sets, ads, audiences, Conversions API, automated rules — 77 tools across 24 modules, deployed on your own Railway or Docker host.
I have heard of a ton of instances where someone set up a Meta MCP with Facebook and got banned. Even my AM confirmed this happening.
Open Ads Manager, click into each campaign, hit Columns → Performance, screenshot the table, paste into a Slack thread. 25 minutes — every morning.
Meta Ads MCP works with Claude Desktop, Claude Code, Cursor, Codex, Gemini, Windsurf, OpenClaw, and Hermes — any MCP-compatible AI client. Get it running in seconds.
Pre-configured environment, OAuth handled for you. No command-line work.
Install on ElasticFlow →Managed auth · No laptop setup.
Managed auth
Copy a config snippet into your AI client and restart.
{
"mcpServers": {
"meta-mcp": {
"command": "npx",
"args": [
"mcp-remote",
"${META_MCP_URL}",
"--header",
"Authorization: Bearer ${MCP_API_KEY}",
"--header",
"X-Meta-Token: ${META_ACCESS_TOKEN}"
]
}
}
}Recommended setup: meta-mcp runs on your own Railway or Docker host, Claude Code connects via mcp-remote.
Go to developers.facebook.com → My Apps → Create App. Pick the 'Business' app type. You'll need this app to mint a System User access token in the next step.
Business Suite → Settings → Users → System Users. Create a System User, assign it to your ad account with Admin role, then generate a long-lived token. Grant ads_management and ads_read at minimum.
In your .env file: META_ACCESS_TOKEN=<your system user token>, META_AD_ACCOUNT_ID=act_123456789 (fallback default), MCP_API_KEY=<strong random string> (gates the MCP server itself).
Local: npm install && npm run build && npm start. Cloud: fork the repo, connect to Railway, paste the env vars, deploy. Server starts on http://localhost:3000 or your Railway URL — verify /health returns status:ok.
Paste the .mcp.json block from the install section. The X-Meta-Token header passes your Meta token per session — no shared workspace bot token, scoped per user.
| Scope | Why this MCP needs it |
|---|---|
ads_management | Required — create, modify, and pause your campaigns, ad sets, and ads. |
ads_read | Required — read campaign performance, insights, and account structure. |
pages_read_engagement | Optional — needed only when promoting existing Facebook Page posts as ads. |
leads_retrieval | Optional — needed only when pulling Lead Generation form submissions. |
~7 min first time
OTHER · v1.0.0 · released today
Show me yesterday's ROAS and spend for active campaigns across all my accounts, sorted by overspend.
Yesterday's account health
12 active campaigns across 3 accounts. 4 overspent vs. daily cap by >15%. Worst: ZestPro Q4 Sale — $312 over, ROAS dropped from 2.4 to 1.1.
Data fetched live from Meta Insights via get_insights + get_account_insights.
operator-reported time on a similar daily review flow
Ads Manager doesn't let you select 15 ad sets across 3 campaigns and pause in one click. You do it one by one, hoping you don't miss one.
Pause every ad set where 7-day CPC is above $3 and frequency is over 4.
Bulk pause: 8 ad sets across 3 campaigns
8 ad sets matched the rule. Paused: AS_103, AS_119, AS_201, AS_204, AS_207, AS_312, AS_318, AS_341. Combined daily budget freed: $640.
Uses batch_request — up to 50 Graph API sub-requests per call.
batch API caps at 50 sub-requests
You write the brief in Notion, open Ads Manager, create the campaign, then each ad set, then each ad, then upload or attach the IG creative. 45-60 min per launch.
Launch a Spring Sale campaign: $50/day, target US 25-45 interested in shopping, use my @brand IG Reel from yesterday.
Campaign Spring Sale created
Campaign + 1 ad set + 1 ad live. Targeting: US, 25-45, Online Shopping interest. Creative: source_instagram_media_id 17841412345. Daily cap: $50.
Used create_campaign + create_adset + create_creative + create_ad in sequence.
create_creative accepts source_instagram_media_id natively
Pull insights for each of your 12 client accounts, copy to a Google Sheet, build the WoW comparison. 2 hours every Monday.
Give me WoW spend, CPA, and ROAS for all client accounts. Flag any account where CPA grew >20% WoW.
Weekly client snapshot — 12 accounts
9 accounts steady. 3 flagged: Acme (CPA +34%), Helios (CPA +27%), Nymph (CPA +22%). Total spend $48,210 (-6% WoW). Avg ROAS 3.2.
batch_request fan-out across accounts; get_account_insights with date_preset=last_7d + last_14d.
batch API + native pagination through all accounts
tools across 24 modules
README v1.0.0 — full Meta Marketing API surface
max sub-requests per batch API call
README — Batch Operations
minimum delay between Meta API requests
README — BUC-based adaptive rate limiting
Meta Graph API version (configurable)
README — Configuration Reference
session TTL — token cached per session
README — Enterprise-Ready
All 77 tools cover the full Meta Marketing API surface. These 18 are the ones daily Meta operators reach for first — grouped by job, not by API namespace.
Full CRUD across the campaign tree, plus time-based budget schedules.
Filter by status, objective, or date range. Returns id, name, daily/lifetime budget, objective, bid strategy.
Create with objective (OUTCOME_SALES, OUTCOME_TRAFFIC, etc.), budget, bid strategy, and special_ad_categories.
Clones campaign + ad sets + ads — A/B variants without rebuilding from scratch.
list_campaigns · create_campaign · copy_campaign
Self-hosted means you control the deployment — your Meta access token never touches a third-party SaaS. The bans operators report came from MCPs that proxy through shared infrastructure or that violate rate limits. meta-mcp runs on your Railway or Docker host with BUC-aware adaptive throttling (200 ms minimum delay; backs off at 75% utilization) and uses your own System User token. That's the same setup pattern as a directly-integrated internal tool — not flagged.
— Eric Carlson on X — 'ton of instances where someone got banned'Pass limit=100 to get_ad_accounts, or use the after cursor to walk every page. The 25-cap problem is documented in competing MCPs (brijr/meta-mcp#17 from a System User with 40+ accounts; brijr/meta-mcp#2 from someone with 100+). meta-mcp forwards pagination params directly to Graph API so you reach the long tail.
— Rafael de Sá — agency operator with 40+ accountsYes — create_creative accepts source_instagram_media_id at the top level, the field Meta's Marketing API requires for promoting IG Reels/Feed/Stories. This is the workflow that breaks in MCPs that only accept object_story_id (Facebook page posts) and forces a fall-back to Ads Manager.
— Igor Andrade — Instagram-post-as-ad use caseNo. It's an open-source, ISC-licensed community implementation by Serkan Haşlak. Meta launched its own official Meta Ads MCP on April 29, 2026 with 29 tools. meta-mcp covers 77 tools across 24 modules — the longer tail of the Meta Marketing API: budget schedules, automated rules, custom conversions, batch API, lead-gen forms. Pick the official MCP for read-only basics; pick meta-mcp when you need the full surface.
Required: ads_management (create/modify campaigns) and ads_read (pull insights). Optional: pages_read_engagement (promote existing Facebook Page posts as ads) and leads_retrieval (read Lead Gen form submissions). Generate a System User token with these scopes once and store it in your .env.
Yes — set APP_SECRET in your .env and the server signs each Graph API call with HMAC-SHA256(app_secret, access_token). This is required when your Meta App has 'Require App Secret Proof' enabled in App Settings → Advanced. Most production-ready Meta apps need it.
— Thomas Witt — appsecret_proof workaround on a competing MCPInitial public release. 77 tools across 24 modules. Dual MCP/REST interface. BUC-based adaptive rate limiting. Docker + Railway deployment. Conversions API + Pixel + Lead Gen forms + budget schedules + automated rules.