App Store Connect MCP server — manage iOS/macOS apps, TestFlight, in-app subscriptions, and App Store metadata from Cursor, Claude, or any Model Context Protocol client. Uses official App Store Connect API.
This server demonstrates solid definition quality with consistent naming patterns, comprehensive parameter schemas, and appropriate tool annotations. All 18 tools follow verb_noun naming conventions (create-, get-, list-, update-). Tool descriptions are present and mostly adequate (median ~120 chars), though some lack strategic context about when to use them vs. related tools. Parameter schemas are well-structured with zod validation, type declarations, and most parameters have descriptions. However, output schemas are not documented, tools return raw JSON stringified API responses without describing the expected fields. Error handling is minimal (unwrapApiResult appears to throw without guidance). The server demonstrates competent foundational work but lacks the polish needed for 80+: descriptions could be more LLM-optimized (currently state WHAT but not always WHEN or WHY), no documented output schemas, and no recovery guidance on errors.
Create a new App Store version for an app (platform + version string). Optionally attach a build.
Get detailed information about a specific app
Get app availability (territories where the app is available). Use list-territories for territory list.
Get app info for one territory: age rating, category, app store state. IDs from list-app-infos.
Get App Review details for an App Store version: contact info, demo account, notes for reviewers. Set these before submitting for review.
Get detailed information about a specific App Store version (metadata, state, build link)
Output schemas not documented. Tools return raw JSON-stringified API responses (via JSON.stringify(data, null, 2)) without specifying which fields agents should expect. This forces LLMs to infer structure from examples, risking misinterpretation on edge cases.
Error handling lacks recovery guidance. The unwrapApiResult() function appears to throw without context. No tool provides recovery hints like 'If app not found, try list-apps with filter.bundleId' or distinguishes between retryable vs. fatal errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 73 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 48 | - | v1 |
List App Store categories (reference for app metadata)
List app encryption declarations (export compliance, encryption usage)
List app infos for an app (one per territory): age rating, app store state, category. Use get-app-info for a single territory.
List localizations for a specific App Store version (metadata per locale)
List App Store versions for an app (by app ID)
Get a list of all apps in App Store Connect
List TestFlight (beta) app localizations (feedback email, marketing URL, description per locale)
List TestFlight (beta) app review details for an app (contact info, demo account, notes)
List TestFlight (beta) app review submissions for a build
Update App Review details for a version: contact, demo account, notes. Required before submit for review if app needs login or special instructions.
Update an App Store version: assign a build, set version string, copyright, release type, or downloadable flag.
Update localized metadata (description, keywords, URLs, what's new, promotional text) for a specific App Store version locale. Get the localization ID from list-app-store-version-localizations.
Descriptions lack strategic context. Most descriptions state WHAT the tool does but not WHEN to use it or how it differs from similar tools. For example, 'Get app info' (get-app-info) vs 'List app infos' (list-app-infos) lacks guidance on which to call first.
No response field documentation for chaining. If create-app-store-version returns an ID, downstream tools (update-app-store-version, get-app-store-version) must accept that ID. Response schema is not documented, forcing LLMs to guess field names and risk broken chains.
No pagination guidance in descriptions. List tools accept limit/filter but descriptions do not explain pagination behavior (does it return total count? next cursor?). For large result sets, agents may miss pagination and request all 10k items at once.
No destructive operation confirmation pattern. create-app-store-version and update tools modify state (WRITE risk) but lack confirmation or dry-run steps. No mention of whether calls are idempotent or what side effects occur on retry.