io.github.chrischall/app-store-connect-mcp

Official registry Other

App Store Connect MCP: apps, TestFlight, reviews, sales reports, and team users.

What can you do with io.github.chrischall/app-store-connect-mcp?

  • "List my apps"
  • "Show me the latest builds for app 1234567890"
  • "Who hasn't accepted their TestFlight invitation?"
  • "Invite alex@example.com to the External Beta group"
  • "Submit build 9876 for beta review"
  • "What's our average rating in Japan this month?"
  • "Respond to that 1-star review with an apology"
  • "Pull yesterday's daily sales report for vendor 80012345"

Install

Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).

NPM package @chrischall/app-store-connect-mcp
Claude Code
claude mcp add app-store-connect-mcp -e 'APP_STORE_CONNECT_KEY_ID=<APP_STORE_CONNECT_KEY_ID>' -e 'APP_STORE_CONNECT_ISSUER_ID=<APP_STORE_CONNECT_ISSUER_ID>' -e 'APP_STORE_CONNECT_PRIVATE_KEY_PATH=<your app_store_connect_private_key_path>' -e 'APP_STORE_CONNECT_PRIVATE_KEY=<your app_store_connect_private_key>' -- npx -y @chrischall/app-store-connect-mcp@1.3.2
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "app-store-connect-mcp": {
            "command": "npx",
            "args": [
                "-y",
                "@chrischall/app-store-connect-mcp@1.3.2"
            ],
            "env": {
                "APP_STORE_CONNECT_KEY_ID": "<APP_STORE_CONNECT_KEY_ID>",
                "APP_STORE_CONNECT_ISSUER_ID": "<APP_STORE_CONNECT_ISSUER_ID>",
                "APP_STORE_CONNECT_PRIVATE_KEY_PATH": "<your app_store_connect_private_key_path>",
                "APP_STORE_CONNECT_PRIVATE_KEY": "<your app_store_connect_private_key>"
            }
        }
    }
}

Environment variables

  • APP_STORE_CONNECT_KEY_ID required 10-character App Store Connect API Key ID (e.g. ABC1234567).
  • APP_STORE_CONNECT_ISSUER_ID required Team Issuer ID (UUID) from App Store Connect → Users and Access → Integrations.
  • APP_STORE_CONNECT_PRIVATE_KEY_PATH secret Absolute path to your downloaded .p8 private key file. Either this or APP_STORE_CONNECT_PRIVATE_KEY is required.
  • APP_STORE_CONNECT_PRIVATE_KEY secret PEM contents of your .p8 private key. Either this or APP_STORE_CONNECT_PRIVATE_KEY_PATH is required.

Documentation

From the project's README on GitHub, refreshed weekly. Links open on GitHub.

Contents
  1. App Store Connect MCP
  2. What you can do
  3. Requirements
  4. Installation
  5. Getting an API key
  6. Tools
  7. Environment
  8. Confirmations
  9. Development
  10. License

App Store Connect MCP

A Model Context Protocol server that connects Claude to App Store Connect, giving you natural-language access to your apps, builds, TestFlight beta groups and testers, customer reviews, sales/finance reports, and team users.

[!WARNING] AI-developed project. This codebase was entirely built and is actively maintained by Claude Code. No human has audited the implementation. Review all code and tool permissions before use.

What you can do

Ask Claude things like:

  • "List my apps"
  • "Show me the latest builds for app 1234567890"
  • "Who hasn't accepted their TestFlight invitation?"
  • "Invite alex@example.com to the External Beta group"
  • "Submit build 9876 for beta review"
  • "What's our average rating in Japan this month?"
  • "Respond to that 1-star review with an apology"
  • "Pull yesterday's daily sales report for vendor 80012345"
  • "Invite a new developer with App Manager role"

Requirements

Installation

Option A — npm
npx -y @chrischall/app-store-connect-mcp

Add to your Claude config (.mcp.json or Claude Desktop config):

{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "@chrischall/app-store-connect-mcp"],
      "env": {
        "APP_STORE_CONNECT_KEY_ID": "ABC1234567",
        "APP_STORE_CONNECT_ISSUER_ID": "57246542-96fe-1a63-e053-0824d011072a",
        "APP_STORE_CONNECT_PRIVATE_KEY_PATH": "/absolute/path/to/AuthKey_ABC1234567.p8"
      }
    }
  }
}
Option B — from source
git clone https://github.com/chrischall/app-store-connect-mcp.git
cd app-store-connect-mcp
npm install
npm run build

Add to Claude Desktop config:

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "app-store-connect": {
      "command": "node",
      "args": ["/absolute/path/to/app-store-connect-mcp/dist/bundle.js"],
      "env": {
        "APP_STORE_CONNECT_KEY_ID": "ABC1234567",
        "APP_STORE_CONNECT_ISSUER_ID": "57246542-96fe-1a63-e053-0824d011072a",
        "APP_STORE_CONNECT_PRIVATE_KEY_PATH": "/absolute/path/to/AuthKey_ABC1234567.p8"
      }
    }
  }
}

Getting an API key

  1. Sign in at App Store Connect → Users and Access → Integrations → App Store Connect API.
  2. Click + to generate a key. Pick a role appropriate to what you want Claude to do — Developer is enough for read-only browsing; App Manager for TestFlight management; Admin for user invites and most write operations.
  3. Download the .p8 file (you can only download it once) and note the Key ID and Issuer ID.
  4. Either point APP_STORE_CONNECT_PRIVATE_KEY_PATH at the saved .p8, or paste the PEM contents into APP_STORE_CONNECT_PRIVATE_KEY (newline-escaped is fine).

The key signs short-lived (20-minute) ES256 JWTs on demand. No external token storage; nothing is sent to anyone but Apple.

Tools

ToolWhat it does
list_appsList apps in your account (filter by bundleId/name)
get_appGet a single app by ID
list_app_store_versionsList App Store releases for an app
get_app_infosAge rating and store-state info for an app
list_buildsRecent builds (newest first), filter by app/state/version
get_buildSingle build details
list_beta_groupsTestFlight internal/external beta groups
list_beta_testersBeta testers, filter by app/group/email
invite_beta_testerAdd a new tester, optionally to groups/builds
delete_beta_testerRemove a tester from your team
add_testers_to_beta_groupAdd existing testers to a group
remove_testers_from_beta_groupRemove testers from a group
submit_build_for_beta_reviewSend a build for TestFlight beta review
list_customer_reviewsApp Store reviews, filter by rating/territory
get_customer_reviewSingle review with developer response
respond_to_reviewPost or update a developer reply
download_sales_reportDaily/weekly/monthly/yearly units & sales TSV
download_finance_reportRegion finance/proceeds TSV; Total_* trailer lines in a separate summary
list_usersApp Store Connect team users
list_user_invitationsPending team invitations
invite_userInvite a new team member with roles; app visibility is explicit (allAppsVisible: true or a non-empty visibleAppIds, no all-apps default)
asc_healthcheckVerify credentials and upstream reachability; reports failures as data, not exceptions

Environment

VariableRequiredNotes
APP_STORE_CONNECT_KEY_IDyes10-character Key ID (e.g. ABC1234567)
APP_STORE_CONNECT_ISSUER_IDyesTeam Issuer ID (UUID)
APP_STORE_CONNECT_PRIVATE_KEYone ofFull PEM contents of your .p8. Newline-escapes (\n) are accepted.
APP_STORE_CONNECT_PRIVATE_KEY_PATHone ofAbsolute path to the .p8 file

Confirmations

Every write (invite_beta_tester, delete_beta_tester, add_testers_to_beta_group, remove_testers_from_beta_group, submit_build_for_beta_review, respond_to_review, invite_user) asks you to confirm before anything is sent. A client that can show a confirmation prompt (Claude Code) shows one with the exact request. On a client that cannot, the first call sends nothing and returns a preview — method, path and the JSON body it will send — plus a confirmToken; only a repeat call with the same arguments and that token performs the write. A token is single-use, expires, and is refused if any argument changed since the preview.

variabledefault
MCP_CONFIRM_MODEask-userWhat a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). ask-user: two steps — the first call does nothing and returns a preview plus a token, and the model must get your approval in chat before calling again with it. auto: the same two steps, but the model may use the token after reviewing the preview itself. refuse: writes are refused on such clients. A client that can show prompts (Claude Code) always gets the real prompt, unless MCP_CONFIRM_ELICITATION=off. An unrecognised value is treated as refuse.
MCP_CONFIRM_ELICITATIONonoff never sends a confirmation prompt, so every client gets the MCP_CONFIRM_MODE path. Set it for a client that declares it can show prompts but never does (the gated call hangs — opencode 2.0.x). Any other value stays on, with a stderr warning.
MCP_CONFIRM_TTL_SECONDS600How long a token stays valid.
MCP_CONFIRM_SECRETrandom per processSigning key; set it only if tokens must survive a server restart.

Development

npm install
npm test               # vitest run
npm run test:watch     # watch mode
npm run build          # tsc + esbuild bundle
npm run dev            # node --env-file=.env dist/index.js

Tests mock client.request / client.requestRaw; no real App Store Connect calls are made.

License

MIT

Frequently asked questions

What is io.github.chrischall/app-store-connect-mcp?

App Store Connect MCP: apps, TestFlight, reviews, sales reports, and team users.

How do I install io.github.chrischall/app-store-connect-mcp?

It runs on your machine. In Claude Code: claude mcp add app-store-connect-mcp -e 'APP_STORE_CONNECT_KEY_ID=<APP_STORE_CONNECT_KEY_ID>' -e 'APP_STORE_CONNECT_ISSUER_ID=<APP_STORE_CONNECT_ISSUER_ID>' -e 'APP_STORE_CONNECT_PRIVATE_KEY_PATH=<your app_store_connect_private_key_path>' -e 'APP_STORE_CONNECT_PRIVATE_KEY=<your app_store_connect_private_key>' -- npx -y @chrischall/app-store-connect-mcp@1.3.2. For other clients, paste the JSON configuration from this page into their MCP settings.

Does io.github.chrischall/app-store-connect-mcp need an API key?

Yes. It expects APP_STORE_CONNECT_KEY_ID, APP_STORE_CONNECT_ISSUER_ID, APP_STORE_CONNECT_PRIVATE_KEY_PATH, APP_STORE_CONNECT_PRIVATE_KEY, which you set in its configuration.

Is io.github.chrischall/app-store-connect-mcp open source?

Yes. Its code is on GitHub under the MIT license.

Who maintains io.github.chrischall/app-store-connect-mcp?

It is published by chrischall. AI.tn lists it but does not maintain or endorse it.

From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.