appstoreconnect-mcp
Provides tools for managing apps, subscriptions, pricing, in-app purchases, and promotional offers on the Apple App Store Connect platform.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@appstoreconnect-mcplist my apps"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
appstoreconnect-mcp
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.
Install (zero-config)
npx @akoskomuves/appstoreconnect-mcp initThe wizard:
Opens App Store Connect → Keys so you can download a
.p8(skipped if you already have one).Copies the key to
~/.appstore/withchmod 600.Asks for your Issuer ID and (auto-detected) Key ID.
Verifies auth with a real API call before writing anything.
Detects which MCP clients you have installed — Claude Code, Claude Desktop, Cursor, Windsurf — and registers itself in the ones you pick.
When something looks off later, run a read-only diagnostic:
npx @akoskomuves/appstoreconnect-mcp doctorManual install
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:
{
"mcpServers": {
"appstoreconnect": {
"command": "npx",
"args": ["-y", "@akoskomuves/appstoreconnect-mcp"],
"env": {
"ASC_ISSUER_ID": "...",
"ASC_KEY_ID": "...",
"ASC_PRIVATE_KEY_PATH": "~/.appstore/AuthKey_XXXXXXXXXX.p8"
}
}
}
}Or via Claude Code's CLI:
claude mcp add appstoreconnect \
-e ASC_ISSUER_ID=... \
-e ASC_KEY_ID=... \
-e ASC_PRIVATE_KEY_PATH=~/.appstore/AuthKey_XXXXXXXXXX.p8 \
-- npx -y @akoskomuves/appstoreconnect-mcpRelated MCP server: asc-mcp
Configure
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 |
| Issuer UUID from the Keys page |
| 10-character Key ID |
| Path to your downloaded |
The .p8 file is a private key — never commit it. Recommended: ~/.appstore/AuthKey_XXXXXXXXXX.p8 outside any repo.
Optional: In-App Purchase signing key
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 |
| Issuer UUID from the In-App Purchase keys tab (different from |
| 10-character Key ID for the IAP key |
| Path to the IAP signing |
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.
Optional: vendor number (sales + finance reports)
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 |
| 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.
Tools
Apps
asc_list_apps— list apps (filter bybundleId)asc_get_app— fetch one app by ID
Subscriptions
asc_list_subscription_groups— groups for an appasc_list_subscriptions— auto-renewable subscriptions in a groupasc_list_subscription_prices— current price schedule per subscriptionasc_list_subscription_price_points— valid price points for a subscription in a territory. PassnearAmountto narrow the response to the nearest tiers around a target price.
Subscription pricing (writes)
asc_post_subscription_price— schedule a price change for one territoryasc_delete_subscription_price— cancel a pending scheduled change
App pricing (paid non-subscription apps)
asc_list_app_prices— current price schedule for an app, splitting manual overrides from auto-derived prices and surfacing the base territoryasc_list_app_price_points— valid Apple price tiers for an app in a given territory (~600+ tiers per territory). PassnearAmount(target price) and optionalnearCount(default 10) to narrow the response to the nearest tiers — Apple does not support a near-amount filter server-side, so the full list is still paginated but only the nearest tiers are surfaced.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 territory with nostartDate, and requires explicitacknowledgeReplacesAll: true. A separateacknowledgeDeletesScheduledIfBaseChangesack is required when changing the base territory (Apple wipes pending scheduled changes on base-change). Apps have no grandfather mechanism — new schedules activate atomically at each entry'sstartDate.
In-app purchases (consumables, non-consumables, non-renewing subs)
asc_list_iaps— list IAPs for an app (v2 surface only — auto-renewable subscriptions are covered by the Subscriptions tools above). Filterable byinAppPurchaseTypeandstate. If this returns zero rows for an app you know has IAPs, the IAPs may be legacy-only and need to be migrated in the App Store Connect web UI before they appear here.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. SamenearAmount/nearCountnarrowing as the app and subscription price-point tools.asc_post_iap_price_schedule— replace the entire IAP price schedule (same whole-schedule replace semantics asasc_post_app_price_schedule:acknowledgeReplacesAll: true, base-territory entry with nostartDate, base-change ack required). No grandfather mechanism — same as apps.
Subscription introductory offers
Introductory offers target new subscribers — the discounted "first window" before the regular price kicks in.
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 offer with noterritory) surfaces asTERR=(all)in the table.asc_get_subscription_introductory_offer— fetch one offer by ID.asc_post_subscription_introductory_offer— create an offer. ThreeofferModes:FREE_TRIAL(no price; omitpricePointId),PAY_AS_YOU_GO(charge the offer price each period fornumberOfPeriodsperiods),PAY_UP_FRONT(single charge for the whole duration). PassterritoryIdto target one market, or omit it for Apple's "all territories" wildcard (uses the literal price point in every market — no auto-FX). Server-side validation refusesPAY_*withoutpricePointId,PAY_AS_YOU_GOwithoutnumberOfPeriods, andendDate ≤ startDate— Apple's error is surfaced inline otherwise.asc_patch_subscription_introductory_offer— narrow update path: onlystartDate,endDate, andpricePointIdcan 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; PATCHendDateto today to stop it instead.
Subscription promotional offers
Promotional offers target existing or lapsed subscribers — opposite eligibility from intro offers, set by the resource type itself (no per-offer flag). Apple caps active promo offers at 10 per subscription. After creation, only the per-territory prices can be edited — name, offerCode, offerMode, duration, and numberOfPeriods are immutable.
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 andofferCodecollisions, refusing with a clear remedy message instead of letting Apple 409.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 tool'smode: 'replace' | 'add' | 'remove'parameter hides the footgun —'add'reads current prices and merges,'remove'reads and filters.asc_delete_subscription_promotional_offer— DELETE → 204.
Subscription win-back offers
Win-back offers target lapsed subscribers — customers who previously subscribed and churned — and Apple surfaces them automatically to eligible customers based on the offer's eligibility rules (or through your own StoreKit messaging). This is the third offer type alongside introductory and promotional. Richer than promo offers: they add eligibility targeting, a schedule, priority, and an auto-asset intent. referenceName, offerId, duration, offerMode, periodCount, targetSubscriptionPlanType, and the prices are immutable after creation.
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 ascustomerEligibilityPaidSubscriptionDurationInMonths,customerEligibilityTimeSinceLastSubscribedInMonths(an{ minimum, maximum? }range), and an optionalcustomerEligibilityWaitBetweenOffersInMonths. Pre-flightsofferIdcollisions and validates the range +endDate > startDate.asc_patch_subscription_win_back_offer— update the mutable attributes only: eligibility,startDate/endDate,priority, andpromotionIntent. To change identity, mode, duration, periods, or prices, delete and re-create.asc_delete_subscription_win_back_offer— DELETE → 204.
IAP & subscription review assets
The review screenshot Apple requires before an in-app purchase or subscription can be submitted, plus the optional promotional images. Four resources, each on the same three-step upload flow as app screenshots (reserve → PUT chunks → commit), with a composite asc_upload_* tool that does all three from a local file. Wire gotcha handled for you: the IAP image relates via inAppPurchase while the IAP review screenshot uses inAppPurchaseV2.
Images (to-many, per IAP / subscription):
asc_list_{iap,subscription}_images·asc_get_*·asc_upload_*(composite) ·asc_post_*/asc_patch_*(raw reserve/commit) ·asc_delete_*.Review screenshots (to-one, per IAP / subscription):
asc_get_{iap,subscription}_review_screenshot(returns the single one, or null) ·asc_upload_*·asc_post_*/asc_patch_*·asc_delete_*. Because it's to-one, the upload/reserve tools refuse if one already exists — delete it first.
Subscription offer signing (in-app redemption)
The cryptographic signer that makes promo/intro offers redeemable in your iOS app via StoreKit. Uses a separate signing key from the ASC API key — issued at App Store Connect → Users and Access → Integrations → In-App Purchase. See the optional config section for env vars. Built on Apple's official @apple/app-store-server-library.
asc_sign_promotional_offer_legacy— legacy ECDSA-concatenated signature used by StoreKit 1'sSKPaymentDiscountand the original StoreKit 2Product.PurchaseOption.promotionalOffer(offerID:keyID:nonce:signature:timestamp:)API. Returns the base64 signature plus the nonce, timestamp, and keyId for the caller to pass to StoreKit. Auto-generates a UUID nonce and current timestamp; both overridable for testing.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 serialization directly.transactionId(the customer'sappTransactionId) is optional but strongly recommended.asc_sign_introductory_offer_eligibility— JWS v2 withaud="introductory-offer-eligibility". Lets you override StoreKit's default introductory-offer eligibility check (e.g. grant a returning customer another trial). New in WWDC 2025.
All signatures are valid for 24 hours from signing time — re-sign per redemption attempt rather than pre-signing and caching.
Territories
asc_list_territories— all 175 App Store territories
PPP rebalancing
ppp_load_index— return the bundled Apple Music Individual-plan price snapshot used as the PPP signalppp_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 configurable round strategy and floor). PassresourceType: "subscription"(default) withsubscriptionId,resourceType: "app"withappIdfor paid apps,resourceType: "iap"withiapId,resourceType: "introductoryOffer"withsubscriptionIdplusofferMode/duration(andnumberOfPeriodsforPAY_AS_YOU_GO), orresourceType: "promotionalOffer"withsubscriptionIdplusofferMode/duration/promoOfferName/promoOfferCode(andnumberOfPeriodsforPAY_AS_YOU_GO).ppp_apply_proposal— recompute and apply the proposal against ASC after confirming via MCP elicitation (orconfirm: truefor unattended use). Refuses if any row drops by more thanmaxDropPct(default 90%); skips territories where ASC billing currency ≠ Apple Music currency.For subscriptions: per-territory
subscriptionPricesPOSTs, paced atmaxConcurrency(default 2), retrying 429s automatically; existing subscribers grandfathered whenpreserveCurrentPrice: true(default).For apps and IAPs: a single whole-schedule-replace POST (one HTTP call, atomic). Apps/IAPs have no grandfather mechanism — new prices activate at each entry's
startDate. RequiresacknowledgeDeletesScheduledIfBaseChanges: truewhen changing the base territory (Apple wipes pending scheduled changes on base-change).For introductory offers: per-territory
subscriptionIntroductoryOffersPOSTs, paced atmaxConcurrency. The Δ column compares the snapped offer price against the current regular sub price in that territory, so-50%means the offer is half off the sub.FREE_TRIALis rejected (no price to compute — useasc_post_subscription_introductory_offerwithterritoryIdomitted for a single global free trial). Intro offers are additions, not replacements — Apple returns 409 if an active offer already exists for a(sub, territory)cell, and those rows show asfailedin the result table.For promotional offers: one atomic POST to
/v1/subscriptionPromotionalOfferscreates the offer + all per-territory PPP-snapped prices in a single request. Create-only — refuses ifofferCodecollides with an existing offer or the sub is at Apple's 10-offer cap.FREE_TRIALrejected (no price to compute). Same Δ-vs-current-sub-price reporting as intro offers.
Response shape
Every list/get tool returns a compact text table by default — designed for an LLM to read without burning context. Every tool also accepts:
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 followslinks.nextand merges + dedupesincludedresources across pages.
Sparse fieldsets (fields[type]=...) are applied per tool to avoid pulling unused attributes. The whole 175-territory price schedule comes back in one paginated call (200/page) at roughly 1/10th the size of the unfiltered payload.
Protocol support
Speaks the MCP 2026-07-28 revision and the 2025-era protocol from the same build — your client picks. There is nothing to configure either way.
On 2026-07-28 the server is stateless (no initialize handshake; capabilities come from server/discover), and the write-confirmation prompt uses multi-round-trip requests: ppp_apply_proposal returns an input_required result, your client shows the acknowledgement, and the same tool call is re-issued with your answer. Clients that don't support elicitation are told to re-run with confirm: true, exactly as before.
The proposal is recomputed on re-entry rather than carried across the round trip, so prices are re-read from App Store Connect immediately before anything is written — never reused from before you paused to consider. The cost is that an interactive apply computes twice: on a 64-territory subscription that is roughly 95s rather than 48s. Unattended runs with confirm: true never ask, so they compute once and are unaffected.
Production behavior
A few details worth knowing before running ppp_apply_proposal against a live App Store Connect account:
Rate limit handling. Apple throttles POST endpoints around 50/min.
client.requesthonoursRetry-Afterheaders and falls back to exponential backoff (2s → 60s, capped, up to 6 retries). A 60-territory rebalance pacing through retries finishes in about 2 minutes wall time with zero manual intervention.Currency-mismatch skip. If the bundled Apple Music index lists a territory in one currency (say BHD) but ASC bills your subscription in another (USD), the PPP-FX ratio breaks dimensionally. The proposal marks those rows
currency-mismatch (asc=USD, am=BHD)and excludes them from the apply set. Common in Gulf USD-billed markets (BHR, KWT, OMN). Set those manually if you want to.Sanity floor.
floorFactor(default 0.15) is a hard lower bound on per-territory drops as a fraction of the current price — guards against a stale index entry collapsing a price to near-zero. For a more conservative rebalance, pass 0.30 or 0.50.Sanity ceiling on drops.
maxDropPct(default 90%) refuses to apply any run where a single row drops more than this. If you've ever seen Apple Music tank a market price aggressively, this catches the resulting outlier before you write it to ASC.Refresh the snapshot when you care.
data/apple-music-prices.jsonis a hand-curated snapshot. Each entry is dated; the snapshot date is shown in proposal output. Pull request a refresh when Apple Music prices move and the project will fold it in.
PPP rebalancing skill
The examples/ppp-rebalance/ directory contains a Claude Code skill that wraps these tools into a Purchasing Power Parity workflow (dry-run → schedule → rollback) with the gotchas baked in.
mkdir -p ~/.claude/skills && \
ln -s "$PWD/examples/ppp-rebalance" ~/.claude/skills/ppp-rebalanceThen ask Claude: "Rebalance my subscription prices using the ppp-rebalance skill."
Roadmap
v0.1–v1.0 cover monetization + beta distribution + the full App Store product-page surface + live promotional events + territory / rollout / export compliance + push notifications + revenue/analytics reporting + customer feedback + product-page A/B testing + runtime health/accessibility + pre-orders/real-FX + EU DMA alternative distribution: the full pricing/IAP/offers surface (subscriptions, paid apps, IAPs, intro offers, promo offers, offer-code campaigns, signers), TestFlight (builds, beta groups, beta testers, beta localizations, beta review submissions), the per-locale product-page copy (release notes, descriptions, keywords, promotional text), the release lifecycle (App Store Version write + V2 Review Submission), App Info / category / tag / search-keyword surfaces (v0.12), screenshot + preview asset upload + Custom Product Pages (v0.13), In-App Events + Promoted Purchases (v0.14), App Availability + Phased Release + Encryption Declarations (v0.15), the TestFlight feedback loop — beta feedback screenshots/crashes, build notifications, public-link recruitment criteria (v0.16), Webhooks — per-app event push with delivery history, redelivery, and test pings (v0.17), sales/finance report downloads + the Analytics Reports chain (v0.18), customer reviews — read, respond, summarizations (v0.19), App Store Version Experiments — product-page A/B tests with treatments + variant assets (v0.20), diagnostics/perf-power/accessibility surfaces (v0.21), per-territory pre-orders + real-FX PPP (v0.22), and EU DMA / alternative distribution (v1.0). The planned roadmap is complete. The rest is fertile ground for LLM-driven ops because so much App Store work is judgment-heavy text — review responses, pricing positioning — that a model can draft and a human approves.
Phase | Domain | What it unlocks |
v0.1 ✓ | Apps · subscriptions · subscription pricing · PPP rebalance | Schedule per-territory price changes by purchasing power. |
v0.2.0 ✓ | App pricing (non-subscription): list / list price points / replace schedule · PPP compute extended to apps | PPP dry-run against paid apps; manual apply via |
v0.3.0 ✓ | In-app purchases (v2): list / get / price schedule reads + writes | Same monetization surface for IAPs (consumables, non-consumables, non-renewing subs). Auto-renewables stay on the Subscriptions tools. |
v0.4.0 ✓ |
| One-shot PPP rebalance for every paid surface, not just subs. |
v0.5.0 ✓ | Subscription introductory offers (free trial / pay-as-you-go / pay-up-front): list / get / post / patch / delete · PPP extended to intro offers | PPP-aware "first month" / "first three months" promos that adapt to local purchasing power instead of a literal $0.99 everywhere. |
v0.6.0 ✓ | Subscription promotional offers (existing/lapsed subscribers): list / get / post / patch-prices / delete · PPP extended to promo offers (create-only, atomic single-POST) | Win-back campaigns with PPP-aware per-territory pricing. |
v0.7.0 ✓ | Subscription offer signing: three signers (legacy ECDSA, JWS v2 promo, JWS v2 intro eligibility) covering every current Apple-supported format | StoreKit redemption end-to-end — promo offers from v0.6 are now usable in an iOS app, not just configurable in ASC. |
v0.8.0 ✓ | Subscription offer codes (campaign CRUD-minus-D · per-territory prices · one-time-use code batches · text/csv export via /values) · PPP extended to offer-code campaigns | Promo-code redemption campaigns (App Store Connect → "Offer codes") — generate, deactivate, export CSV. |
v0.8.1 ✓ | Subscription offer codes follow-ons: custom (multi-use) codes (list/post/patch) · | Public-facing redeemable strings (one string, many redemptions) + sandbox-vs-production batch tagging + non-renewing one-shot offer codes. |
v0.9.0 ✓ | TestFlight surface across 5 sub-domains: builds (list/get/expire/build-beta-detail) · beta groups (CRUD + tester linkage + build linkage) · beta testers (CRUD + invitation send/resend) · beta build localizations (CRUD per build × locale) · beta app localizations (CRUD per app × locale) · beta app review submissions + details · pre-release versions (read-only). 32 new tools. | "Invite these 30 testers to the new build with this test note in EN/ES/JA." |
v0.10.0 ✓ | App-store product page localizations across 4 surfaces: App Store versions (read-only list/get) · App Store version localizations (CRUD — release notes / description / keywords / promotional text / marketing+support URLs) · subscription localizations (CRUD — name + description per locale) · IAP localizations (CRUD — same shape on v2 IAP surface). 17 new tools. | The biggest LLM win. Translate release notes into 35 locales using existing localizations as voice reference, present diff, push on approval. |
v0.10.1 ✓ | Fix: state-aware pre-check on | Avoid wasted PATCH round-trips against |
v0.11.0 ✓ | App Store Version write surface (create / patch / delete with state-gated delete) + V2 Review Submission flow (create draft → add items → submit/cancel + status reads). Closes the release loop — ship a new version end-to-end through the MCP without opening ASC. | "Translate release notes into 35 locales and submit version 2.5 for review." |
v0.12.0 ✓ | App Info (list/get + state-gated PATCH for category relationships) · AppInfoLocalization CRUD (name + subtitle + privacy URLs + privacy text per locale) · AppCategory catalog (read-only with subcategories included) · AppTag (list per app + PATCH | "Swap your app's secondary category from Travel to Sports, then update the subtitle across all 13 locales." |
v0.13.0 ✓ | Asset upload: Screenshots + App Previews (three-step reserve / chunk-PUT / commit, exposed as composite shortcuts ( | "Generate App Store screenshots for 12 locales from these source files, push them to a Custom Product Page variant called |
v0.14.0 ✓ | In-App Events: AppEvent + AppEventLocalization CRUD with 10-value state gate (refuses WAITING_FOR_REVIEW / IN_REVIEW), TerritorySchedule arrays (ISO 8601), and event screenshot + video clip upload (composite + raw three-step, reusing the v0.13 asset-upload helpers). Promoted Purchases: CRUD + per-app ordering linkage (bare-array PATCH; array order = storefront order). Pinned wire-key gotchas: | "Create an in-app event 'Salmon Season Opens' for your app running 2026-06-15 to 2026-07-15." |
v0.15.0 ✓ | App Availability v2 (POST-only full-replace; 3-letter ISO codes ARE the IDs; pre-order end-tool) + Phased Release (4-state lifecycle PATCH on AppStoreVersion) + Encryption Declarations (append-only declarations + build linkage + supporting-document upload reusing v0.13 asset-upload). Pinned wire-key gotchas: | "Enable your app in 3 new territories and start a phased release on version 2.5." |
v0.16 ✓ | TestFlight follow-ons: Beta Feedback Submissions (screenshot + crash feedback lists with build/tester/device filters, crash-log text fetch, deletes) + Build Beta Notifications (manual "new build available" ping; relationships-only POST, no attrs block at all) + Beta Recruitment Criteria (to-ONE per beta group; create/patch/delete + valid-options catalog + compatible-build check). Pinned wire-key gotcha: | "Summarize beta feedback on build 132 by frequency and severity, draft a triage list." |
v0.17 ✓ | Webhooks: per-app CRUD (5 required create attrs incl. write-only HMAC | "Set up a webhook so a Slack channel hears about every new beta build going live; list FAILED deliveries since yesterday and retry them." |
v0.18 ✓ | Sales + finance reports (NOT JSON:API — gzipped TSV downloads via new | "Why did MRR drop in Brazil last week? Compare to the rebalance activation date." |
v0.19 ✓ | Customer reviews: app-wide + version-scoped lists (rating/territory filters, | "Draft a response to every 1-star review on the latest version that mentions the export bug. Show me before posting." |
v0.20 ✓ | App Store Version Experiments V2 (product-page A/B tests, app-attached — deprecated v1 surface skipped): experiment CRUD with the started-flag lifecycle gate (⚠️ customer-facing once started; submit via the v0.11 review-submission flow first), treatments (+ alternate-icon testing), treatment localizations; variant screenshots/previews ride the existing v0.13 asset tools (parentType appStoreVersionExperimentTreatmentLocalizations). Pinned gotchas: | "Set up an A/B test of the blue icon vs the current one at 30% traffic, English + German screenshots." |
v0.21 ✓ | Runtime health + accessibility: diagnostic signatures per build (DISK_WRITES/HANGS/LAUNCHES hotspots, impact-weighted) + anonymized call-stack logs ( | "Which call stacks make build 2.5.0 hang? Compare its launch-time percentiles to the app baseline." |
v0.22 ✓ | Pre-orders per territory (PATCH territoryAvailabilities: available ⚠️ / releaseDate / preOrderEnabled — completes the v0.15 availability surface) + real-FX for currency-mismatch territories ( | "Open pre-orders in Japan for Sep 1; rebalance Gulf-territory prices using today's BHD/KWD/OMR rates." |
v1.0 ✓ | EU DMA / alternative distribution (entitlement-gated — tools explain the 403 when the account isn't enrolled): web-distribution domains (register/list/delete ⚠️), public signing keys (the private half never goes to Apple), per-version signed packages with pre-signed download URLs + variants + deltas, marketplace search details ( | "Package version 3.0 for web distribution and hand the signed URLs to the CDN." |
v1.1.0 ✓ | Subscription win-back offers — the third offer type, targeting lapsed subscribers (Apple surfaces them automatically to eligible churned customers): list / get / list-prices / post / patch / delete. Richer than promo offers: eligibility targeting (paid-duration + a time-since-last-subscribed | "Win back subscribers who churned 1–6 months ago with a three-month PPP-priced offer, auto-surfaced by Apple." |
| v1.2.0 ✓ | IAP + subscription review assets — the App Store review screenshot Apple requires before an IAP/subscription can be submitted, plus promotional images. Four resources (IAP/subscription × image/review-screenshot) on the v0.13 three-step upload flow, driven from one config table: composite asc_upload_* + raw reserve/commit/delete + reads. Images to-many, review screenshots to-one (upload refuses a duplicate). Wire gotcha handled: IAP image relates via inAppPurchase, IAP review screenshot via inAppPurchaseV2. 22 new tools. | "Attach the review screenshot to my new subscription so I can submit it." |
The v0.1→v1.0 roadmap is complete — every originally-planned surface has shipped. Post-1.0 work tracks Apple's API changes (new resources, contract drift — see scripts/audit-fieldsets.py): v1.1.0 adds win-back offers, v1.2.0 adds IAP/subscription review assets (closing the "can't submit without a review screenshot" gap).
Out of scope (Fastlane / Xcode already do these well): provisioning profiles, certificates, devices, capabilities, Game Center config.
Think of this as the LLM companion for App Store Connect ops. Fastlane is for the build/release pipeline; this is for the post-release knowledge work — release lifecycle, translation, pricing, ASO, customer feedback, in-store promotion, and analytics.
Each new domain is one file under src/domains/<name>.ts plus a register* call in src/index.ts. Contributions welcome — see CONTRIBUTING.md.
Develop
git clone https://github.com/akoskomuves/appstoreconnect-mcp.git
cd appstoreconnect-mcp
npm install
npm run dev # tsx watch mode
npm test
npm run buildSee CONTRIBUTING.md for the contributor flow (changesets, PR template, branch naming).
License
MIT © 2026 Akos Komuves
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityFmaintenanceAn MCP server to communicate with the App Store Connect API for iOS DevelopersLast updated25141329MIT
- Alicense-qualityAmaintenanceMCP server for App Store Connect API with 208 tools across 25 workers. Manage apps, builds, TestFlight, in-app purchases, subscriptions, reviews, provisioning, screenshots, analytics, and more — directly from Claude, Cursor, VS Code, or any MCP client. Multi-account support, worker filtering, JWT auth.Last updated51MIT
- AlicenseAqualityCmaintenanceA Model Context Protocol (MCP) server for Apple's App Store Connect API. Manage your iOS, macOS, tvOS, and visionOS apps directly from Claude, Cursor, or any MCP-compatible client.Last updated523624MIT
- Alicense-qualityDmaintenanceMCP server for shipping iOS apps, enabling screenshots of simulators, managing App Store Connect metadata, and submitting apps for review.Last updated15MIT
Related MCP Connectors
MCP server for Appcircle mobile CI/CD platform.
Create App Store screenshots, icons, ASO copy, localization, and revisions via hosted MCP.
MCP Server for agents to onboard, pay, and provision services autonomously with InFlow
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/akoskomuves/appstoreconnect-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server