Skip to main content
Glama
Apple Ads MCP Server

Apple Ads MCP Server

Apple Ads MCP Server (read + write)

License: MIT Python 3.11+

An MCP server for Apple Ads, built on the Apple Ads Platform API v1. Use it from Claude, ChatGPT, Cursor, Codex or any MCP client to report on App Store and Apple Maps campaigns, find search terms, keyword ideas and impression share, and change budgets, bids, keywords and ads.

Maintained by AI Shopping Feeds. It offers:

  • nearly every Platform API v1 endpoint: campaigns, ad groups, keywords and negative keywords, ads and creatives, reports, impression share, search term popularity, recommendations, budget orders, Apple Maps and change history

  • spend safety: dry-run, confirm words for deletes and bulk changes, a limit on budget and bid rises, paused new campaigns and an audit log

  • every other endpoint through a generic apple_ads_request tool

  • the current API: Apple switches off the older Campaign Management API v5 on 26 January 2027

Not affiliated with or endorsed by Apple.

Part of the AI Shopping Feeds MCP family: Google Ads · Google Merchant Centre · Google Analytics · YouTube Studio · Amazon Ads · Apple Ads · Microsoft Ads · TikTok Ads · Pinterest Ads · Snapchat Ads · OpenAI Ads · AppLovin.

Let your agent set it up

Paste this into Claude Code, Codex, Cursor or any agent that can read web pages and edit files:

Set up the Apple Ads MCP server for me by following https://raw.githubusercontent.com/AI-Shopping-Feeds/apple-ads-mcp/main/skills/apple-ads-mcp/SKILL.md

The agent checks whether it's already connected, installs the runner if you agree, walks you through the Apple Ads API user, key pair and IDs, adds the server to your client's config without touching your other servers, and checks it works by calling apple_ads_health_check.

The same file is an Agent Skill, so your agent can keep it as a guide to using the tools well. For Claude Code, copy the folder into your skills:

git clone --depth 1 https://github.com/AI-Shopping-Feeds/apple-ads-mcp.git /tmp/apple-ads-mcp
cp -r /tmp/apple-ads-mcp/skills/apple-ads-mcp ~/.claude/skills/

Other agents that support skills load the same skills/apple-ads-mcp folder from their own skills directory.

Related MCP server: Apple Ads MCP

What it can do

89 tools, all prefixed apple_ads_. The full list is in docs/tools.md.

Read

Area

Tools

Accounts

get_me, list_acls (ad account IDs and roles), get_org, get_ad_account, get_advertiser_resources

Apps

search_apps, get_app, check_app_eligibility, rejection reasons, supported languages, custom product pages

Structure

query_campaigns, get_campaign, query_adgroups, query_keywords, query_negative_keywords, query_ads, query_creatives

Reports

report (campaigns, ad groups, ads, keywords, search terms), performance_summary (spend, taps, installs, CPT, cost per install)

Insights and ideas

impression_share, search_term_popularity, keyword_suggestions, suggestions, query_recommendations

More

budget orders, Apple Maps brands, locations and assets, query_change_history, search_geo

Server

describe_server, health_check, audit_tail, audit_lookup

Write

Area

Tools

Campaigns

create_campaign (starts paused), update_campaign, set_campaign_status, set_campaign_daily_budget, delete_campaign

Ad groups

create_adgroup, update_adgroup, set_adgroup_status, set_adgroup_bid, delete_adgroup

Keywords

add_keywords, update_keywords, delete_keywords, and the same for negative keywords

Ads and creatives

create_ad, update_ad, delete_ad, create_creative, update_creative, delete_creative

Recommendations

apply_recommendations, dismiss_recommendations

Budget orders and Apple Maps

create_budget_order, update_budget_order, delete_budget_order, location groups, delete_asset

Any endpoint

request

Safety

  • Dry-run (APPLE_ADS_DRY_RUN=true or apple_ads_set_dry_run) previews and logs writes without sending them. Reads and reports still work.

  • Deletes need confirm='DELETE'. Bulk changes, applying recommendations, budget orders and raw writes need confirm='APPLY'.

  • Budget and bid rises above APPLE_ADS_MAX_INCREASE_PCT (default 20%) need confirm='APPLY', and the refusal shows the change, e.g. dailyBudget: 10.00 -> 15.00 (+50%). New campaigns start paused.

  • Every write and dry-run is recorded in an append-only audit log (~/.apple-ads-mcp/logs/audit.jsonl) with a before snapshot. Entries older than APPLE_ADS_AUDIT_RETENTION_DAYS (default 30) are deleted at startup, and apple-ads-mcp purge deletes the log.

  • APPLE_ADS_READ_ONLY=true hides every tool that can change the account; APPLE_ADS_TOOL_GROUPS exposes only the groups you need. Every tool carries a title and MCP read-only/destructive hints.

  • The HTTP transports have no sign-in, so the server refuses to listen on anything but localhost unless you set APPLE_ADS_ALLOW_REMOTE=true.

  • Report data stays in memory and is never written to disk. How the server fits Apple's terms: docs/terms-and-data.md.

Supported clients

Client

Works?

How

Claude Code

✅

Local server, claude mcp add (below)

Claude Desktop

✅

Local server, claude_desktop_config.json

Cursor

✅

Local server, ~/.cursor/mcp.json

VS Code (Copilot)

✅

Local server, .vscode/mcp.json (uses servers instead of mcpServers)

Codex

✅

Local server, ~/.codex/config.toml

Gemini CLI

✅

Local server, ~/.gemini/settings.json

Windsurf and other local clients

✅

Local server, same JSON entry

Claude.ai and ChatGPT

❌ not yet

These need a remote server with sign-in. This server's HTTP transports have no sign-in, so don't expose them publicly. Use a local client.

Setup

1. Install uv

The server runs with uvx from uv (brew install uv on macOS) and needs Python 3.11 or later. It installs straight from this repository:

uvx --from git+https://github.com/AI-Shopping-Feeds/apple-ads-mcp.git apple-ads-mcp

Pin a release by adding @vX.Y.Z to the URL.

2. Get credentials

  1. API user: in Apple Ads, an account administrator invites a user under Account Settings > User Management with the API Account Read Only or API Account Manager (read and write) role.

  2. Key pair: make one on your computer. The private key stays in ~/.apple-ads-mcp/secrets/; the command prints the public key:

    uvx --from git+https://github.com/AI-Shopping-Feeds/apple-ads-mcp.git apple-ads-mcp keygen
  3. Upload and copy your IDs: signed in as the API user, paste the public key into Account Settings > API and copy the clientId, teamId and keyId Apple shows.

Step by step, including how to find your ad account ID and the rules for working on clients' accounts: docs/setup-apple-ads-api.md.

3. Add it to your client

Replace the placeholders. Keep your other servers in each file. Start with APPLE_ADS_DRY_RUN=true so nothing changes until you're happy.

Claude Code

claude mcp add --scope user apple-ads \
  --env APPLE_ADS_CLIENT_ID=SEARCHADS.your-client-id \
  --env APPLE_ADS_TEAM_ID=SEARCHADS.your-team-id \
  --env APPLE_ADS_KEY_ID=your-key-id \
  --env APPLE_ADS_PRIVATE_KEY_PATH=/abs/path/private-key.pem \
  --env APPLE_ADS_DRY_RUN=true \
  -- uvx --from git+https://github.com/AI-Shopping-Feeds/apple-ads-mcp.git apple-ads-mcp

Claude Desktop, Cursor, Gemini CLI, Windsurf (and VS Code under servers)

{
  "mcpServers": {
    "apple-ads": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/AI-Shopping-Feeds/apple-ads-mcp.git", "apple-ads-mcp"],
      "env": {
        "APPLE_ADS_CLIENT_ID": "SEARCHADS.your-client-id",
        "APPLE_ADS_TEAM_ID": "SEARCHADS.your-team-id",
        "APPLE_ADS_KEY_ID": "your-key-id",
        "APPLE_ADS_PRIVATE_KEY_PATH": "/abs/path/private-key.pem",
        "APPLE_ADS_DRY_RUN": "true"
      }
    }
  }
}

Desktop apps often can't find uvx on the PATH; if the server doesn't start, use the full path from which uvx as the command.

Codex (~/.codex/config.toml)

[mcp_servers.apple-ads]
command = "uvx"
args = ["--from", "git+https://github.com/AI-Shopping-Feeds/apple-ads-mcp.git", "apple-ads-mcp"]
env = { APPLE_ADS_CLIENT_ID = "SEARCHADS.your-client-id", APPLE_ADS_TEAM_ID = "SEARCHADS.your-team-id", APPLE_ADS_KEY_ID = "your-key-id", APPLE_ADS_PRIVATE_KEY_PATH = "/abs/path/private-key.pem", APPLE_ADS_DRY_RUN = "true" }

4. Check it works

Restart or reload the client, then ask it to "run the Apple Ads health check". It should call apple_ads_health_check and list the ad accounts your API user can see. Add the one you want as APPLE_ADS_AD_ACCOUNT_ID, and set APPLE_ADS_DRY_RUN=false when you're ready to make real changes.

Configuration

Variable

Required

What it does

APPLE_ADS_CLIENT_ID

yes

clientId from Account Settings > API

APPLE_ADS_TEAM_ID

yes

teamId from Account Settings > API

APPLE_ADS_KEY_ID

yes

keyId from Account Settings > API

APPLE_ADS_PRIVATE_KEY_PATH

yes

Path to the private key from apple-ads-mcp keygen. Can be left out if it's at ~/.apple-ads-mcp/secrets/private-key.pem

APPLE_ADS_AD_ACCOUNT_ID

recommended

Default ad account (sent as X-AP-Context: adAccountId=…). Any tool can override it with ad_account_id

APPLE_ADS_DRY_RUN

no

true previews and logs writes without sending them

APPLE_ADS_READ_ONLY

no

true registers only read-only tools (plus the meta tools)

APPLE_ADS_TOOL_GROUPS

no

Comma-separated groups to register (default all): accounts, apps, geo, campaigns, adgroups, keywords, ads, budget_orders, reports, recommendations, maps, change_history, advanced. Unknown names stop the server

APPLE_ADS_MAX_INCREASE_PCT

no

Budget and bid rises above this % need confirm='APPLY' (default 20)

APPLE_ADS_AUDIT_LOG

no

Audit log path (default ~/.apple-ads-mcp/logs/audit.jsonl)

APPLE_ADS_AUDIT_RETENTION_DAYS

no

Audit entries older than this are deleted at startup (default 30)

APPLE_ADS_PAGE_SIZE, APPLE_ADS_TIMEOUT, APPLE_ADS_LOG_LEVEL

no

/query page size (1 to 1000, default 100), request timeout in seconds (default 30) and log level

APPLE_ADS_TRANSPORT, APPLE_ADS_HOST, APPLE_ADS_PORT

no

stdio (default), streamable-http (served at http://HOST:PORT/mcp) or sse (deprecated by the MCP spec; logs a warning), and its bind address (default 127.0.0.1:8000)

APPLE_ADS_ALLOW_REMOTE

no

true (or --allow-remote) lets the HTTP transports bind to a non-loopback host. Off by default: there is no sign-in

Settings can also go in ~/.apple-ads-mcp/.env, ./.env or a file passed with --env. See docs/mcp-client-config.md for the order, file locations and the command line (run, keygen, purge, describe, version).

Example prompts

How did my App Store campaigns do over the last 7 days? Which one has the worst cost per install?
Show last month's search terms for my US campaign and suggest negative keywords for the ones with spend and no installs.
Raise the daily budget of my UK campaign to £30. Use dry-run first and show me the change.
Which keywords in my main campaign have impression share under 30%?

More docs

Contributing and licence

Issues and pull requests are welcome on this repository. See CONTRIBUTING.md.

Licensed under the MIT License.


Try out AI Shopping Feeds, our shopping feed management tool (including Google Shopping feeds).

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP 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.
    76 npm
    7
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    Provides 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.
    110
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP clients such as Claude Desktop and Cursor to read tracked app keywords, opportunities, account apps, and action plans; generate or translate listing copy; review results; and apply accepted title, subtitle, keywords, or short-description fields to an editable draft without publishing to Apple or Google.
    40 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP clients to read App Store campaign and performance data and to prepare preview-first, opt-in changes for explicitly allowlisted ad accounts.
    312 npm
    1
    Apache 2.0