App Store Connect for MCP clients: PPP pricing, subscriptions, TestFlight, reviews, reports & more
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Appstoreconnect MCP.
asc_list_appslist apps (filter by `bundleId`)
asc_get_appfetch one app by ID
asc_list_subscription_groupsgroups for an app
asc_get_subscription_groupfetch one group by ID
asc_list_subscriptionsauto-renewable subscriptions in a group
asc_get_subscriptionfetch one subscription by ID
A Model Context Protocol server for the Apple App Store Connect API. Drives apps, subscriptions, pricing, and more from any MCP-compatible client (Claude Code, Claude Desktop, Cursor, Windsurf).
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.
The wizard:
.p8 (skipped if you already have one).~/.appstore/ with chmod 600.When something looks off later, run a read-only diagnostic:
If you'd rather wire it up by hand, add to ~/.claude.json (Claude Code), claude_desktop_config.json (Claude Desktop), or your client's equivalent:
Or via Claude Code's CLI:
Generate an App Store Connect API key at App Store Connect β Users and Access β Integrations β Keys. Pricing writes need the Admin role; read-only operations work with App Manager.
| Variable | What |
|---|---|
ASC_ISSUER_ID | Issuer UUID from the Keys page |
ASC_KEY_ID | 10-character Key ID |
ASC_PRIVATE_KEY_PATH | Path to your downloaded AuthKey_XXXXXXXXXX.p8 file (~ is expanded) |
The .p8 file is a private key β never commit it. Recommended: ~/.appstore/AuthKey_XXXXXXXXXX.p8 outside any repo.
Only needed for the asc_sign_* tools (subscription offer redemption signing). Issue a second key at App Store Connect β Users and Access β Integrations β In-App Purchase β this is a separate key from the ASC API key above, generated on a different tab of the same page.
| Variable | What |
|---|---|
ASC_IAP_ISSUER_ID | Issuer UUID from the In-App Purchase keys tab (different from ASC_ISSUER_ID) |
ASC_IAP_KEY_ID | 10-character Key ID for the IAP key |
ASC_IAP_PRIVATE_KEY_PATH | Path to the IAP signing .p8 (~ is expanded) |
The server starts fine without these β only the asc_sign_* tools refuse with a setup message if they're missing. Set one or two but not all three and the server rejects with a clear error. Run appstoreconnect-mcp doctor to verify the key loads as a valid ES256 PKCS#8.
Only used by asc_get_sales_report / asc_get_finance_report. Your vendor number is account-level, shown at App Store Connect β Payments and Financial Reports next to your team name (a numeric string like 85123456).
| Variable | What |
|---|---|
ASC_VENDOR_NUMBER | Default vendor number for sales/finance report downloads |
Without it the two report tools still work β they just need vendorNumber passed per call (and their error message tells you where to find it). Note: downloading sales/finance reports requires an API key with the Admin, Finance, or Sales role.
asc_list_apps β list apps (filter by bundleId)asc_get_app β fetch one app by IDasc_list_subscription_groups β groups for an appasc_get_subscription_group β fetch one group by IDasc_list_subscriptions β auto-renewable subscriptions in a groupasc_get_subscription β fetch one subscription by IDasc_list_subscription_prices β current price schedule per subscription. One row per territory (~175 unfiltered) β pass territoryId to narrow to one marketasc_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.Creating the hierarchy itself β the step that used to send you to the App Store Connect web UI. Four names, only two of which customers ever see:
| Resource | Attribute | Who sees it |
|---|---|---|
SubscriptionGroup | referenceName | internal only |
SubscriptionGroupLocalization | name | customer β heading above the plan choices |
Subscription | name | internal only |
SubscriptionLocalization | name | customer β the individual plan |
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) belong in the same groupasc_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 409asc_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 subscription is deleted. subscriptionPeriod is optional at create but required before submission; the new product starts in MISSING_METADATA and the success message lists the remaining stepsasc_patch_subscription β name, subscriptionPeriod, familySharable, reviewNote, groupLevel. productId has no codepath here by construction. Nested offer/price arrays are deliberately unsupported β their wire semantic is replace, so a caller passing one offer would silently delete the rest; use the dedicated offer and price toolsasc_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 productThe customer-facing group heading β what the App Store renders above the plan choices, and what shows in Settings β Subscriptions. A group with no localizations cannot be submitted.
asc_list_subscription_group_localizations / asc_get_subscription_group_localizationasc_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 relationship key is subscriptionGroup, while Subscription calls the same parent groupasc_patch_subscription_group_localization β name / customAppName; locale is the immutable lookup keyasc_delete_subscription_group_localizationasc_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 β undated baseline β dated changes.
startDate for a subscription's first price in a territory. The opening row is the undated baseline; a dated first price is a price change with nothing to change from. Apple says so outright β "Invalid startDate. Create a starting price before creating future prices." β and distance doesn't help (1, 8 and 29 days out all 409).ENTITY_ERROR.RELATIONSHIP.INVALID β /data/relationships/subscriptionPricePoint/id). The price point is fine; Apple just can't price a territory the product isn't sold in. The tool translates both of these rather than passing the raw 409 through.preserveCurrentPrice defaults to true on a dated change and is omitted on a baseline, where there's no existing cohort to grandfather. The created row reads preserved: false until a newer price supersedes it; that is expected, not a grandfathering failureasc_delete_subscription_price β cancel a pending scheduled changeFactual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/appstoreconnect-mcp)<a href="https://allmcps.com/mcp/appstoreconnect-mcp"><img src="https://allmcps.com/api/badge/appstoreconnect-mcp?style=directory" alt="Appstoreconnect MCP on AllMCPs" /></a>