Apple Ads MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ASA_KEY_ID | No | Key ID for the generated API client | |
| ASA_ORG_ID | No | Optional default organization ID, can be overridden per call | |
| ASA_TEAM_ID | No | Team ID for Apple Ads API, e.g. SEARCHADS.xxxx | |
| ASA_CLIENT_ID | No | Client ID for Apple Ads API, e.g. SEARCHADS.xxxx | |
| ASA_PRIVATE_KEY | No | Inline PEM content of the private key (with escaped newlines if in JSON) | |
| ASA_PRIVATE_KEY_PATH | No | Absolute path to the private key file (PKCS#8 format) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| org_aclsA | List all org-level ACLs (orgs your API user can access, with orgName / currency / paymentModel / roleNames). Use this to discover the orgId for ASA_ORG_ID. Does not require X-AP-Context. |
| me_userA | Return information about the calling API user (userId, parentOrgId). |
| search_appsA | Search the App Store for apps to target / advertise. Returns adamId, name, developerName, and country availability. You need adamId to create campaigns. |
| search_geoB | Search geo entities by name (Country / AdminArea / Locality). Pass |
| geo_lookupA | Resolve geos by raw IDs. Each request item is { id: 'CountryCode|adminArea|locality', entity: 'Country|AdminArea|Locality' }. Useful when a report returns geo IDs you want named. |
| apps_getC | Fetch App Store metadata for an app: appName, developerName, primaryGenre, secondaryGenre, iconPictureUrl, availableStorefronts, deviceClasses, etc. |
| apps_locale_detailsB | Get localized default product-page details for an app (subtitle, short description, screenshots, app preview) per locale. |
| apps_eligibilities_findA | Find app-eligibility records by selector (filterable by supplySource, countryOrRegion, deviceClass, state). |
| apps_assets_findB | Find App Store screenshots / app-preview assets for an app — returns assetGenIds you can use to author creatives or audit rejected assets. |
| creative_app_preview_devicesA | List supported app-preview device-size mappings (e.g. IPHONE_61, IPAD_129). Used when authoring creatives or interpreting screenshot/preview metadata. |
| countries_or_regions_listA | List supported countries / regions with their default and supported product-page languages. |
| cpp_listC | List Custom Product Pages for an app. |
| cpp_getB | Fetch a single Custom Product Page by ID. |
| cpp_locale_detailsB | List the locales available for a Custom Product Page (with localized assets per locale). |
| campaigns_createB | Create a new campaign. The minimum useful body specifies adamId, name, countriesOrRegions, adChannelType, supplySources, billingEvent, and a budget. |
| campaigns_getB | Fetch a single campaign by ID. |
| campaigns_listA | List all campaigns in the org (paginated). For richer filtering use campaigns_find. |
| campaigns_findA | Search campaigns with a selector — supports conditions (EQUALS/IN/CONTAINS/...), orderBy, and pagination. |
| campaigns_updateA | Update a campaign. Pass only the fields you want to change. Use clearGeoTargetingOnCountryOrRegionChange=true if you change countriesOrRegions. |
| campaigns_deleteB | Permanently delete a campaign. Cannot be undone. |
| adgroups_createB | Create an ad group within a campaign. Bid + targeting live here, not on the campaign. |
| adgroups_getC | Fetch a single ad group. |
| adgroups_listC | List all ad groups in a campaign (paginated). |
| adgroups_find_in_campaignA | Find ad groups within a single campaign using a selector. |
| adgroups_find_org_wideA | Find ad groups across the entire org with a selector. |
| adgroups_updateC | Update an ad group. Pass only the fields you want to change. |
| adgroups_deleteC | Delete an ad group. |
| creatives_createC | Create a creative (a reference to a default product page, custom product page, or creative set). Ads bind to creatives via creativeId. |
| creatives_listB | List all creatives in the org (paginated). |
| creatives_getB | Fetch a single creative by ID. |
| creatives_findC | Find creatives across the org with a selector. |
| ads_createB | Create an ad inside an ad group. Ads bind a Creative (creativeId) to the ad group; the creative itself can wrap a Custom Product Page, Default Product Page, or Creative Set reference. |
| ads_getC | Fetch a single ad by ID. |
| ads_listB | List all ads in an ad group. |
| ads_find_in_campaignA | Find ads across all ad groups in a campaign with a selector. |
| ads_find_org_wideB | Find ads across the entire org with a selector. |
| ads_updateB | Update an ad — typically status, name, or repointing to a different creativeId. |
| ads_deleteC | Delete an ad. |
| targeting_keywords_createB | Bulk-create targeting (positive) keywords on an ad group. Pass up to 1000 per call. |
| targeting_keywords_getC | Fetch a single targeting keyword by ID. |
| targeting_keywords_listB | List targeting keywords on an ad group (paginated). |
| targeting_keywords_findA | Find targeting keywords across all ad groups in a campaign with a selector. Apple does not expose a per-ad-group find — filter by adGroupId in the selector if needed. |
| targeting_keywords_updateB | Bulk-update targeting keywords (status, bid, text, matchType). Each entry must include id. |
| targeting_keywords_deleteC | Bulk-delete targeting keywords by ID. |
| targeting_keywords_delete_singleB | Delete a single targeting keyword by ID (uses Apple's REST DELETE variant). |
| adgroup_negative_keywords_createC | Bulk-create negative keywords on an ad group. |
| adgroup_negative_keywords_getB | Fetch a single ad-group-level negative keyword by ID. |
| adgroup_negative_keywords_listB | List ad-group-level negative keywords (paginated). |
| adgroup_negative_keywords_findB | Find ad-group-level negative keywords across all ad groups in a campaign with a selector. |
| adgroup_negative_keywords_updateC | Bulk-update ad-group-level negative keywords. Each entry must include id. |
| adgroup_negative_keywords_deleteB | Bulk-delete ad-group-level negative keywords by ID. |
| campaign_negative_keywords_createB | Bulk-create campaign-level negative keywords (apply across all ad groups). |
| campaign_negative_keywords_getB | Fetch a single campaign-level negative keyword by ID. |
| campaign_negative_keywords_listC | List campaign-level negative keywords (paginated). |
| campaign_negative_keywords_findB | Find campaign-level negative keywords within a single campaign with a selector. |
| campaign_negative_keywords_updateC | Bulk-update campaign-level negative keywords. |
| campaign_negative_keywords_deleteC | Bulk-delete campaign-level negative keywords by ID. |
| reports_campaignsA | Campaign-level performance report. Returns rows with impressions, taps, installs, spend, CPT/CPM/CPI, conversion rate, etc. Pass groupBy to pivot by country, device, age, gender. |
| reports_adgroupsC | Ad-group-level report within a single campaign. |
| reports_keywords_in_campaignC | Keyword report rolled up across all ad groups in one campaign. |
| reports_keywords_in_adgroupC | Keyword report scoped to a single ad group. |
| reports_search_terms_in_campaignB | Search-terms report rolled up across all ad groups in a campaign. Reveals what users actually typed — harvest new keywords or negatives from here. |
| reports_search_terms_in_adgroupC | Search-terms report scoped to a single ad group. |
| reports_ads_in_campaignB | Ad-level performance (per Custom Product Page / creative variation) rolled up across the campaign. |
| custom_reports_createB | Create an Impression Share (Share of Voice) report — async. Returns a reportId you poll with custom_reports_get until state=COMPLETED. |
| custom_reports_getA | Fetch a single Impression Share report — poll until state=COMPLETED to read rows (rank, impressionShare, lowImpressionShare, highImpressionShare, searchPopularity). |
| custom_reports_listB | List all Impression Share reports created in the org. |
| budget_orders_createB | Create a budget order (LOC accounts only). Wraps Apple's |
| budget_orders_getB | Fetch a single budget order by ID. |
| budget_orders_listB | List all budget orders in the org (paginated). |
| budget_orders_updateC | Update a budget order. Most fields are editable post-creation; status is read-only. v5 has no delete endpoint for budget orders. |
| product_page_reasons_findB | Find ad-creative rejection reasons (filterable by adamId, productPageId, assetGenId, countryOrRegion, languageCode, supplySource, reasonLevel). Use this to audit why a creative was rejected by Apple's review team. |
| product_page_reasons_getB | Fetch a single rejection reason by ID. |
| apple_search_ads_requestA | Escape hatch: call any Apple Search Ads endpoint by method + path. Authentication and org context are handled for you. Use only if no dedicated tool covers the endpoint you need. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AppVisionOS/apple-search-ads-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server