Apple Ads MCP server
io.github.Happygallo/apple-ads·v1.0.3·7 starsManage Apple Search Ads campaigns, keywords, budgets, and reports via API v5.
7 stars70 downloads/wk
Reviews
Write oneNobody has reviewed Apple Ads yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Apple Ads tools (54, 18 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
add_negative_keywordsAdd negative keywords to block wasteful search terms from triggering your ads. Campaign-level negatives block across all ad groups; ad-group-level negatives only block within that ad group. Use get_search_term_report to identify high-spend/low-conversion terms to block.
add_targeting_keywordsAdd new targeting keywords to an ad group. Keywords determine which App Store search queries trigger your ads. Match types: EXACT matches the exact query only (higher relevance, lower volume). BROAD matches related queries and synonyms (higher volume, may need negatives). Start with EXACT for proven terms and BROAD for discovery, then use get_search_term_report to refine.
create_adwrite actionCreate a new ad within an ad group. Requires a creativeId — use list_creatives to find available creatives, or create_creative to make a new one from a product page. Each ad group can have multiple ads with different creatives. Apple will automatically optimize delivery toward the best-performing creative. Defaults: status=ENABLED.
create_ad_groupwrite actionCreate a new ad group within a campaign. After creation, add targeting keywords (add_targeting_keywords) to start matching search queries. Optionally create ads with custom creatives (create_ad). Defaults: status=ENABLED, pricingModel=CPC, startTime=today. The defaultBidAmount is used for keywords that don't have an individual bid. Set cpaGoal to enable Apple's cost-per-acquisition optimization.
create_budget_orderwrite actionCreate a new budget order to authorize spending. Budget orders are the top-level billing entity — campaigns draw from them. Requires name, budget amount, and start date. The budget order must be approved before campaigns can spend against it.
create_campaignwrite actionCreate a new Apple Search Ads campaign. After creation, you MUST create at least one ad group (create_ad_group) and add keywords (add_targeting_keywords) before the campaign can serve ads. Defaults applied: status=ENABLED, currency=USD, supplySource=APPSTORE_SEARCH_RESULTS. adChannelType and billingEvent are auto-set based on supply source (SEARCH/TAPS for search results, DISPLAY/IMPRESSIONS for s
create_creativewrite actionCreate a new creative for use in ads. Creatives are based on App Store product pages. Use list_product_pages to find available product pages for the app, then provide the productPageId. After creation, use create_ad to attach the creative to an ad group. Each ad group can have multiple ads with different creatives for A/B testing.
create_impression_share_reportwrite actionCreate an async custom impression share report. Returns a report ID — poll with get_impression_share_report_by_id until status is COMPLETED. These reports provide detailed impression share data not available in standard keyword reports. Takes minutes to generate.
delete_adwrite actionPermanently delete an ad. This action CANNOT be undone. The ad group must have at least one remaining ad, or it will stop serving. Consider pausing instead (update_ad with status=PAUSED).
delete_ad_groupwrite actionPermanently delete an ad group and all its keywords and ads. This action CANNOT be undone. Consider pausing instead (update_ad_group with status=PAUSED) to preserve data.
delete_campaignwrite actionPermanently delete a campaign and all its child ad groups, keywords, and ads. This action CANNOT be undone. The campaign must be paused before deletion. Consider pausing instead if you might need the data later.
delete_negative_keywordswrite actionPermanently delete negative keywords in bulk. After deletion, ads may start showing for previously blocked search terms. Only delete if you're sure those terms are no longer wasteful.
delete_targeting_keywordswrite actionPermanently delete targeting keywords from an ad group in bulk. This CANNOT be undone — the keyword and its historical association are removed. Consider pausing instead (update_targeting_keywords with status=PAUSED) to preserve bid history.
find_ad_rejection_reasonsFind ad rejection reasons across your account, or get a specific rejection reason by ID. Use this when ads are not serving to understand why Apple rejected them and what to fix.
find_app_assetsFind app assets (screenshots, app previews, etc.) using filters. Useful for checking which visual assets are available before creating creatives. Filter by device class, orientation, or asset type using conditions.
get_adGet full details of a specific ad including its creative association, serving status, and any rejection reasons.
get_ad_groupGet full configuration of a specific ad group: bid settings, CPA goal, status, and scheduling. Use get_adgroup_report for performance metrics.
get_ad_reportGet performance metrics per ad variation within a campaign. Compare creative performance to identify which ad variations drive the best CPA and conversion rates. Use this to decide which creatives to scale and which to pause.
get_adgroup_reportGet performance metrics for ad groups within a campaign. Compare ad group performance to identify which targeting strategies work best. Returns impressions, taps, installs, spend, CPA, CPT per ad group. Drill down further with get_keyword_report.
get_app_detailsGet detailed information about an app by Adam ID including app name, category, and store metadata. Set includeLocales=true to also fetch localized names and descriptions per language/region.
get_app_eligibilityCheck if an app is eligible for Apple Search Ads in specific countries and supply sources. Shows eligibility state, device class, and minimum age per country. Use before creating a campaign to verify the app can run ads in target markets.
get_budget_analysisAnalyze budget utilization and efficiency across ALL campaigns. Shows spend vs budget, daily run rate, days until budget exhaustion, and cost per install. Use to identify under-spending campaigns (increase bids/keywords) and over-spending campaigns (reduce bids/budgets).
get_budget_orderwrite actionGet full details of a specific budget order including budget amount, remaining balance, supply sources, and billing contacts.
get_campaign_detailsGet full configuration of a specific campaign: targeting settings, budgets (total + daily), countries, supply sources, billing event, and status. Use get_campaign_report for performance metrics instead.
get_campaign_reportGet performance metrics for one or all campaigns over a date range. Returns impressions, taps, installs, spend, CPA, CPT, TTR, and conversion rates. Use for high-level performance analysis. For deeper analysis, drill down with get_adgroup_report or get_keyword_report.
get_campaign_snapshotGet a comprehensive snapshot of a campaign in ONE call: campaign config, all ad groups, top keywords by spend, top search terms, and daily performance trends. Designed to give AI all the context needed for optimization analysis without multiple tool calls. Start here for any campaign health check or optimization task.
get_creativeGet full details of a specific creative including its associated app, type, state, and timestamps.
get_geo_performanceGet performance metrics broken down by country or region for a campaign. Shows impressions, taps, installs, spend, CPA per market. Use to identify which countries deliver the best ROI and where to increase/decrease investment or adjust geo targeting.
get_impression_share_report_by_idGet an impression share report by ID. Poll until state=COMPLETED (typically 1-5 minutes). The report contains detailed impression share and rank data per keyword.
get_keyword_reportGet keyword-level performance metrics: impressions, taps, installs, spend, CPA, CPT, and conversion rate per keyword. Essential for bid optimization — identify high-CPA keywords to lower bids or pause, and high-converting keywords to increase bids. Also includes impression share data in the raw JSON (insights.impressionShare). Use get_search_term_report for the actual user queries that triggered e
get_me_detailsGet details about the currently authenticated API user including user ID and parent org ID. Useful for debugging authentication issues.
get_negative_keywordGet details of a specific negative keyword by ID at the campaign or ad group level.
get_product_page_by_idGet details of a specific product page by ID. Product pages are App Store page variations used to create custom creatives. Set includeLocales=true to also fetch locale-specific details (names, descriptions per language).
get_search_term_reportGet actual user search queries that triggered your ads, with full performance metrics. THIS IS THE MOST VALUABLE TOOL for keyword optimization — reveals which search terms convert well (add as keywords), which waste money (add as negatives), and which keywords trigger irrelevant searches.
get_targeting_keywordGet details of a specific targeting keyword: text, match type, bid amount, and status. Use get_keyword_report for performance metrics.
list_ad_groupsList or search ad groups. Provide campaignId to scope to one campaign, or omit to search across all campaigns (org-level). Supports filtering by conditions (e.g., status, defaultBidAmount) and sorting. Returns ad group ID, name, status, default bid, and CPA goal.
list_adsList or search ads. Provide campaignId + adGroupId for a direct listing, campaignId alone to search within a campaign, or omit both for org-level search. Supports filtering and sorting. Returns ad ID, name, creative, status, and rejection reasons if any.
list_budget_ordersList all budget orders in the account. Budget orders define the overall spending authorization and billing relationship. Shows order name, budget, status (ACTIVE/INACTIVE/EXHAUSTED), and date range.
list_campaignsList or search campaigns in the account. Returns campaign ID, name, status, budgets, countries, and supply sources. Use without parameters for a quick overview. Add conditions to filter (e.g., status=ENABLED) or sortBy to rank results. This is typically the first tool to call when exploring an account.
list_creativesList or search creatives in the account. Creatives link product pages to ads — you need a creative before you can create_ad. Filter by adamId to find creatives for a specific app, or use conditions for advanced filtering.
list_impression_share_reportsList all custom impression share reports with their status (QUEUED, RUNNING, COMPLETED, FAILED). Use to find previously created reports.
list_negative_keywordsList negative keywords at campaign or ad group level. Negative keywords prevent your ads from showing for specific search terms. Use get_search_term_report to identify wasteful terms, then add_negative_keywords to block them. NOTE: The Apple Search Ads API does not support filter conditions on negative keyword endpoints — use sorting and client-side filtering instead.
list_organizationsList all organizations (campaign groups) you have access to. Shows org ID, name, currency, payment model, and your roles. Call this first to find the right org, then use switch_organization to set the active org for all subsequent API calls.
list_product_pagesList all product pages for an app. Product pages are App Store page variations that can be used as creatives for custom product page ads. Shows which page is the default and each page's state (VISIBLE, etc.).
list_targeting_keywordsList or search targeting keywords in a campaign. Provide adGroupId for keywords in a specific ad group, or omit to search across all ad groups. Returns keyword text, match type, bid, and status. Use get_keyword_report for performance metrics instead.
search_appsSearch for apps eligible for Apple Search Ads campaigns by name or keyword. Returns app name, Adam ID (needed for create_campaign), and developer info. Set returnOwnedApps=true to only show apps you own.
search_geolocationsSearch or look up geo locations for campaign geo targeting. Search by name (query) to find locations, or provide geoIds to look up specific locations by ID. Returns location display name, entity type (Country/AdminArea/Locality), and ID for use in ad group targeting.
switch_organizationSwitch the active organization context. All subsequent API calls (campaigns, reports, etc.) will operate under this org. The switch persists across sessions. Use list_organizations to see available orgs and their IDs.
update_adwrite actionUpdate an ad's name or status. Setting status to PAUSED stops delivery for this specific ad variation only; other ads in the same ad group continue serving.
update_ad_groupwrite actionUpdate an ad group's configuration. Only provided fields are changed. Changing defaultBidAmount affects all keywords that don't have individual bids. Setting status to PAUSED stops delivery for this ad group only.
update_budget_orderwrite actionUpdate an existing budget order. Can change name, budget amount, and end date. Increasing budget extends spending capacity; decreasing it may cause campaigns to pause if they've exceeded the new limit.
update_campaignwrite actionUpdate a campaign's configuration. Only provided fields are changed; omitted fields are left unchanged. Important: changing countriesOrRegions will clear existing geo targeting (ad-group-level locality/admin area targets). Budget changes take effect immediately. Setting status to PAUSED stops all ad delivery.
update_negative_keywordswrite actionUpdate negative keywords in bulk at the campaign or ad group level. Change status (ACTIVE/PAUSED), match type, or text. Pausing a negative keyword allows the previously blocked search term to trigger ads again.
update_targeting_keywordswrite actionUpdate targeting keywords in bulk — change status (ACTIVE/PAUSED) and/or bid amounts. Use to pause underperforming keywords or adjust bids based on get_keyword_report data. Pass an array of 1 for single-keyword updates. Bid changes take effect immediately and affect future auctions.
Public scan report
scanner v0.1.10 · 2026-09-27 · same rubric, same numbers if you re-run it
- Code scan53 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 195 days ago4/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How Apple Ads compares
Against every graded Web search MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 75/100
- higher than 45% of 3,470 Web search servers
- Tools
- 54
- the typical Web search server has 5
- Tools that change things
- 33%
- typical: 0%. Fewer write tools means less an agent can break
- GitHub stars
- 7
- more than 83% of 1,786 Web search servers
- Downloads a week
- 70
- more than 48% of 827 Web search servers with a package
What its tools let an agent do: 34 read · 8 create · 7 change · 5 delete
Install Apple Ads in Claude Code, Cursor or VS Code
Runs npx -y apple-ads-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add apple-ads -- npx -y apple-ads-mcp
What the publisher says
From the Apple Ads repository's README, as published. We do not edit it. Read it on GitHub
Apple Ads MCP
MCP server for the Apple Search Ads API v5. Connect it to any MCP-compatible AI client and manage your campaigns, keywords, budgets, and reporting through natural language.
Quick Start • Tools • Resources • Prompts • Clients
Ask your AI things like:
"How did my campaigns perform last week?"
"Pause the brand campaign and increase the budget on discovery to $500."
"What search terms are triggering my ads? Add the best ones as exact-match keywords."
Supports 54 tools, 3 resources, and 6 prompts — campaigns, ad groups, keywords, creatives, budgets, search terms, geo targeting, impression share, and performance reports.
Features at a glance
Quick Start
- Get your Apple credentials (~10 min, one-time)
- Generate your key pair (2 commands)
- Add to your MCP client
- Start chatting
Setup
Step 1 — Invite an API user
Done by the account admin at searchads.apple.com.
- Go to Settings → User Management → Invite User
- Enter the email of the person who will use the API
- Set the role:
- API Account Manager — full read/write access
- API Account Read Only — view-only access
- Send the invitation
The API user must be a different Apple ID from the admin. If you're the admin, use a second Apple ID.
Step 2 — Accept and copy your credentials
Done by the invited user.
- Accept the email invitation and sign in to searchads.apple.com
- Go to Settings → API tab
- Copy and save these three values:
- clientId — starts with SEARCHADS.
- teamId — starts with SEARCHADS.
- keyId — a UUID
Step 3 — Generate your key pair
Open Terminal and run:
openssl ecparam -genkey -name prime256v1 -noout -out ~/apple-ads-key.pem && \
openssl pkcs8 -topk8 -nocrypt -in ~/apple-ads-key.pem -out ~/apple-ads-key-pkcs8.pemThen generate the public key:
openssl ec -in ~/apple-ads-key-pkcs8.pem -pubout -out ~/apple-ads-key-public.pemThis creates:
- ~/apple-ads-key-pkcs8.pem — private key (keep this safe, used in your config)
- ~/apple-ads-key-public.pem — public key (upload to Apple next)
Step 4 — Upload public key to Apple
Print your public key:
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Apple Ads: common questions
- Is Apple Ads MCP server safe?
- Mostly: it is graded B (75/100). Read the Apple Ads safety report
- How do I install Apple Ads?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Apple Ads need an API key?
- No secret keys are declared. It reads 5 settings from the environment.
- Is Apple Ads maintained?
- The last commit was 232 days ago (2026-03-17). The latest release is v1.0.3.
- What can I use instead of Apple Ads?
- Servers from other publishers that do the same job: HIG Doctor MCP server, Apple Notes MCP server and Immich Photo Manager MCP server.
- How does Apple Ads compare with other Web search MCP servers?
- safety score 75/100 (higher than 45% of 3,470 Web search servers); tools 54 (the typical Web search server has 5); tools that change things 33% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to Apple Ads
Same job from other publishers: the closest match first, then the best rated.
- HIG DoctorApple Human Interface Guidelines search, lookup, and project audits for AI coding agents.not reviewedEstablishedB
- Apple NotesInspect, search, create, edit, move, and organize notes in Apple Notes on macOS.not reviewedEstablishedA
- Immich Photo ManagerPhoto management for self-hosted Immich: search, albums, duplicates, faces, PDF reports. 94 tools.not reviewedEstablishedB
- Apple Mail MCPApple Mail MCP server with full-coverage FTS5 body search, reliable on large mailboxes.not reviewedEstablishedA