App Store Connect for MCP clients: PPP pricing, subscriptions, TestFlight, reviews, reports & more
App Store Connect for MCP clients: PPP pricing, subscriptions, TestFlight, reviews, reports & more
The first published surface is subscription pricing — including a Purchasing Power Parity rebalance flow that's already been used to schedule 120 production price changes across 65 territories on a real iOS app. New ASC domains (TestFlight, sales, screenshots, IAPs) are designed to plug in one file at a time; see Roadmap.
Compare MCP servers by category, or browse hosted MCP servers if you prefer an endpoint over a local process.
Check the linked publisher documentation and your connected client's tool list. Names and availability can vary with the server version and account permissions.
| Tool | What it does |
|---|---|
| asc_list_apps | list apps (filter by bundleId) |
| asc_get_app | fetch one app by ID |
| asc_list_subscription_groups | groups for an app |
| asc_get_subscription_group | fetch one group by ID |
| asc_list_subscriptions | auto-renewable subscriptions in a group |
| asc_get_subscription | fetch one subscription by ID |
| asc_list_subscription_prices | current price schedule per subscription. One row per territory (~175 unfiltered) — pass territoryId to narrow to one market |
| asc_list_subscription_price_points | valid price points for a subscription in a territory. Pass nearAmount to narrow the response to the nearest tiers around a target price. |
| asc_post_subscription_group | create the container every subscription must live in. A customer can hold only one active subscription per group, so mutually exclusive plans (Monthly vs Yearly |
| asc_patch_subscription_group | rename (referenceName is the only mutable attribute; groups cannot move between apps) |
| asc_delete_subscription_group | lists the group's subscriptions first and refuses client-side naming the specific products that block the delete, instead of letting Apple return a bare 409 |
| asc_post_subscription | create an auto-renewable subscription. productId is permanent: it cannot be changed, and Apple never lets it be reused on the account — not even after the subsc |
| asc_patch_subscription | name, subscriptionPeriod, familySharable, reviewNote, groupLevel. productId has no codepath here by construction. Nested offer/price arrays are deliberately uns |
| asc_delete_subscription | pre-checks state and refuses for products under review or ever approved, pointing at asc_post_subscription_availability as the way to stop selling a live produc |
| asc_post_subscription_group_localization | name + locale, plus optional customAppName (overrides how the app name reads inside the subscription sheet; usually omit). Wire gotcha handled: the parent relat |
| asc_patch_subscription_group_localization | name / customAppName; locale is the immutable lookup key |
| asc_post_subscription_price | set the price for one territory, either the opening price or a scheduled change. Order matters, and both steps are confirmed live: territory availability → unda |
| asc_delete_subscription_price | cancel a pending scheduled change |
| asc_list_app_prices | current price schedule for an app, splitting manual overrides from auto-derived prices and surfacing the base territory |
| asc_list_app_price_points | valid Apple price tiers for an app in a given territory (~600+ tiers per territory). Pass nearAmount (target price) and optional nearCount (default 10) to narro |
| asc_post_app_price_schedule | replace the entire price schedule (whole-schedule replace, NOT a merge — matches Apple's API). Pre-flight refuses unless at least one entry targets the base ter |
| asc_list_iaps | list IAPs for an app (v2 surface only — auto-renewable subscriptions are covered by the Subscriptions tools above). Filterable by inAppPurchaseType and state. I |
| asc_get_iap | fetch a single IAP by ID. |
| asc_list_iap_prices | current price schedule for an IAP (same shape as app prices: manual overrides + auto-derived + base territory). |
| asc_list_iap_price_points | valid Apple price tiers for an IAP in a given territory. Same nearAmount / nearCount narrowing as the app and subscription price-point tools. |
| asc_post_iap_price_schedule | replace the entire IAP price schedule (same whole-schedule replace semantics as asc_post_app_price_schedule: acknowledgeReplacesAll: true, base-territory entry |
| asc_list_subscription_introductory_offers | list intro offers (free trial / pay-as-you-go / pay-up-front) configured for a subscription, across territories. Apple's "all territories" wildcard (a single of |
| asc_get_subscription_introductory_offer | fetch one offer by ID. |
| asc_post_subscription_introductory_offer | create an offer. Three offerModes: FREE_TRIAL (no price; omit pricePointId), PAY_AS_YOU_GO (charge the offer price each period for numberOfPeriods periods), PAY |
| asc_patch_subscription_introductory_offer | narrow update path: only startDate, endDate, and pricePointId can change after creation. To change mode / duration / periods, delete and re-create. |
| asc_delete_subscription_introductory_offer | delete a pending or active offer. Apple refuses to delete one that is currently redeemable; PATCH endDate to today to stop it instead. |
| asc_list_subscription_promotional_offers | list promo offers configured for a subscription. |
| asc_get_subscription_promotional_offer | fetch a single offer, including its per-territory prices. |
| asc_list_subscription_promotional_offer_prices | list per-territory price rows attached to an offer (territory + currency + amount + price-point ID). |
| asc_post_subscription_promotional_offer | create an offer (name + offerCode + mode + duration + all per-territory prices) in one atomic POST. Pre-flights Apple's 10-offer cap and offerCode collisions, r |
| asc_patch_subscription_promotional_offer_prices | update the offer's per-territory prices. Apple's wire semantic is replace (the new prices array becomes the post-state, dropping any territory not listed); the |
| asc_delete_subscription_promotional_offer | DELETE → 204. |
| asc_list_subscription_win_back_offers | list win-back offers configured for a subscription. |
| asc_get_subscription_win_back_offer | fetch a single offer, including its subscription and per-territory prices. |
| asc_list_subscription_win_back_offer_prices | list per-territory price rows attached to an offer (territory + currency + amount + price-point ID). |
| asc_post_subscription_win_back_offer | create an offer (identity + eligibility rules + schedule + priority + all per-territory prices) in one atomic POST. Eligibility is expressed as customerEligibil |
| asc_patch_subscription_win_back_offer | update the mutable attributes only: eligibility, startDate/endDate, priority, and promotionIntent. To change identity, mode, duration, periods, or prices, delet |
| asc_delete_subscription_win_back_offer | DELETE → 204. |
| Images | to-many, per IAP / subscription): asc_list_{iap,subscription}_images · asc_get_ · asc_upload_ (composite) · asc_post_ / asc_patch_ (raw reserve/commit) · asc_de |
| asc_post_app_store_version_release_request | ⚠️ release an approved (PENDING_DEVELOPER_RELEASE) version to the public App Store now — the "Release this version" click, automated. Only for manually-released |
| Subscriptions | asc_get_subscription_availability · asc_list_subscription_available_territories · asc_post_subscription_availability (POST-only full replacement — send the comp |
| IAPs | asc_get_iap_availability (reads through the v2 parent path) · asc_list_iap_available_territories · asc_post_iap_availability (same replace semantics). |
| asc_sign_promotional_offer_legacy | legacy ECDSA-concatenated signature used by StoreKit 1's SKPaymentDiscount and the original StoreKit 2 Product.PurchaseOption.promotionalOffer(offerID:keyID:non |
| asc_sign_promotional_offer | JWS v2 format introduced at WWDC 2025 (back-deployed to iOS 15). Use with StoreKit 2's newer promotional-offer purchase options. Returns the JWS compact seriali |
| asc_sign_introductory_offer_eligibility | JWS v2 with aud="introductory-offer-eligibility". Lets you override StoreKit's default introductory-offer eligibility check (e.g. grant a returning customer ano |
| asc_get_age_rating_declaration | read the answers. Shows only the non-default ones (a typical declaration has 29 attributes, nearly all at NONE/false) plus every override, so the few that actua |
| asc_patch_age_rating_declaration | answer the questionnaire. Content questions take a frequency (NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE); the rest are booleans, plus the rating overrides |
| Reads | asc_list_ci_products · asc_list_ci_workflows / asc_get_ci_workflow (compact config summary: flags, start-condition patterns, actions, resolved Xcode/macOS — raw |
| Triggers | asc_post_ci_build_run (start a build — optional branch/tag override + clean; uses the team's compute hours) · asc_patch_ci_workflow (pause/resume via isEnabled, |
| asc_list_nominations | filter by app / state / type) · asc_get_nomination · asc_post_nomination (defaults to a reviewable DRAFT — submitted:false) · asc_patch_nomination (edit the dra |
| Capabilities | asc_post_bundle_id_capability · asc_patch_bundle_id_capability · asc_delete_bundle_id_capability — capability changes invalidate existing profiles; regenerate t |
| Certificates | asc_list_certificates · asc_get_certificate (base64 DER content) · asc_post_certificate (from a PEM CSR — the private key never goes to Apple) · asc_delete_cert |
| Profiles | asc_list_profiles · asc_get_profile (profileContent = the actual base64 .mobileprovision) · asc_post_profile · asc_delete_profile. No PATCH — profiles are immut |
| Devices | asc_list_devices · asc_post_device (⚠️ effectively permanent — devices can only be disabled, never deleted, and count against the 100-per-class yearly limit) · |
| asc_list_territories | all 175 App Store territories |
| ppp_load_index | return the bundled Apple Music Individual-plan price snapshot used as the PPP signal |
| ppp_compute_proposal | compute a proposed per-territory price schedule (read-only dry-run; uses Apple Music ratios as implied PPP-FX, snaps to valid Apple price points, applies a conf |
| ppp_apply_proposal | recompute and apply the proposal against ASC after confirming via MCP elicitation (or confirm: true for unattended use). Refuses if any row drops by more than m |
| raw | true — return the full JSON:API payload (data, included, links, meta) for debugging or advanced use. |
| maxItems | number — cap auto-pagination (default 500–1000 depending on the tool). The MCP follows links.next and merges + dedupes included resources across pages. |
{
"mcpServers": {
"appstoreconnect": {
"command": "npx",
"args": [
"-y",
"@akoskomuves/appstoreconnect-mcp"
],
"env": {
"ASC_ISSUER_ID": "...",
"ASC_KEY_ID": "YOUR_ASC_KEY_ID",
"ASC_PRIVATE_KEY_PATH": "YOUR_ASC_PRIVATE_KEY_PATH"
}
}
}
}From the project documentation. Replace placeholders and example paths before connecting.
| Variable | Description | Required |
|---|---|---|
| ASC_ISSUER_ID | Declared in the maintainer’s client configuration. | Check documentation |
| ASC_KEY_ID | Declared in the maintainer’s client configuration. | Check documentation |
| ASC_PRIVATE_KEY_PATH | Declared in the maintainer’s client configuration. | Check documentation |
Read, search and edit files inside allowed directories with the Model Context Protocol reference Filesystem server.
Retrieve version-aware library documentation and code examples with Context7 MCP, using resolve-library-id and query-docs.
MCP server for Tangled git platform. Manage repositories, branches, and issues on tangled.org.
MCP server for the Hetzner Cloud API — manage servers, networks, volumes, and more
Pack a folder with a glob, look inside an archive, unpack it with bomb, traversal and symlink guards
Hermetic local memory for coding agents: provenance-mandatory capture, honest recall, zero sockets.