Provider REST API
MarketingConnect Claude to Meta Ads
Read Meta ad accounts, campaigns, ad sets, ads, audiences and insights, and pause a campaign. Toolspoke puts 10 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.
- Connection
- Provider REST API
- Authentication
- Sign in with Facebook
- Actions exposed
- 10
- Cost per call (typical)
- 1 credit
- Adapter
- Maintained by Toolspoke
Connected in three steps
- 1
Install Meta Ads
Open the marketplace in your workspace, add Meta Ads to the project your agents work in, and it appears on the gateway immediately.
- 2
Connect the credential
Sign in to Meta Ads. Toolspoke holds the token encrypted and refreshes it when it expires.
- 3
Point your agent at the gateway
Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.
.mcp.json{
"mcpServers": {
"toolspoke": {
"type": "http",
"url": "https://toolspoke.com/mcp"
}
}
}One block covers every tool you have installed. Meta Ads shows up in the client as soon as your policy allows it, and so does everything else you install later.
Where the address goes, per client
- Claude Code
Run it in your project, then /mcp to sign in
claude mcp add --transport http toolspoke https://toolspoke.com/mcp- Claude and Claude Desktop
Settings, then Connectors, then Add custom connector
https://toolspoke.com/mcp- Cursor
~/.cursor/mcp.json, or .cursor/mcp.json for one project
{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }- Codex
~/.codex/config.toml
[mcp_servers.toolspoke] url = "https://toolspoke.com/mcp"- VS Code
.vscode/mcp.json, or the MCP: Add Server command
{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }
What Meta Ads asks for
Press connect and sign in to Meta Ads. Toolspoke keeps the token encrypted and refreshes it when it expires, so there is nothing to copy and nothing to rotate by hand.
- Default ad account IDOptional
- Used whenever an action is called without an explicit ad_account_id. Include the act_ prefix - it is the `id` field list_ad_accounts returns. Leave blank to name an account on every call.
- act_1234567890
The scopes it asks for
- ads_read
- ads_management
- business_management
What Claude can do in Meta Ads
10 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.
- Reads
- 9Reads
- Writes
- 0Writes
- Destructive
- 1Destructive
Reads
9Fetches data and changes nothing.
list_ad_accountsList the ad accounts the signed-in user can reach, with their status, currency, time zone and lifetime spend. Call this first when you do not know which account to report on - the `id` it returns (act_1234567890) is what every other action here wants.
get_ad_accountFetch one ad account's configuration - name, status, currency, time zone and owning business. Read the currency and time zone from here before interpreting any spend figure or date range, because insights are reported in the account's own currency and cut on its own time zone.
get_account_spendRead an ad account's billing position: lifetime amount spent, the account spend cap, the outstanding balance and how it is funded, all in the account's own currency. This answers "how much has this account spent and how much room is left", which the insights actions cannot - they report delivery over a window, not the account's ledger. Amounts come back as minor units (cents) in the account currency.
list_campaignsList an ad account's campaigns with their objective, status, budget and bid strategy. Filter by effective_status to see only what is live - note that effective_status is Meta's resolved state (a campaign can read ACTIVE while every ad set under it is paused), whereas status is what was set on the campaign itself.
get_campaignFetch one campaign by ID, with its objective, budget, bid strategy, schedule and special ad categories. Budgets are minor units (cents) of the ad account's currency, and start_time and stop_time are read-only here - scheduling lives on the ad sets.
list_ad_setsList an ad account's ad sets - the layer that carries the budget, the schedule, the optimisation goal and the targeting. Pass campaign_only_fields false only if you actually need the full targeting object, which is large.
list_adsList an ad account's individual ads with the ad set and campaign each belongs to, plus its review state. Use effective_status to find ads that are DISAPPROVED or WITH_ISSUES, which is the usual reason a live campaign stops delivering.
get_insightsThe reporting action. Run a delivery report against an ad account, a campaign, an ad set or a single ad, and break it down however you need. Pass the object's own ID as object_id - act_1234567890 for a whole account, or a campaign, ad set or ad ID. `level` decides how rows are grouped, not what is queried: object_id=act_… with level=campaign gives one row per campaign in that account. Choose a window with either date_preset or start_date and end_date together; supply neither and Meta reports its own default of the last 30 days. start_date without end_date sends no window at all, because half a range is not a range. Common metrics: impressions, clicks, spend, reach, frequency, cpc, cpm, ctr, actions, cost_per_action_type, purchase_roas. Only documented breakdown combinations are accepted; Meta rejects arbitrary ones, and video metrics cannot be combined with region or hourly breakdowns.
list_custom_audiencesList the custom audiences on an ad account by name, with their approximate size band, how they were built and whether they are ready to use. Deliberately names only: this returns the audience definitions and counts, never the people in them, and Meta does not expose audience membership through this edge at all. operation_status tells you whether an audience is still building; delivery_status tells you whether it is large enough to deliver against.
Destructive
1Deletes or permanently alters something. Worth granting on purpose.
pause_campaignPause a campaign. Delivery stops and spend stops with it, immediately and for real people who were mid-funnel - an audience that was being retargeted simply stops seeing the ads. It is reversible in the Ads Manager by setting the campaign back to ACTIVE, which this connector deliberately cannot do: nothing here can start spend, only stop it. Confirm the campaign ID with get_campaign before calling.
What it will not do
Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.
- It cannot call anything else
- The 10 actions above are the whole of it. A call to any other name is refused before it reaches Meta Ads rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
- It reaches no further than your credential
- Toolspoke holds no access to Meta Ads of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
- It never hears from Meta Ads
- Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Meta Ads. An agent has to ask.
- It does not smooth over provider limits
- Toolspoke does not retry, queue or back off around Meta Ads's own rate limits. A call that Meta Ads refuses comes back to the agent as a failed call.
Before you connect it
What can Claude do in Meta Ads?
10 named actions: 9 that only read and 1 that delete or permanently alter something. They include list_ad_accounts, get_ad_account and get_account_spend. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.
What credentials does the Meta Ads connector need?
Nothing to paste. You sign in to Meta Ads over OAuth 2.0 and Toolspoke keeps the resulting token encrypted, refreshing it when it expires. It asks for ads_read, ads_management and business_management, and can do nothing outside them.
Does the Meta Ads connector work with Cursor and Codex, or only Claude?
Any client that speaks MCP, and every one of them gets the same 10 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.
What does the Meta Ads connector not do?
The 10 actions above are the whole of it. A call to any other name is refused before it reaches Meta Ads rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. Toolspoke holds no access to Meta Ads of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Meta Ads. An agent has to ask. Toolspoke does not retry, queue or back off around Meta Ads's own rate limits. A call that Meta Ads refuses comes back to the agent as a failed call.
Can I limit which actions an agent can call?
Yes, in two places. The project switches Meta Ads's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.
What gets recorded when an agent calls Meta Ads?
Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and the credits spent. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.