Field note · 25 September 2026

Meta ads MCP: Claude builds the campaign, and nothing spends until you say go.

Our free, open-source MCP server, safe-meta-ads-mcp, lets Claude or any other MCP client read your Meta ad accounts and build campaigns, ad sets, creatives and ads through Meta's official Marketing API. Everything it creates starts paused, turning anything on needs you to type the exact phrase ACTIVATE AND ALLOW SPEND, and an optional daily budget ceiling refuses anything above your limit. For a real product launch it built 21 ad sets, 456 creatives and 455 ads, every ad set and ad paused and waiting for a person to say go.

30 min · Fixed quote before we build · Projects from $2,500

Built for a real launch

We built this server for the launches we run. It lets an AI agent build the campaigns, ad sets, creatives and ads, with guards that keep the agent from turning on spend by accident. Those guards live in the server, not in the prompt.

One build for a real product launch created 21 ad sets, 456 creatives and 455 ads. Every ad set and ad was created paused, waiting for a person to say go, and 563 images and videos were uploaded on the way. Two of the videos came back with HTTP 413, too large to send in a single request, so the server uploads video in chunks, the way Meta's own SDK does, and resumes an interrupted upload where it stopped.

The server is free and open source: safe-meta-ads-mcp on GitHub. It works with Claude Desktop, Claude Code or any other MCP client, and it calls Meta's official Marketing API with your own token.

Everything starts paused

The create tools have no status input. The server sets PAUSED on every campaign, ad set, ad and copy it creates, so nothing an agent passes can start delivery. Pausing is always allowed: meta_set_status pauses anything at once.

Turning anything on goes through that same tool, and it needs confirm set to exactly ACTIVATE AND ALLOW SPEND. The agent is told to ask you for the phrase. When your MCP client supports elicitation, the server also asks you directly, in a form that shows the ID and the daily budget at stake, never text the agent wrote.

Here is the example session from the README, with made-up names and IDs, on a server started with a ceiling of 5000. The request: a traffic campaign for a spring sale, 20 USD a day, for people in the US aged 25 and over, with one image.

StepAnswer
meta_create_campaign: "Spring sale", traffic, daily budget 2000Campaign 2001, PAUSED
meta_create_ad_set: campaign 2001, "US 25+", link clicks, US, minimum age 25Ad set 2002, PAUSED
meta_upload_image: hero.jpgThe image hash
meta_create_creative: Page 3001, the sale's landing page, the imageCreative 2003
meta_create_ad: ad set 2002, creative 2003Ad 2004, PAUSED
meta_set_status: campaign 2001, ACTIVE, without the phraseNot activated. No confirmation phrase was given. Turning this on can spend money, so the person has to approve it: ask them to type ACTIVATE AND ALLOW SPEND, then call again with confirm set to exactly that. Nothing was changed
Claude tells the person everything is built and paused, and that typing the phrase starts spending 20 USD a dayThe person types ACTIVATE AND ALLOW SPEND
meta_set_status: campaign 2001, ACTIVE, with the phraseACTIVE, daily budget 2000 checked against the ceiling of 5000
meta_set_status: ad set 2002 and ad 2004, ACTIVE, with the phraseThe ad goes live once Meta has reviewed it

Budgets are in the currency's smallest unit, as Meta counts them: 2000 is 20.00 USD, and the ceiling of 5000 is 50.00 USD.

A budget ceiling, and a read-only mode

Start the server with --max-daily-budget and it refuses to create anything with a daily budget above that number, and to turn on anything that would take a campaign above it: its campaign budget, or the total of its active ad sets. Before it activates anything, it reads from Meta what the campaign would spend per day once that object is on, and refuses when that is above your ceiling, phrase or not.

  • Budgets are in the currency's smallest unit, as Meta counts them: 5000 is 50.00 USD, or 5,000 JPY.
  • Lifetime budgets and campaigns with scheduled budget increases are refused while the ceiling is set.
  • It is a ceiling on each campaign's daily budget, not a cap on the whole account.
  • Meta may spend up to 75% over a daily budget on a given day and balances it over the week, so the ceiling limits the budget, not a single day's spend.

When you only need reports, start it with --read-only. The server then registers its six read tools and nothing else: ad accounts, campaigns, ad sets and ads with their status, budget and spend, insights for any period split by day, level or breakdowns such as age, gender, country or placement, and meta_diagnose. Nothing can be created or changed.

Getting a token, and keeping it out of the chat

The access token stays inside the server. No tool returns it, and it is stripped from every result and every error, so it never lands in the conversation. On a Mac it can live in the Keychain; elsewhere the server reads it from an environment variable.

Use a system user, the kind of account Meta provides for software that calls its API:

  • In Meta for Developers, create an app and connect it to your business portfolio.
  • In Meta Business Suite, open Business settings, then Users, then System users. Add a system user and assign it your ad account and the Facebook Page your ads run as, with permission to advertise.
  • Generate a token for the system user and your app, with the ads_management, ads_read and pages_read_engagement permissions.
  • Store it in the macOS Keychain or in an environment variable, then ask Claude to run meta_diagnose. It reports what the token can do, the state of your ad account, and the Facebook Pages you can advertise with.

If Meta answers that your app is still in Development mode, switch it to Live in Meta for Developers before you create creatives.

Uploads, rate limits and errors

Images go up in one request. Videos go up in chunks, with the progress saved after each one, so an interrupted upload resumes from the last chunk Meta confirmed, even after a restart. The tool then waits until Meta has processed the video. It only sends files that are images or videos by their content, not just by their name.

The server reads the usage headers on Meta's answers and slows down as usage climbs. When a limit is reached, it waits for as long as Meta says the limit lasts, up to the time set with --max-wait, and it retries the errors Meta marks as temporary, except when something is being created. After a lost connection or a temporary error during a create, the object may exist or not, so the server says so instead of retrying, and the agent lists what exists before trying again. Rate limits are the exception: Meta refuses those calls outright, so they are retried.

What stays with you and Ads Manager

  • It never deletes or archives a campaign, ad set, ad or file.
  • Apart from pausing and activating, it leaves existing objects as they are. Budgets, targeting and creatives of existing objects are changed in Ads Manager.
  • Creatives are website-link ads with one image or one video. Carousels, collections, catalog ads, lead forms and dynamic creative are outside its scope.
  • Reports come from Meta's synchronous insights endpoint. Meta's asynchronous report jobs, for very large reports, are outside its scope.
  • Payment methods, spending limits and Business Manager permissions stay in Meta's own tools.

The phrase is a deliberate step, not a password. When your client supports MCP elicitation, the server asks you directly and the agent cannot answer for you. Claude Desktop and Claude Code also ask you before each tool call unless you have allowed that tool permanently, so keep meta_set_status on ask, and use --read-only when you only need reports.

The code, the full tool list and the setup for Claude Desktop and Claude Code are on GitHub, MIT licensed: safe-meta-ads-mcp. If you would rather have the campaigns built and run for you, see our lead generation agency page.

Questions, answered.

Can an AI agent spend my ad budget?

Not by accident. Everything an agent creates here starts paused, and the create tools have no way to ask for anything else. The one tool that turns ads on refuses unless it receives the exact phrase ACTIVATE AND ALLOW SPEND, which the agent is told to ask you for, and clients that support MCP elicitation also show you a yes or no before anything goes live. With a daily budget ceiling set, activation above it is refused, phrase or not.

Does it work with Instagram ads?

Yes. Instagram ads use the same campaigns, ad sets and ads. Leave publisher_platforms out of the ad set's targeting and Meta uses all its default platforms, Instagram included, or set it to Instagram alone to run on Instagram only. Pass instagram_user_id when you create the creative to show your Instagram account on those placements.

How do I get a Meta access token for the Marketing API?

Use a system user. Create an app in Meta for Developers and connect it to your business portfolio, add a system user in Business settings with your ad account and Facebook Page assigned, then generate a token for the system user and your app with the ads_management, ads_read and pages_read_engagement permissions.

Is it an official Meta or Anthropic tool?

No. It is an independent open-source project by AI Strike Force, not made or endorsed by Meta or Anthropic. It calls Meta's official Marketing API with your own token, so Meta's terms and limits apply as they would to any app you build.

Can it delete or edit my existing campaigns?

It cannot delete or archive anything. Apart from pausing and activating, it does not edit what already exists: budgets, targeting and creatives of existing objects are changed in Ads Manager.

Which MCP clients does it work with?

Claude Desktop, Claude Code and any other MCP client. When a client supports MCP elicitation, the server also asks you directly in a form before anything goes live. Claude Desktop and Claude Code ask you before each tool call unless you have allowed that tool permanently, so keep the activation tool on ask.

Tell us what's slowing you down. We'll show you what to automate first.

Free · 30 min · Projects from $2,500

contact@aistrikeforce.com