MCP Apple Ads
Provides tools for interacting with the Apple Ads Platform API, enabling management of ad accounts, campaigns, ad groups, keywords, ads, shared budgets, and performance reporting.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Apple Adsshow me my campaign spend for the last 30 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@mgcrea/mcp-apple-ads
Model Context Protocol server for the Apple Ads Platform API — ad accounts, campaigns, ad groups, keywords, ads and reporting.
Writes are off by default, everything is created paused, and optional ceilings cap what any tool may spend.
Features
34 tools across accounts, apps, campaigns, ad groups, keywords, ads, shared budgets and reporting — plus a raw-request escape hatch for the rest of the API.
Reporting that fits in a context window. Totals by default, zero-valued metrics dropped, metadata trimmed to the fields that identify a row, and per-period rows opt-in and capped. A 90-day × 200-keyword report shapes down by more than 10×.
Money safety in four layers — see Spending safety.
No SDK dependency. Two runtime dependencies (
@modelcontextprotocol/server,zod); the ES256 client secret is signed withnode:crypto.
Related MCP server: Apple Ads MCP Server
API version and the 2027 sunset
This server targets the Apple Ads Platform API 1.0 (https://api.ads.apple.com/v1/), which Apple shipped in August 2026.
It does not target the older Campaign Management API v5 (api.searchads.apple.com/api/v5), which Apple sunsets on 26 January 2027. There is no version switch: a second shaping path for an API that will be gone is not worth the code, and anyone still on v5 has to migrate regardless.
Security
Your credentials. The private key is read once at startup and never leaves the process. It is never logged, never returned by a tool, and apple_ads_auth_status reports only whether it loaded. Prefer APPLE_ADS_PRIVATE_KEY (inline PEM, from a secret store) over a path on disk. If you do use a file, chmod 600 it — the server warns when it is group-readable.
Unlike App Store Connect, nothing here is downloadable-once: you generate the key pair and register only the public half, so a lost key is regenerable.
Blast radius. This server can spend money. That is why:
writes are unregistered, not merely refused, unless
APPLE_ADS_ALLOW_WRITES=1;every write — including creates — requires
confirm: true;everything is created
PAUSEDunlessactivate: true;APPLE_ADS_MAX_DAILY_BUDGETandAPPLE_ADS_MAX_BIDare checked locally before any request goes out.
Configure
Getting the key
Apple Ads credentials are not App Store Connect credentials, and not Apple Business Manager credentials. All three consoles issue similar-looking EC keys and none of them interoperate.
mkdir -p ~/.config/apple-ads && chmod 700 ~/.config/apple-ads
cd ~/.config/apple-ads
openssl ecparam -genkey -name prime256v1 -noout -out apple-ads-private.pem
openssl ec -in apple-ads-private.pem -pubout -out apple-ads-public.pem
chmod 600 apple-ads-private.pemThen, at ads.apple.com:
Account Settings → User Management — invite a user with an API role (
API Account Managerfor writes,API Account Read Onlyfor reads). Inviting yourself is fine.Sign in as that API user.
Account Settings → API — paste the contents of
apple-ads-public.pem. Apple then printsclientId,teamIdandkeyIdabove the field.
The trap that costs everyone an afternoon: an Account Admin has no Public Key field. That role sees a "Manage API Access" table instead, and the API page looks like it has nothing to create. You must invite an API-role user and sign in as that user before the field appears. Apple's own help page describes step 1 and step 3 as though they happen to the same person, which is why this is easy to miss.
A related wrong turn: Apple Business Manager (
business.apple.com) has an "Add API Account" dialog that looks almost identical and hands you a downloadable-once private key. It is a different service. ItsclientIdstartsBUSINESSAPI.; an Apple Ads one startsSEARCHADS..
The API user's access level is the real permission boundary — APPLE_ADS_ALLOW_WRITES is a second gate on top, not a substitute for picking the right role.
Environment
Variable | Required | Notes |
| yes |
|
| yes |
|
| yes | UUID of the registered public key |
| one of | EC P-256 private key, inline PEM |
| one of | path to the |
| no | default ad account; required when the login reaches several |
| no | registers the mutating tools |
| no | ceiling in major units on any daily budget a tool may set |
| no | ceiling in major units on any bid |
| no | config file path (default |
| no | default 3 |
| no | stderr debug logging |
Environment wins over the config file per field, so a one-off APPLE_ADS_ALLOW_WRITES=0 overrides a file that says true.
Quick start
// .mcp.json
{
"mcpServers": {
"apple-ads": {
"command": "npx",
"args": ["-y", "@mgcrea/mcp-apple-ads"],
"env": {
"APPLE_ADS_CLIENT_ID": "SEARCHADS.…",
"APPLE_ADS_TEAM_ID": "SEARCHADS.…",
"APPLE_ADS_KEY_ID": "…",
"APPLE_ADS_PRIVATE_KEY_PATH": "/Users/you/.config/apple-ads/apple-ads-private.pem",
},
},
},
}Inspect the tools
npx @modelcontextprotocol/inspector npx -y @mgcrea/mcp-apple-adsTools
Tool | What it does | Writes? |
| Credentials, reachable ad accounts, ceilings, setup steps | |
| Ad accounts this key can reach — the bootstrap call | |
| Find an app's adamId | |
| One app's advertising details | |
| Campaign configuration | |
| Ad group configuration | |
| Targeting keywords with bids | |
| Excluded terms | |
| Apple's keyword suggestions | |
| Creative surface | |
| Shared budgets | |
| The performance numbers, at five levels | |
| Headroom per search term | |
| Search demand per term | |
| Any endpoint no tool wraps | gated |
| Campaign lifecycle | ✓ |
| Ad group lifecycle | ✓ |
| Keyword management, bulk | ✓ |
| Exclusions | ✓ |
| Ads | ✓ |
| Pause or resume any of the four | ✓ |
| Change a shared budget | ✓ |
Listing cost, measured: 26 KB / ~6.5k tokens with writes off, 49 KB / ~12k tokens with writes on.
Deliberately not wrapped
Reachable through apple_ads_request: Maps advertising (/business-brands/* and its five report variants), asset upload and creative authoring, recommendations apply/dismiss, ad-account creation, location targeting, change history.
Worked example
Which keywords lost me money last month, and pause them.
apple_ads_list_accounts→ the ad account idapple_ads_get_reportatlevel: "keyword", last 30 days, no granularity → totals per keywordread
localSpendagainsttotalInstallsapple_ads_set_entity_statuswithentity: "keyword",status: "PAUSED"on each loser
Pausing, not deleting: a paused keyword stops spending and keeps its history.
Spending safety
Layer | What it does |
Write gate | Without |
| Required on every write, creates included — a campaign created ENABLED spends immediately |
Created PAUSED |
|
Ceilings |
|
The ceilings do not apply to apple_ads_request, which bypasses them by construction. Its description says so.
Apple Ads vs App Store Connect
Two APIs, two consoles, two keys — which is why they are two servers rather than one. They share exactly one thing: adamId is the same integer as an app's id in App Store Connect, and as the digits in its App Store URL.
If you run @mgcrea/mcp-appstore-connect too, app_store_connect_list_apps is the cheaper way to get an adamId than apple_ads_search_apps.
Traps worth knowing
A 403 is usually the ad-account context, not your credentials. If the token minted but calls fail, the
X-Ap-Contextheader is missing or names an account this login has no role on.apple_ads_auth_statuslists what is reachable./aclsand/meare the only calls that take no ad-account context — necessarily, since they are how you discover which accounts exist.Money amounts are strings upstream.
Money.amountis"50.00", not50. This server converts both ways; if you useapple_ads_requestyou are on your own.Keyword deletion is permanent and takes the reporting history with it. Pausing is nearly always what was meant.
A multi-account login must name an account. Tools refuse rather than guess, because guessing spends money in someone else's account.
Report granularity has windows. HOURLY needs a start within 7 days (and is unavailable for search-term and ad reports), DAILY within 90, WEEKLY within 365 with an end 14+ days old, MONTHLY with an end 90+ days old. These are checked locally, so you get the rule rather than
INVALID_PARAMETER.Search-term reports reject
timeZone: "UTC". UseORTZ, which is the default here.
Troubleshooting
Symptom | Cause |
Tool missing from the list | Writes disabled, or no credentials — run |
| Client/team/key id mismatch, or the private key is not the pair of the registered public key |
| Ad-account context — see Traps |
"This login can reach N ad accounts" | Pass |
Budget refused with no request sent | A ceiling is set — this is working as intended |
Develop
pnpm install
pnpm build
pnpm test
pnpm typecheck && pnpm lintTests are fully offline: fetch is mocked and the MCP client is in-memory. No credentials are needed or read.
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Run Apple Search Ads from Claude: performance, recommendations, keywords, budgets, launches.
Manage Apple Ads campaigns and reporting in chat.
Analyze and manage Apple Ads from your AI assistant with RevenueCat insights and safety controls.
- adsOAuthcom.adspirer
Manage Google, Meta, Amazon, TikTok, LinkedIn & ChatGPT ads. 430 tools for campaigns & analytics.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for Apple Search Ads API v5 that enables natural language management of campaigns, keywords, budgets, creatives, and performance reporting. Supports 54 tools for campaign management, keyword optimization, search term analysis, and more.82 npm7MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server for the Apple Ads Platform API that exposes 99 operations across all resources through four token-efficient tools. It enables AI agents to read and write campaigns, ad groups, keywords, creatives, budgets, reports, and more.82 npm2MIT
- AlicenseCqualityAmaintenanceProvides MCP clients typed tools for Apple Ads Platform research, reporting, auditing, and receipt-gated campaign management with a local-first, read-only-by-default safety model.1107MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching an offline catalog of Apple Ads Platform API documentation and issuing authenticated read and write calls to manage App Store and Apple Maps campaigns, reports, keywords, budgets, and recommendations. Read and write are split into separate tools, with read-only mode, pagination merging, and large-report file output.82 npmMIT