Install
$ agentstack add mcp-devinwang-app-store-connect-mcp ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ● Filesystem access Used
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
app-store-connect-mcp
> The complete Model Context Protocol (MCP) server for Apple's App Store Connect API. > 1221 tools. 100% coverage of every non-deprecated operation in Apple's official OpenAPI spec — TestFlight, Xcode Cloud, Game Center, App Clips, in-app purchases, subscriptions, review submissions, analytics, provisioning, and everything else Apple exposes. Works with Claude, Cursor, VS Code Copilot, Codex CLI, Gemini CLI, Windsurf, or any MCP client.
[](https://www.npmjs.com/package/apple-app-store-connect-mcp) [](https://www.npmjs.com/package/apple-app-store-connect-mcp) [](https://github.com/devinwang/app-store-connect-mcp/actions/workflows/ci.yml) [](LICENSE) [](package.json) [](#feature-matrix) [](https://developer.apple.com/documentation/appstoreconnectapi) [](https://modelcontextprotocol.io/) [](tsconfig.json)
See also: google-play-developer-mcp — the same philosophy for the Google Play Console.
Table of Contents
- [Why this exists](#why-this-exists)
- [Feature matrix](#feature-matrix)
- [Quick start](#quick-start)
- [Step-by-step setup](#step-by-step-setup)
- [Register with your MCP client](#register-with-your-mcp-client)
- [Usage examples](#usage-examples)
- [Migrating from
asc-mcp(zelentsov-dev)](#migrating-from-asc-mcp-zelentsov-dev) - [Security](#security)
- [Design notes](#design-notes)
- [Contributing](#contributing)
- [Version history](#version-history)
- [References](#references)
Why this exists
App Store Connect is huge. Apple's own OpenAPI spec currently lists 1208 operations across 192 resource groups — TestFlight, Xcode Cloud, Game Center, App Clips, in-app purchases, subscriptions, offer codes, review submissions, alternative distribution (EU DMA), analytics, metrics, privacy manifests, provisioning, users… the list goes on.
Every community MCP covers a slice. None covers everything.
app-store-connect-mcp does.
| Property | This server | Typical community MCP | |---|---|---| | App Store Connect API coverage | ✅ 1200+ tools (100% of spec v4.3) | Partial (usually 50–150 tools) | | Xcode Cloud | ✅ all ciProducts / ciWorkflows / ciBuildRuns / ciBuildActions / ciArtifacts / ciIssues / ciTestResults | ❌ | | Game Center | ✅ achievements, leaderboards, groups, matchmaking, vocabularies | ❌ | | App Clips | ✅ default + advanced experiences, review details, header images | ❌ | | Review Submissions v2 | ✅ | Often still on the legacy appStoreVersionSubmissions | | Alternative distribution (EU DMA) | ✅ | ❌ | | App data usages (privacy) | ✅ | ❌ | | Multi-account (switch between dev accounts) | ✅ local registry | Usually one | | Credential safety | No .p8 content in repo, no keys in the process cache, strict .gitignore | Varies | | Spec-driven — auto-regenerate on new spec | ✅ npm run codegen | ❌ |
If you drive App Store Connect with an AI assistant — submission automation, TestFlight management, IAP / subscription catalog, review triage, analytics, or Xcode Cloud orchestration — this gives the assistant the full toolbox in one install.
Feature matrix
1221 tools total (as of spec v4.3):
- 6
accounts_*— local multi-account registry (add / list / switch / remove / update / current) - 2
auth_*—auth_status(readiness) andauth_revoke_cache - 1208 auto-generated from the official App Store Connect OpenAPI spec, one per operation, covering every resource group:
- Apps / App Infos / App Store Versions / App Store Version Localizations / Phased Releases / Version Submissions
- Review Submissions (v2) + Review Submission Items + App Store Review Attachments + App Store Review Details
- TestFlight: Beta Groups, Beta Testers, Beta App Review Details/Submissions, Beta App Localizations, Beta Build Localizations, Beta License Agreements, Beta Feedback Screenshot/Crash Submissions, Beta Invitees, Builds, Build Bundles, Build Bundle File Sizes
- Xcode Cloud: Ci Products, Ci Workflows, Ci Build Runs, Ci Build Actions, Ci Artifacts, Ci Issues, Ci Test Results, Ci Xcode Versions, Ci Mac Os Versions, Ci Scm Repositories / References / Pull Requests / Providers
- Game Center: Achievements, Leaderboards, Leaderboard Sets, Groups, Matchmaking Queues / Rule Sets / Rules / Teams, Activities, Player Scores / Achievements, App Versions, Enabled Versions, Details, Vocabularies, plus all Localizations / Images / Releases
- App Clips: App Clips, Default / Advanced Experiences, Default / Advanced Experience Localizations, Header Images, Advanced Experience Images, App Store Review Details
- In-App Purchases: IAP v2, Subscriptions, Subscription Groups, Subscription Offer Codes (custom + one-time-use), Subscription Prices, Subscription Promotional Offers, Subscription Introductory Offers, Subscription Availabilities, Win-back Offers, Promoted Purchases
- Pricing & Availability: App Prices, App Price Points, App Price Schedules, App Availabilities V2, Territories, Territory Availabilities
- Custom Product Pages + PPO (A/B testing): App Custom Product Pages, Versions, Localizations, App Store Version Experiments V2 + Treatments + Localizations
- Screenshots & Previews: App Screenshots, App Screenshot Sets, App Previews, App Preview Sets, App Event Screenshots, App Event Video Clips
- Provisioning: Bundle Ids, Bundle Id Capabilities, Certificates, Devices, Profiles, Pass Type Ids
- Users & Access: Users, User Invitations, Actors, Sandbox Testers
- Encryption / Compliance: App Encryption Declarations + Documents, Age Rating Declarations, App Data Usages + Categories + Purposes + Data Protections + Publish State, Accessibility Declarations, End User License Agreements
- Alternative Distribution (EU DMA): Alternative Distribution Keys, Domains, Packages, Package Versions / Variants / Deltas, Marketplace Search Details, Marketplace Webhooks
- Analytics: Analytics Reports, Report Requests, Report Instances, Report Segments, Diagnostic Signatures
- Metrics: App Perf, Build Perf, Power Perf, Diagnostic Logs
- Sales & Finance: Sales Reports, Finance Reports
- Reviews: Customer Reviews, Customer Review Responses
- Routing App Coverages, App Categories, App Events + Localizations, Android ↔ iOS App Mapping, External Purchase Collectors…
- 5 hand-written helpers for flows that don't map cleanly to a single operation:
asset_upload_file— step 2 of the 3-step asset upload protocol (screenshots, previews, review attachments, IAP review screenshots, App Clip header images, Game Center images, routing app coverages)sales_reports_download— downloads and un-gzips sales reports, returns parsed TSVfinance_reports_download— same for finance reportsanalytics_report_instance_wait— poll until a report isCOMPLETED/FAILEDci_build_run_wait— poll an Xcode Cloud build run to completion
Run auth_status, then apps_get_collection to verify end-to-end.
Quick start
Install from npm:
npm install -g apple-app-store-connect-mcp
Or run without installing:
npx -y apple-app-store-connect-mcp
> About the package name. The package on npm is apple-app-store-connect-mcp. After install, the command on your $PATH is app-store-connect-mcp (the bin name) — that's what your MCP client config below points at.
Then add to your MCP client config (example, Claude Code):
{
"mcpServers": {
"app-store-connect": {
"command": "app-store-connect-mcp"
}
}
}
Finally, register your App Store Connect API key (details below):
accounts_add
name: my-app
keyId: AB12CD34EF
issuerId: 69a6de70-...
keyFile: /Users/you/.config/app-store-connect-mcp/AuthKey_AB12CD34EF.p8
Step-by-step setup
1. Create an App Store Connect API key
- Open App Store Connect.
- Users and Access → Integrations → App Store Connect API.
- Click Generate API Key (requires Account Holder or Admin role).
- Name it, choose the access level you want (Admin, Developer, Finance, Marketing, etc.), and Generate.
- Copy the Key ID and Issuer ID (displayed at the top of the page).
- Click Download API Key. This gives you an
AuthKey_.p8file. You only get this download once. Store it outside any git repo, for example at~/.config/app-store-connect-mcp/AuthKey_AB12CD34EF.p8withchmod 600.
2. Register the key with this MCP server
Launch any MCP client that has the server configured, then call:
accounts_add
name: my-app
keyId:
issuerId:
keyFile: /absolute/path/to/AuthKey_XXXXXXXXXX.p8
description: (optional)
3. Verify
auth_status
Should return { source: "accounts", tokenAcquired: true, expiresAt: ... }.
apps_get_collection
Lists the apps the key can see.
4. Managing multiple accounts
accounts_add name: client-a keyId: ... issuerId: ... keyFile: ...
accounts_add name: client-b keyId: ... issuerId: ... keyFile: ...
accounts_switch name: client-b
accounts_list
All subsequent calls target the currently-switched account.
Environment-variable compatibility mode
For compatibility with older setups (e.g. zelentsov-dev/asc-mcp), the server also accepts:
ASC_KEY_ID="..."
ASC_ISSUER_ID="..."
ASC_PRIVATE_KEY_PATH="/absolute/path/to/AuthKey_XXX.p8"
If no account is registered via accounts_add, the server falls back to these env vars. accounts_* tools always take precedence.
Register with your MCP client
Claude Desktop
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"app-store-connect": {
"command": "app-store-connect-mcp"
}
}
}
Claude Code
claude mcp add app-store-connect app-store-connect-mcp
Or edit ~/.claude.json:
{
"mcpServers": {
"app-store-connect": {
"command": "app-store-connect-mcp"
}
}
}
Cursor
Settings → MCP → Add new MCP server:
{
"app-store-connect": {
"command": "app-store-connect-mcp"
}
}
VS Code (GitHub Copilot agent mode)
.vscode/mcp.json:
{
"servers": {
"app-store-connect": {
"type": "stdio",
"command": "app-store-connect-mcp"
}
}
}
Codex CLI / Gemini CLI / Windsurf / Continue
Any MCP-compliant client accepts the same command entry — point it at the globally installed app-store-connect-mcp binary, or at node /path/to/dist/index.js when running from source.
Running from source (no global install)
git clone https://github.com/devinwang/app-store-connect-mcp.git
cd app-store-connect-mcp
npm install
npm run build
Then in your MCP client config:
{
"mcpServers": {
"app-store-connect": {
"command": "node",
"args": ["/absolute/path/to/app-store-connect-mcp/dist/index.js"]
}
}
}
Usage examples
Check which apps your key can see
accounts_switch name: my-app
auth_status
apps_get_collection
Fetch a build by version + buildNumber and submit it to TestFlight
builds_get_collection
"filter[preReleaseVersion.version]": "1.2.0"
"filter[version]": "147"
beta_groups_get_collection
"filter[app]":
"fields[betaGroups]": "name,publicLinkEnabled"
builds_beta_groups_create_to_many_relationship
id:
body:
data:
- type: betaGroups
id:
builds_update_instance
id:
body:
data:
type: builds
id:
attributes:
expired: false
Upload a screenshot (3-step asset flow)
app_screenshots_create_instance
body:
data:
type: appScreenshots
attributes:
fileName: "en-US-iphone-6_9-1.png"
fileSize: 2415122
relationships:
appScreenshotSet:
data: { type: appScreenshotSets, id: }
# → response includes the new `data.id` (asset is now AWAITING_UPLOAD)
asset_upload_file
filePath: /abs/path/to/screenshot.png
assetType: appScreenshots # preferred: tool fetches uploadOperations
assetId: # server-side (signature stays server-side)
# (legacy: pass `uploadOperations: [...]` from the create response instead)
app_screenshots_update_instance
id:
body:
data:
type: appScreenshots
id:
attributes:
uploaded: true
sourceFileChecksum:
Trigger an Xcode Cloud build and wait for completion
ci_build_runs_create_instance
body:
data:
type: ciBuildRuns
relationships:
workflow:
data: { type: ciWorkflows, id: }
# → response includes `data.id`
ci_build_run_wait
id:
timeoutMs: 3600000
Respond to a customer review
customer_reviews_get_collection
"filter[app]":
"sort": "-createdDate"
"limit": 10
customer_review_responses_v1_create_instance
body:
data:
type: customerReviewResponses
attributes:
responseBody: "Thanks for the feedback — we fixed this crash in 1.2.1. Please give it another try!"
relationships:
review:
data: { type: customerReviews, id: }
Pull a sales report (one day)
sales_reports_download
"filter[frequency]": DAILY
"filter[reportType]": SALES
"filter[reportSubType]": SUMMARY
"filter[vendorNumber]": "12345678"
"filter[reportDate]": "2026-04-20"
Returns parsed rows. Add parse: false to get raw TSV.
Create + activate a subscription
subscription_groups_create_instance
body: { data: { type: subscriptionGroups, attributes: { referenceName: "Premium" }, relationships: { app: { data: { type: apps, id: } } } } }
subscriptions_create_instance
body: { data: { type: subscriptions, attributes: { productId: "com.example.premium.monthly", name: "Premium Monthly", subscriptionPeriod: "ONE_MONTH" }, relationships: { group: { data: { type: subscriptionGroups, id: } } } } }
subscription_prices_create_instance
body: { data: { type: subscriptionPrices, relationships: { subscription: { data: { type: subscriptions, id: } }, territory: { data: { type: territories, id: "USA" } }, subscriptionPricePoint: { data: { type: subscriptionPricePoints, id: } } } } }
Migrating from asc-mcp (zelentsov-dev)
This server replaces github.com/zelentsov-dev/asc-mcp. Key differences:
- Scope. That server implements ~90 tools; this one implements all 1208 spec operations plus helpers.
- Tool names.
zelentsov-dev/asc-mcpuses simplified names likeapps_search,reviews_list,app_versions_submit_for_review. This server uses Apple's officialoperationIdsnake-cased —apps_get_collection,customer_reviews_get_collection,review_submissions_create_instance. There's no auto-translation: update any prompts or scripts that assumed the old names. - Credential compat. The same env vars (
ASC_KEY_ID,ASC_ISSUER_ID,ASC_PRIVATE_KEY_PATH) still work, so you don't need to move the.p8to migrate. You'll get a one-time stderr warning recommending you register viaaccounts_addfor multi-account support. company_*→accounts_*. Rename mental model: a "company" in the old server is an "account" here.
A comprehensive name-by-name mapping is included in docs/MIGRATION.md.
Security
This repo ships with zero credentials. You bring an App Store Connect API .p8; the server records only its path.
What is and isn't on disk
| Where | What | |---|---| | ~/.app-store-connect-mcp/accounts.json | Account names, key ids, issuer ids, key-file paths, descriptions. No secrets. Written with 0600 permissions, directory 0700. | | Wherever you placed your AuthKey_*.p8 | The actual private key. Never committed. Never copied into the server's memory longer than one JWT signing. | | Repo contents | Code only. No fixtures, no example keys, no real key ids. |
What's in
…
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: devinwang
- Source: devinwang/app-store-connect-mcp
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.