Skip to main content
Glama
App Store Connect MCP

App Store Connect MCP

by beautyfree

npm version License

A Model Context Protocol (MCP) server that connects Cursor, Claude Desktop, and other MCP clients to the official App Store Connect API—so you can manage iOS/macOS apps, TestFlight, in-app subscriptions, and store metadata via chat or automated tool calls instead of clicking through the App Store Connect UI.

Use it to: list and inspect apps, builds, and beta groups · manage TestFlight testers and review submissions · create and update subscription groups and prices · edit App Store version localizations and "What's New" · download sales and finance reports · list Xcode schemes and CI products. All with JWT auth and the same API Apple's own tools use.

Install

Cursor (install link):

Install MCP Server

Other clients (Claude Desktop, etc.):

npx add-mcp mcp-asc

Related MCP server: App Store Connect MCP Server

Configure

Add the server to your MCP config and set these environment variables:

Variable

Required

Description

APP_STORE_CONNECT_KEY_ID

Yes

API Key ID from App Store Connect

APP_STORE_CONNECT_ISSUER_ID

Yes

Issuer ID from App Store Connect

APP_STORE_CONNECT_P8_PATH

Yes

Path to your .p8 private key file

APP_STORE_CONNECT_VENDOR_NUMBER

For reports

Needed for sales/finance reports

Create an API key at App Store Connect → Users and Access → Integrations → App Store Connect API. Download the .p8 and note Key ID and Issuer ID.

Example (stdio):

{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "mcp-asc"],
      "env": {
        "APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
        "APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
        "APP_STORE_CONNECT_P8_PATH": "/path/to/AuthKey_XXXXX.p8",
        "APP_STORE_CONNECT_VENDOR_NUMBER": "YOUR_VENDOR_NUMBER_OPTIONAL"
      }
    }
  }
}

Example (HTTP SSE): Run npm run build then npm run start:http. Point your client at http://localhost:3001/mcp with the same env vars.

Tools

Tools are exposed in kebab-case. Use your MCP client to list them and see parameters. Summary by area:

Apps & metadata

  • list-apps, get-app, list-app-infos, get-app-info, get-app-availability

  • list-app-store-versions, get-app-store-version, create-app-store-version, update-app-store-version

  • list-app-store-version-localizations, list-app-categories, list-app-encryption-declarations, list-nominations

TestFlight / Beta

  • list-beta-groups, get-beta-group, list-beta-testers, get-beta-tester, add-beta-testers-to-group, remove-beta-testers-from-group

  • list-builds, get-build, list-build-beta-details, list-pre-release-versions, get-pre-release-version

  • list-beta-app-localizations, list-beta-app-review-details, list-beta-app-review-submissions, list-beta-license-agreements, get-beta-license-agreement, update-beta-license-agreement

Subscriptions

  • list-subscription-groups, list-subscription-group-subscriptions, get-subscription, create-subscription-group, create-subscription

  • create-subscription-availability, list-subscription-price-points, create-subscription-price, create-subscription-localization

Store & review

  • list-review-submissions, get-review-submission, submit-for-review, list-customer-reviews, create-customer-review-response

  • get-app-store-review-detail, update-app-store-review-detail

Other

  • list-bundle-ids, get-bundle-id · list-certificates, get-certificate · list-profiles · list-devices, get-device

  • list-users, get-user, list-user-invitations · list-territories · list-actors, get-actor

  • get-eula, update-eula · get-phased-release, create-phased-release · update-age-rating-declaration

  • list-schemes (Xcode), list-ci-products (Xcode Cloud)

  • download-sales-report, download-finance-report (require APP_STORE_CONNECT_VENDOR_NUMBER)

Development

Built with xmcp. One tool per file under src/tools/; each file exports metadata and a default handler.

npm install
npm run build
npm run start:stdio   # or npm run start:http for HTTP transport
npm run dev            # watch + run

Node 20+.

Open Plugins

This repository now includes Open Plugins-compatible metadata and layout:

  • .plugin/plugin.json for plugin metadata

  • .mcp.json for MCP server wiring

  • skills/app-store-connect/SKILL.md for installable skill context

Open Plugins standard: open-plugins.com

You can test locally by loading the plugin directory in a compatible host, for example:

claude --plugin-dir .

Listing in MCP catalogs

To add this server to the official MCP Registry, Cursor MCP Directory, cursor.store, and other catalogs, see docs/REGISTRY.md.

License

MIT.

Available Tools

69 tools
add-beta-testers-to-groupAdd beta testers to groupA
Idempotent

Add one or more beta testers to a TestFlight group. Tester IDs come from list-beta-testers.

Inputs: betaGroupId (required), betaTesterIds (required).

create-app-store-versionCreate app store versionA

Create a new App Store version for an app (platform + version string). Optionally attach a build.

Inputs: appId (required), platform (required), versionString (required), buildId, +2 more.

create-customer-review-responseCreate customer review responseA

Reply to an App Store customer review. One response per review; use list-customer-reviews to get review IDs.

Inputs: responseBody (required), customerReviewId (required).

create-phased-releaseCreate phased releaseA

Enable phased release for an App Store version (gradual rollout to users). Version must be approved or already in release.

Inputs: appStoreVersionId (required), phasedReleaseState.

create-subscriptionCreate subscriptionA

Create an auto-renewable subscription in a subscription group. Requires productId (permanent) and name. Then add localizations and prices (create-subscription-localization, create-subscription-price).

Inputs: name (required), productId (required), subscriptionGroupId (required), groupLevel, +3 more.

create-subscription-availabilityCreate subscription availabilityA

Set which territories the subscription is available in. Call this before create-subscription-price; otherwise adding a price often returns 409 ENTITY_ERROR.RELATIONSHIP.INVALID.

Inputs: territoryIds (required), subscriptionId (required), availableInNewTerritories.

create-subscription-groupCreate subscription groupA

Create a subscription group (container for auto-renewable subscriptions). Then add subscriptions with create-subscription.

Inputs: appId (required), referenceName (required).

create-subscription-localizationCreate subscription localizationA

Create a localized name/description for a subscription. Add one per locale (e.g. en-US, de-DE). Required for submission.

Inputs: name (required), locale (required), subscriptionId (required), description.

create-subscription-priceCreate subscription priceA

Attach a price to a subscription (by price point and optionally territory). Set subscription availability first with create-subscription-availability for the territory, or you may get 409 ENTITY_ERROR.RELATIONSHIP.INVALID. Use price point IDs from list-subscription-price-points; when you used filter.territory there, pass that same territoryId here.

Inputs: subscriptionId (required), subscriptionPricePointId (required), startDate, territoryId, +1 more.

download-finance-reportDownload finance reportA
Read-onlyIdempotent

Download a finance report (gzip TSV). Requires APP_STORE_CONNECT_VENDOR_NUMBER. Returns decompressed tab-delimited text.

Inputs: regionCode (required), reportDate (required), reportType, vendorNumber.

download-sales-reportDownload sales reportA
Read-onlyIdempotent

Download a sales and trends report (gzip TSV). Requires APP_STORE_CONNECT_VENDOR_NUMBER. Returns decompressed tab-delimited text.

Inputs: frequency (required), reportDate (required), version, reportType, +2 more.

get-actorGet actorA
Read-onlyIdempotent

Get actor (user or API key) by ID. Actors appear in review submissions and version history. Use list-actors with known IDs to resolve.

Inputs: actorId (required).

get-appGet appA
Read-onlyIdempotent

Get detailed information about a specific app

Inputs: appId (required), include.

get-app-availabilityGet app availabilityA
Read-onlyIdempotent

Get app availability (territories where the app is available). Use list-territories for territory list.

Inputs: appId (required).

get-app-infoGet app infoA
Read-onlyIdempotent

Get app info for one territory: age rating, category, app store state. IDs from list-app-infos.

Inputs: appInfoId (required).

get-app-store-review-detailGet app store review detailA
Read-onlyIdempotent

Get App Review details for an App Store version: contact info, demo account, notes for reviewers. Set these before submitting for review.

Inputs: appStoreVersionId (required).

get-app-store-versionGet app store versionA
Read-onlyIdempotent

Get detailed information about a specific App Store version (metadata, state, build link)

Inputs: appStoreVersionId (required).

get-beta-groupGet beta groupB
Read-onlyIdempotent

Get detailed information about a specific beta group

Inputs: betaGroupId (required).

get-beta-license-agreementGet beta license agreementA
Read-onlyIdempotent

Get TestFlight beta license agreement text for an app. Update with update-beta-license-agreement.

Inputs: betaLicenseAgreementId (required).

get-beta-testerGet beta testerA
Read-onlyIdempotent

Get detailed information about a specific beta tester

Inputs: betaTesterId (required).

get-buildGet buildA
Read-onlyIdempotent

Get detailed information about a specific build

Inputs: buildId (required).

get-bundle-idGet bundle IDA
Read-onlyIdempotent

Get detailed information about a specific bundle ID

Inputs: bundleIdId (required).

get-certificateGet certificateA
Read-onlyIdempotent

Get detailed information about a specific signing certificate

Inputs: certificateId (required).

get-deviceGet deviceA
Read-onlyIdempotent

Get detailed information about a specific registered device

Inputs: deviceId (required).

get-eulaGet EULAA
Read-onlyIdempotent

Get End User License Agreement (EULA) for an app. Returns agreement text and territory. Create/update via update-eula or App Store Connect UI.

Inputs: appId (required).

get-phased-releaseGet phased releaseA
Read-onlyIdempotent

Get phased release for an App Store version (gradual rollout state). Returns 404 if version has no phased release.

Inputs: appStoreVersionId (required).

get-pre-release-versionGet pre-release versionA
Read-onlyIdempotent

Get detailed information about a specific pre-release (TestFlight) version

Inputs: preReleaseVersionId (required).

get-review-submissionGet review submissionA
Read-onlyIdempotent

Get a single App Store review submission by ID (state, items, app, etc.)

Inputs: reviewSubmissionId (required), include.

get-subscriptionGet subscriptionA
Read-onlyIdempotent

Get one subscription by ID: productId, name, state, prices, review screenshot, introductory/promotional offers, etc.

Inputs: subscriptionId (required).

get-userGet userB
Read-onlyIdempotent

Get detailed information about a team member (user)

Inputs: userId (required).

list-actorsList actorsA
Read-onlyIdempotent

List actors (users or API keys) by ID(s). Use when you have actor IDs from review submissions or version history.

Inputs: filter.id (required), limit.

list-app-categoriesList app categoriesA
Read-onlyIdempotent

List App Store categories (reference for app metadata)

Inputs: limit, exists.parent, filter.platforms.

list-app-encryption-declarationsList app encryption declarationsA
Read-onlyIdempotent

List app encryption declarations (export compliance, encryption usage)

Inputs: limit, filter.app, filter.builds, filter.platform.

list-app-infosList app infosA
Read-onlyIdempotent

List app infos for an app (one per territory): age rating, app store state, category. Use get-app-info for a single territory.

Inputs: appId (required), limit.

list-appsList appsB
Read-onlyIdempotent

Get a list of all apps in App Store Connect

Inputs: limit, filter.id, filter.sku, filter.name, +1 more.

list-app-store-version-localizationsList app store version localizationsA
Read-onlyIdempotent

List localizations for a specific App Store version (metadata per locale)

Inputs: appStoreVersionId (required), limit, filter.locale.

list-app-store-versionsList app store versionsA
Read-onlyIdempotent

List App Store versions for an app (by app ID)

Inputs: appId (required), limit, filter.id, filter.platform, +2 more.

list-beta-app-localizationsList beta app localizationsA
Read-onlyIdempotent

List TestFlight (beta) app localizations (feedback email, marketing URL, description per locale)

Inputs: limit, filter.id, filter.app, filter.locale.

list-beta-app-review-detailsList beta app review detailsA
Read-onlyIdempotent

List TestFlight (beta) app review details for an app (contact info, demo account, notes)

Inputs: filter.app (required), limit, filter.id.

list-beta-app-review-submissionsList beta app review submissionsA
Read-onlyIdempotent

List TestFlight (beta) app review submissions for a build

Inputs: filter.build (required), limit, filter.betaReviewState.

list-beta-groupsList beta groupsA
Read-onlyIdempotent

Get a list of all beta groups (internal and external)

Inputs: limit, filter.id, filter.app, filter.name.

list-beta-license-agreementsList beta license agreementsA
Read-onlyIdempotent

List TestFlight (beta) license agreements. One per app. Use get-beta-license-agreement to read or update text.

Inputs: limit, filter.app.

list-beta-testersList beta testersA
Read-onlyIdempotent

Get a list of beta testers (optionally filter by app or beta group)

Inputs: limit, filter.id, filter.apps, filter.email, +3 more.

list-build-beta-detailsList build beta detailsA
Read-onlyIdempotent

List build beta details (export compliance, auto-notify, internal/external state) for TestFlight builds

Inputs: limit, filter.id, filter.build.

list-buildsList buildsA
Read-onlyIdempotent

List builds for an app (optionally filter by version)

Inputs: filter.app (required), limit, filter.id, filter.version, +3 more.

list-bundle-idsList bundle IDsA
Read-onlyIdempotent

Get a list of bundle IDs registered in your team

Inputs: limit, filter.id, filter.name, filter.platform, +1 more.

list-certificatesList certificatesA
Read-onlyIdempotent

Get a list of signing certificates in your team

Inputs: limit, filter.id, filter.displayName, filter.serialNumber, +1 more.

list-ci-productsList CI productsA
Read-onlyIdempotent

List Xcode Cloud CI products (integrations per app)

Inputs: limit, filter.app, filter.productType.

list-customer-reviewsList customer reviewsA
Read-onlyIdempotent

List App Store customer reviews for an app store version (rating, title, body, response)

Inputs: appStoreVersionId (required), sort, limit, filter.rating, +1 more.

list-devicesList devicesB
Read-onlyIdempotent

Get a list of registered devices for development and testing

Inputs: limit, filter.id, filter.name, filter.udid, +2 more.

list-nominationsList nominationsA
Read-onlyIdempotent

List App Store nominations (e.g. custom product pages, in-app events)

Inputs: filter.state (required), limit, filter.type, filter.relatedApps.

list-pre-release-versionsList pre-release versionsA
Read-onlyIdempotent

List pre-release versions (TestFlight) for an app or across apps

Inputs: limit, filter.id, filter.app, filter.version, +1 more.

list-profilesList profilesA
Read-onlyIdempotent

Get a list of provisioning profiles in your team

Inputs: limit, filter.id, filter.name, filter.profileType, +1 more.

list-review-submissionsList review submissionsA
Read-onlyIdempotent

List App Store review submissions for an app (submission history). Filter by state (e.g. UNRESOLVED_ISSUES for rejected). Note: the actual rejection message is only visible in App Store Connect → Version → Resolution Center, not in the API.

Inputs: filter.app (required), limit, filter.state, filter.platform.

list-schemesList Xcode schemesA
Read-onlyIdempotent

List all available schemes in an Xcode project or workspace

Inputs: projectPath (required).

list-subscription-groupsList subscription groupsA
Read-onlyIdempotent

List subscription groups for an app. Use the returned group IDs with list-subscription-group-subscriptions or create-subscription.

Inputs: appId (required), limit, filter.referenceName.

list-subscription-group-subscriptionsList subscription group subscriptionsA
Read-onlyIdempotent

List all auto-renewable subscriptions in a subscription group (productId, name, state, prices, etc.). Use to verify products like premium_monthly_v2 and premium_annual_v2 in a group.

Inputs: subscriptionGroupId (required), sort, limit, filter.name, +2 more.

list-subscription-price-pointsList subscription price pointsA
Read-onlyIdempotent

List available price points for a subscription. Use the returned price point id as subscriptionPricePointId in create-subscription-price.

Inputs: subscriptionId (required), limit, filter.territory.

list-territoriesList territoriesA
Read-onlyIdempotent

Get the list of territories (countries/regions) for App Store availability

Inputs: limit.

list-user-invitationsList user invitationsA
Read-onlyIdempotent

Get a list of pending user invitations to your team

Inputs: limit, filter.email, filter.roles, filter.visibleApps.

list-usersList usersA
Read-onlyIdempotent

Get a list of team members (users) in your App Store Connect team

Inputs: limit, filter.roles, filter.username, filter.visibleApps.

remove-beta-testers-from-groupRemove beta testers from groupA
Idempotent

Remove one or more beta testers from a TestFlight group. Tester IDs come from list-beta-testers.

Inputs: betaGroupId (required), betaTesterIds (required).

submit-for-reviewSubmit for reviewA

Submit an App Store version for review. Creates a review submission, adds the version as an item, and marks it as submitted.

Inputs: appId (required), appStoreVersionId (required), platform.

update-age-rating-declarationUpdate age rating declarationA

Update age rating declaration for an app version (content ratings). Get ID from get-app-info or get-app-store-version include.

Inputs: ageRatingDeclarationId (required), gambling, advertising, gamblingSimulated, +12 more.

update-app-store-review-detailUpdate app store review detailA

Update App Review details for a version: contact, demo account, notes. Required before submit for review if app needs login or special instructions.

Inputs: appStoreReviewDetailId (required), notes, contactEmail, contactPhone, +5 more.

update-app-store-versionUpdate app store versionB

Update an App Store version: assign a build, set version string, copyright, release type, or downloadable flag.

Inputs: appStoreVersionId (required), buildId, copyright, releaseType, +2 more.

update-app-store-version-localizationUpdate app store version localizationA

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.

Inputs: appStoreVersionLocalizationId (required), keywords, whatsNew, supportUrl, +3 more.

update-beta-license-agreementUpdate beta license agreementA

Update TestFlight (beta) license agreement text. Required for external testing.

Inputs: agreementText (required), betaLicenseAgreementId (required).

update-eulaUpdate EULAA

Update app EULA text and/or territories. Get EULA ID from get-eula.

Inputs: eulaId (required), territoryIds, agreementText.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 69 tools

    Disambiguation4/5

    Most tools have clear resource+action names, but a few closely related pairs like create-subscription-availability and create-subscription-price could cause confusion. Overall, an agent can reliably distinguish tools based on their names and descriptions.

    Naming Consistency5/5

    All tools follow a consistent kebab-case verb_noun pattern (e.g., list-apps, get-build, create-subscription). Verbs like get/list/create/update/remove/add are used predictably.

    Tool Count2/5

    With 69 tools, the server is heavily over-scoped compared to typical MCP servers, making it difficult for an agent to manage. While the App Store Connect API is large, the tool count exceeds the recommended range and is overwhelming.

    Completeness3/5

    The tool set covers many core workflows for app versions, TestFlight, subscriptions, and review submissions, but notable gaps exist: no create/delete operations for beta testers, bundle IDs, certificates, or app store version localizations. These gaps may require workarounds but do not entirely block common tasks.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP 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.
      84
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      An opinionated MCP server for App Store Connect that provides 13 curated tools, slash-command workflows, and a Claude Skill to manage apps, reviews, sales, and pre-submission audits via natural language.
      41
      880 npm
      1
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      A Model Context Protocol server that wraps Apple's App Store Connect API v2, enabling management of apps, in-app purchases, subscriptions, TestFlight, product page experiments, and App Review submissions via natural language.
      60
      1
      MIT