Server data from the Official MCP Registry
Meta Ads MCP by ScaleForge — control Facebook & Instagram Ads via Graph API v24.0. 32 tools.
Meta Ads MCP by ScaleForge — control Facebook & Instagram Ads via Graph API v24.0. 32 tools.
Valid MCP server (2 strong, 1 medium validity signals). No known CVEs in dependencies. Package registry verified. Imported from the Official MCP Registry.
6 files analyzed · 1 issue found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: META_ACCESS_TOKEN
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-mike25app-scaleforge-mcp-meta-ads": {
"env": {
"META_ACCESS_TOKEN": "your-meta-access-token-here"
},
"args": [
"-y",
"@getscaleforge/mcp-meta-ads"
],
"command": "npx"
}
}
}From the project's GitHub README.
Control Facebook & Instagram Ads from Claude, ChatGPT, Cursor, or any MCP-compatible agent.
Direct Meta Graph API v24.0 wrapper. 32 tools. No backend required — just bring your own Meta access token.
Meta's Marketing API is powerful but punishing. Anyone who's tried to automate Meta Ads has run into these five walls:
User request limit reached halfway through a launch and leaves campaigns in a half-configured state. Meta's per-account budget of calls resets over 5 minutes, but nothing in the API tells you that without context.(#190) Error validating access token.instagram_actor_id → instagram_user_id, degrees_of_freedom_spec is gone entirely, asset_feed_id has been deprecated since v3.1. Copy-pasted sample code from Stack Overflow breaks silently.Image Not Found on the second account. Video IDs are global, but image hashes are not. This trips up 100% of first-time multi-account automations.This MCP is a thin, typed wrapper over Meta's Graph API with those five pains baked out:
pause_campaigns_batch, activate_campaigns_batch, update_bids_batch) — up to 50 ops per HTTP request, chunked automatically. Sidesteps rate-limit code #17 for bulk work.get_pbia) — when a Page has no linked Instagram account, the MCP creates a Page-Backed Instagram Account on demand so IG placements work.No ScaleForge backend is in the chain. Your agent → this MCP → https://graph.facebook.com/v24.0/*. That's it.
Use the ScaleForge-hosted Streamable HTTP endpoint — zero install, nothing to run locally:
https://smithery.ai/server/kirichyk-misha/meta-ads (one-click install for Claude Desktop, Cursor, Windsurf, Continue, ChatGPT Desktop — Smithery prompts for your Meta token, writes the config).https://getscaleforge.com/mcp (MCP Streamable HTTP). Supply your token via Smithery session config or Authorization: Bearer <token> header.Prefer a local npm install? Use the stdio package below.
npx -y @smithery/cli install @getscaleforge/mcp-meta-ads --client claude
# also: --client cursor | --client windsurf | --client continue
Smithery will prompt you for the Meta access token and write the config file.
claude mcp add scaleforge \
--env META_ACCESS_TOKEN=YOUR_TOKEN \
-- npx -y @getscaleforge/mcp-meta-ads
Verify with claude mcp list.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS (or the Windows / Linux equivalent — Claude Desktop creates it if missing):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@getscaleforge/mcp-meta-ads"],
"env": {
"META_ACCESS_TOKEN": "YOUR_TOKEN_HERE"
}
}
}
}
Restart Claude Desktop. The 32 tools appear under the hammer icon.
Create .cursor/mcp.json in your project (or ~/.cursor/mcp.json globally):
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@getscaleforge/mcp-meta-ads"],
"env": { "META_ACCESS_TOKEN": "YOUR_TOKEN_HERE" }
}
}
}
META_ACCESS_TOKEN=YOUR_TOKEN npx -y @getscaleforge/mcp-meta-ads
The server starts on stdio. Poke it interactively with @modelcontextprotocol/inspector:
npx -y @modelcontextprotocol/inspector \
env META_ACCESS_TOKEN=YOUR_TOKEN npx -y @getscaleforge/mcp-meta-ads
┌──────────────┐ MCP stdio ┌───────────────────┐ HTTPS + OAuth token ┌──────────────────────┐
│ Claude / GPT │ ◄────────────────────► │ mcp-meta-ads │ ◄───────────────────────► │ Meta Graph API v24 │
│ Cursor │ JSON-RPC over stdio │ (this package) │ graph.facebook.com │ Marketing API │
│ ChatGPT Desk │ │ │ │ │
└──────────────┘ └───────────────────┘ └──────────────────────┘
The MCP is a thin, typed translation layer. It does not cache, does not proxy, does not phone home. Every call goes from your machine straight to Meta's servers with your token.
You need an access token with ads_management, ads_read, business_management, and (for Page-scoped work like PBIA provisioning) pages_read_engagement + pages_manage_ads.
There are two kinds of tokens. Pick based on your use case.
Good for: trying the MCP, quick experiments, one-off scripts.
ads_management, ads_read, business_management, pages_read_engagement, pages_manage_ads.META_ACCESS_TOKEN.The token expires in ~2 hours. When it dies, the MCP will return an enhanced error pointing you here.
Good for: production, scheduled jobs, anything you don't want to re-auth every 2 hours.
You generate a System User token inside Meta Business Manager. System User tokens have no expiry and can be scoped to specific assets (ad accounts + Pages). This is the same token type ScaleForge and every production Meta integration uses.
mcp-meta-ads) → role Admin.
[screenshot: Business Settings → Users → System Users tab with "Add" button]ads_managementads_readbusiness_managementpages_read_engagementpages_manage_adsread_insights (optional — needed for some insight breakdowns)
[screenshot: Generate Token dialog with scopes checklist]Now use it:
META_ACCESS_TOKEN=EAAB...your-token... npx -y @getscaleforge/mcp-meta-ads
If you revoke or regenerate later, the old token stops working immediately.
| Meta pain point | How this MCP handles it |
|---|---|
| Rate limit code #17 in bulk ops | pause_campaigns_batch, activate_campaigns_batch, update_bids_batch use Meta Batch API (up to 50 ops/request) with auto-chunking and a 2s gap between chunks. |
| 250-ads-per-Page silent cap | get_ads_volume + automatic pre-flight check inside activate_campaigns_batch — warnings come back in the response before Meta starts any review. |
| Token-expired errors | enhanceMetaError detects codes 190 / 102 / 104 / 463 / 467 and returns a message pointing to the stable-token setup. |
| Instagram placements without IG login | get_pbia auto-creates a Page-Backed Instagram Account and returns the instagram_user_id for your object_story_spec. |
| v22 deprecations | Uses instagram_user_id, no degrees_of_freedom_spec, no asset_feed_id. |
| Image hash scoping | Documented on upload_image + create_ad_creative — hashes are per-account, you must re-upload to each target account. (Cached per-account caching logic lives in ScaleForge's backend and will be added here in a later release.) |
32 tools across 10 categories.
| Name | Purpose |
|---|---|
list_ad_accounts | List Ad Accounts accessible to the token |
get_ad_account | Detailed info for one account (status, spend cap, balance) |
get_ads_volume | Per-Page running-ads count + limit + remaining slots (pre-flight check) |
| Name | Purpose |
|---|---|
list_campaigns | Paginated campaign list |
get_campaign | Single campaign by ID |
create_campaign | WRITE — create new campaign (defaults to PAUSED) |
update_campaign | WRITE — update any mutable field |
delete_campaign | WRITE — hard delete |
| Name | Purpose |
|---|---|
list_adsets | List by ad_account_id OR campaign_id |
get_adset | Single ad set by ID |
create_adset | WRITE — create ad set under a campaign |
update_adset | WRITE — update targeting, bid, budget, status |
delete_adset | WRITE — hard delete |
| Name | Purpose |
|---|---|
list_ads | List by ad_account_id, adset_id, or campaign_id |
get_ad | Single ad by ID (incl. creative + issues + preview link) |
update_ad | WRITE — update name, status, swap creative |
delete_ad | WRITE — hard delete |
| Name | Purpose |
|---|---|
list_creatives | List all creatives in an ad account |
get_creative | Single creative by ID |
create_ad_creative | WRITE — single-text creative via object_story_spec |
create_ad_creative_with_asset_feed | WRITE — dynamic/multi-text creative via asset_feed_spec |
| Name | Purpose |
|---|---|
upload_video | WRITE — upload video via remote URL (returns video_id) |
upload_image | WRITE — upload image via remote URL (returns image_hash, scoped to account) |
| Name | Purpose |
|---|---|
get_campaign_insights | Metrics at campaign level with breakdowns |
get_adset_insights | Metrics at ad set level |
get_ad_insights | Metrics at ad level (compare creatives) |
| Name | Purpose |
|---|---|
pause_campaigns_batch | WRITE (BULK) — pause many campaigns via Batch API |
activate_campaigns_batch | WRITE (BULK) — activate many + pre-flight ads_volume check |
update_bids_batch | WRITE (BULK) — update bid_amount on many ad sets |
| Name | Purpose |
|---|---|
list_pages | Facebook Pages the token can manage |
get_pbia | Get or auto-create a Page-Backed Instagram Account |
| Name | Purpose |
|---|---|
search_ads_library | Public Meta Ad Library search for competitive research |
Once the server is connected, try these in your agent.
1234567890, pull last_14d insights with breakdown by placement — which placement has the lowest CPL?"act_555 — any Page over 85% of its limit?"ABCD and show which ones have is_dynamic_creative=true."Write operations change live Meta Ads state — spend starts or stops immediately. A well-behaved agent (Claude, GPT-4) will show you the target list and ask "proceed?" before calling these.
111, 222, 333 — show me their names and current spend first, then pause."444 and 555. Run the ads_volume pre-flight first; if any Page is over 85%, abort and tell me which."6001 and 6002 to $4.50. Convert to cents for me."act_777 called 'Spring Promo Test', OUTCOME_LEADS objective, daily_budget 5000 cents, PAUSED."See Get a Meta Access Token above. Two options: quick 2-hour token (Graph API Explorer) or stable System User token (Business Manager, never expires).
You're using a User access token from the Graph API Explorer. Those expire in ~2 hours by design. For anything beyond experimentation, generate a System User token via Business Manager — those never expire. Full steps here.
Meta limits how many ads can be "running or in review" per Facebook Page — default 250 — and this limit is shared across every ad account using that Page. The get_ads_volume tool shows you how much headroom each Page has. activate_campaigns_batch calls it automatically as a pre-flight check.
Yes. MIT license, npm package is free. You pay Meta for ads as usual. There is no ScaleForge account or subscription needed to use this MCP.
Yes. This MCP is a standalone npm package — it talks straight to graph.facebook.com. No account anywhere.
Please do. PRs welcome at github.com/Mike25app/scaleforge-mcp-meta-ads. Each tool is a small file in src/tools/ — copy one of the existing files as a template.
Built and maintained by the ScaleForge team. If you need managed Meta access (System User provisioning, RedTrack integration, scheduled auto-rules, dashboards), check out the full platform — this MCP stays free and standalone regardless.
META_ACCESS_TOKEN env var — keep it in your agent host's secret store (Claude Desktop's env block, shell profile with 600 perms, 1Password, etc.).https://graph.facebook.com/v24.0/*.MIT — see LICENSE.
Be the first to review this server!
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.
by Microsoft · Content & Media
Convert files (PDF, Word, Excel, images, audio) to Markdown for LLM consumption