npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@wiseappsai/app-store-connect-mcp

v0.1.0

Published

MCP server for Apple App Store Connect API: apps, releases, TestFlight, reviews, provisioning, users, reports, and generic API access.

Readme

app-store-connect-mcp

An MCP server that lets AI agents manage Apple App Store Connect through Apple's official App Store Connect API: apps, App Store metadata, reviews, TestFlight, provisioning, users, and reports.

License: MIT CI

Apple publishes the App Store Connect REST API and OpenAPI documentation, but I could not find an Apple-owned official App Store Connect MCP server. This project therefore wraps the official API directly. It also includes asc_api, a generic request tool, so agents can use new or less common Apple endpoints without waiting for a wrapper update.

Once connected, ask your assistant:

"List my App Store Connect apps." "Show the App Store versions for this app." "Update the promotional text for the English localization." "Create a TestFlight beta group."

Quick start

Create an App Store Connect API key in App Store Connect:

  1. Open Users and Access.
  2. Go to Integrations / App Store Connect API.
  3. Create or use an API key and note the Issuer ID, Key ID, and downloaded .p8 private key.
  4. Store the .p8 outside your repo, for example ~/.config/app-store-connect-mcp/AuthKey_YOUR_KEY_ID.p8, and restrict it with chmod 600.

Add the server to your MCP client:

{
  "mcpServers": {
    "app-store-connect": {
      "command": "npx",
      "args": ["-y", "@wiseappsai/app-store-connect-mcp"],
      "env": {
        "ASC_KEY_ID": "YOUR_KEY_ID",
        "ASC_ISSUER_ID": "YOUR_ISSUER_ID",
        "ASC_PRIVATE_KEY_PATH": "/absolute/path/AuthKey_YOUR_KEY_ID.p8",
        "ASC_READ_ONLY": "true"
      }
    }
  }
}

ASC_READ_ONLY=true is recommended while exploring. Remove it when you want the agent to make App Store Connect changes.

For local source use:

npm install
npm run build
node /absolute/path/app-store-connect-mcp/dist/index.js

Docker

Tagged releases publish a container image to GitHub Container Registry. For a file-based key, mount the .p8 file read-only and set ASC_PRIVATE_KEY_PATH:

{
  "mcpServers": {
    "app-store-connect": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "ASC_KEY_ID",
        "-e",
        "ASC_ISSUER_ID",
        "-e",
        "ASC_PRIVATE_KEY_PATH=/run/secrets/appstoreconnect.p8",
        "-e",
        "ASC_READ_ONLY",
        "-v",
        "/absolute/path/AuthKey_YOUR_KEY_ID.p8:/run/secrets/appstoreconnect.p8:ro",
        "ghcr.io/wiseappsai/app-store-connect-mcp:latest"
      ],
      "env": {
        "ASC_KEY_ID": "YOUR_KEY_ID",
        "ASC_ISSUER_ID": "YOUR_ISSUER_ID",
        "ASC_READ_ONLY": "true"
      }
    }
  }
}

Inline private keys also work when your MCP client can provide secret environment variables:

{
  "mcpServers": {
    "app-store-connect": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "ASC_KEY_ID", "-e", "ASC_ISSUER_ID", "-e", "ASC_PRIVATE_KEY", "ghcr.io/wiseappsai/app-store-connect-mcp:latest"],
      "env": {
        "ASC_KEY_ID": "YOUR_KEY_ID",
        "ASC_ISSUER_ID": "YOUR_ISSUER_ID",
        "ASC_PRIVATE_KEY": "<escaped-p8-private-key>",
        "ASC_READ_ONLY": "true"
      }
    }
  }
}

To build and test the image locally:

docker build -t app-store-connect-mcp:local .

docker run -i --rm \
  -e ASC_KEY_ID=YOUR_KEY_ID \
  -e ASC_ISSUER_ID=YOUR_ISSUER_ID \
  -e ASC_PRIVATE_KEY_PATH=/run/secrets/appstoreconnect.p8 \
  -v /secure/AuthKey_YOUR_KEY_ID.p8:/run/secrets/appstoreconnect.p8:ro \
  app-store-connect-mcp:local

Tools

Toolsets are enabled with ASC_TOOLSETS (default: all). Set ASC_READ_ONLY=true to hide mutating actions.

| Toolset | Tools | Covers | | --- | --- | --- | | api | asc_api | Generic access to any official App Store Connect API endpoint. | | apps | asc_apps | Apps, App Store versions, localizations, customer reviews, review replies, price points, review submissions. | | beta | asc_testflight | Builds, beta groups, beta testers, beta review submissions, beta build localization. | | provisioning | asc_provisioning | Bundle IDs, capabilities, certificates, devices, provisioning profiles. | | users | asc_users | Users, invitations, roles, visible app access. | | reports | asc_reports | Sales, finance, and analytics report requests. |

Generic API usage

asc_api is intentionally broad:

{
  "action": "request",
  "method": "GET",
  "path": "/v1/apps",
  "query": {
    "limit": 10,
    "fields[apps]": "name,bundleId,sku,primaryLocale"
  }
}

For write calls, pass Apple's JSON:API request body directly:

{
  "action": "request",
  "method": "PATCH",
  "path": "/v1/appStoreVersionLocalizations/123456789",
  "body": {
    "data": {
      "type": "appStoreVersionLocalizations",
      "id": "123456789",
      "attributes": {
        "promotionalText": "New release text"
      }
    }
  }
}

Configuration

| Variable | Description | | --- | --- | | ASC_KEY_ID | App Store Connect API key id. Required. | | ASC_ISSUER_ID | App Store Connect issuer id. Required. | | ASC_PRIVATE_KEY_PATH | Path to the downloaded .p8 private key. Required unless ASC_PRIVATE_KEY is set. | | ASC_PRIVATE_KEY | Inline .p8 private key. Escaped newline sequences are supported. | | ASC_READ_ONLY | true hides mutating actions. Default false. | | ASC_TOOLSETS | Comma-separated toolsets or all. Default all. | | ASC_VENDOR_NUMBER | Optional default vendor number for sales and finance report queries. | | ASC_BASE_URL | Override API base URL for tests or proxies. Default https://api.appstoreconnect.apple.com. | | ASC_LOG_LEVEL | error, warn, info, or debug. Default info. |

Notes

  • Apple scopes API keys by role and access. The MCP can only do what the API key can do.
  • Report downloads may return gzip/binary content. The server returns those as { contentType, byteLength, base64 }.
  • Use asc_api.get_all_pages for read-only paginated collections that expose links.next.
  • Keep .p8 keys out of git and prefer ASC_READ_ONLY=true for exploratory use.

Security

This server can modify App Store Connect when ASC_READ_ONLY is not enabled. Use the least-privileged App Store Connect API key that covers your workflow, store .p8 keys outside repositories, mount key files read-only in Docker, and never commit .env, .p8, or .pem files.

Development

npm install
npm run build
npm test
npm run typecheck
npm audit --audit-level=moderate

References