io.github.rabdulsal/appstore-release-mcp

Official registry Other

App Store release pilot — version bump, TestFlight upload, metadata, review submission

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 appstore-release-mcp
Claude Code
claude mcp add appstore-release-mcp -e 'APPLE_KEY_ID=<APPLE_KEY_ID>' -e 'APPLE_ISSUER_ID=<APPLE_ISSUER_ID>' -e 'ASC_KEY_PATH=<ASC_KEY_PATH>' -e 'APPLE_KEY_CONTENT=<your apple_key_content>' -e 'APPLE_TEAM_ID=<APPLE_TEAM_ID>' -e 'ASC_BUNDLE_ID=<ASC_BUNDLE_ID>' -e 'ASC_PROJECT_DIR=<ASC_PROJECT_DIR>' -e 'ASC_PLATFORM=<ASC_PLATFORM>' -e 'ASC_FASTLANE_LANE=<ASC_FASTLANE_LANE>' -e 'ASC_FASTLANE_PLATFORM=<ASC_FASTLANE_PLATFORM>' -e 'ASC_UPLOAD_CMD=<ASC_UPLOAD_CMD>' -- npx -y appstore-release-mcp@0.1.1
JSON configuration (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "appstore-release-mcp": {
            "command": "npx",
            "args": [
                "-y",
                "appstore-release-mcp@0.1.1"
            ],
            "env": {
                "APPLE_KEY_ID": "<APPLE_KEY_ID>",
                "APPLE_ISSUER_ID": "<APPLE_ISSUER_ID>",
                "ASC_KEY_PATH": "<ASC_KEY_PATH>",
                "APPLE_KEY_CONTENT": "<your apple_key_content>",
                "APPLE_TEAM_ID": "<APPLE_TEAM_ID>",
                "ASC_BUNDLE_ID": "<ASC_BUNDLE_ID>",
                "ASC_PROJECT_DIR": "<ASC_PROJECT_DIR>",
                "ASC_PLATFORM": "<ASC_PLATFORM>",
                "ASC_FASTLANE_LANE": "<ASC_FASTLANE_LANE>",
                "ASC_FASTLANE_PLATFORM": "<ASC_FASTLANE_PLATFORM>",
                "ASC_UPLOAD_CMD": "<ASC_UPLOAD_CMD>"
            }
        }
    }
}

Environment variables

  • APPLE_KEY_ID required App Store Connect API key ID
  • APPLE_ISSUER_ID required App Store Connect API issuer ID
  • ASC_KEY_PATH Path to the .p8 App Store Connect API private key (alternative: APPLE_KEY_CONTENT with base64-encoded key)
  • APPLE_KEY_CONTENT secret Base64-encoded .p8 private key content (alternative to ASC_KEY_PATH)
  • APPLE_TEAM_ID Apple Developer team ID (required for builds/uploads)
  • ASC_BUNDLE_ID required Bundle identifier of the app to manage, e.g. com.example.myapp
  • ASC_PROJECT_DIR Xcode project root where fastlane runs (default: current working directory)
  • ASC_PLATFORM App Store platform: IOS (default), MAC_OS, TV_OS, or VISION_OS
  • ASC_FASTLANE_LANE Fastlane lane used for archive + upload (default: beta)
  • ASC_FASTLANE_PLATFORM Fastlane platform prefix, e.g. mac or ios
  • ASC_UPLOAD_CMD Full override of the upload command, e.g. 'bundle exec fastlane ios beta'

Documentation

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

Contents
  1. appstore-release-mcp
  2. Requirements
  3. Setup
  4. Tools
  5. Release walkthrough
  6. Environment variables
  7. Notes
  8. License

appstore-release-mcp

An MCP server that drives the full App Store release cycle for iOS and macOS apps: version bump → archive + TestFlight upload → metadata → review submission → status.

What makes it different: existing App Store Connect MCP servers wrap the REST API — metadata, TestFlight management, analytics. None of them can do the one step the REST API doesn't support: getting a binary onto Apple's servers. This server is a release pilot, not an API browser, and gives you two ways to do that:

  • Direct ASC REST API (ES256 JWT, zero-dependency signing via node:crypto) for status, builds, metadata, and review submission
  • asc_upload_build — your existing fastlane lane archives, signs, and uploads, run as an async job with log polling (a real archive takes 5–15 minutes — no MCP timeout can hold that)
  • asc_upload_ipa — already have a signed .ipa? (from eas build, a CI pipeline, a manual Xcode archive) Upload it directly via xcrun altool — no fastlane, no local archive step, nothing to configure beyond the ASC API key you already have
  • Local version bumping across project.pbxproj (and project.yml for xcodegen projects)

Requirements

  • macOS with Xcode command line tools (xcrun altool — used by asc_upload_ipa)
  • fastlane with a lane that builds and uploads (e.g. beta) — only needed for asc_upload_build; skip it entirely if you're only using asc_upload_ipa
  • An App Store Connect API key (.p8)

Setup

  1. Generate an ASC API key (once): App Store Connect → Users and Access → Integrations → App Store Connect API → Team Keys → Generate (role: App Manager). Download the .p8 — Apple lets you download it exactly once. Keep it in ~/.appstoreconnect/private_keys/.
  2. Register with Claude Code:
claude mcp add appstore \
  -e APPLE_KEY_ID=XXXXXXXXXX \
  -e APPLE_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  -e ASC_KEY_PATH=$HOME/.appstoreconnect/private_keys/AuthKey_XXXXXXXXXX.p8 \
  -e APPLE_TEAM_ID=XXXXXXXXXX \
  -e ASC_BUNDLE_ID=com.example.myapp \
  -e ASC_PROJECT_DIR=/path/to/your/xcode/project \
  -- npx appstore-release-mcp

For a macOS app whose Fastfile uses platform :mac, add -e ASC_PLATFORM=MAC_OS -e ASC_FASTLANE_PLATFORM=mac.

  1. Verify: ask the agent to run asc_doctor. All checks should be ✓.

Tools

ToolWhat it does
asc_doctorVerify config, creds, fastlane/xcodebuild/altool, app record — run first
asc_app_statusVersions + review states + recent builds in one call
asc_list_buildsBuild processing states (wait for VALID after upload)
asc_bump_versionBump build number / set marketing version in local project files
asc_upload_buildRun your fastlane upload lane as an async job — returns job ID immediately
asc_upload_ipaUpload an already-built .ipa via xcrun altool — async job, no fastlane needed
asc_job_statusPoll a job started by asc_upload_build or asc_upload_ipa; status + log tail
asc_update_metadataDescription / keywords / what's-new / promo text via REST
asc_submit_reviewAttach build + create review submission + submit

Release walkthrough

Building locally with fastlane:

asc_doctor                                   # toolchain healthy?
asc_bump_version {marketing_version: "1.1.0"}
asc_upload_build                             # → job id
asc_job_status {job_id}                      # poll until succeeded
asc_list_builds                              # wait for processingState VALID
asc_update_metadata {whats_new: "...", create_version: "1.1.0"}
asc_submit_review {build_id}                 # point of no return
asc_app_status                               # WAITING_FOR_REVIEW

Already have a signed .ipa (EAS Build, CI, manual archive) — no fastlane needed:

asc_doctor
asc_upload_ipa {ipa_path: "./build/app.ipa"} # → job id
asc_job_status {job_id}                      # poll until succeeded
asc_list_builds                              # wait for processingState VALID
asc_update_metadata {whats_new: "...", create_version: "1.1.0"}
asc_submit_review {build_id}
asc_app_status

Environment variables

Credential names deliberately match fastlane's app_store_connect_api_key, so one credential set serves both.

VarRequiredNotes
APPLE_KEY_IDyesASC API key ID
APPLE_ISSUER_IDyesASC issuer ID
APPLE_KEY_CONTENT / ASC_KEY_PATHone ofbase64-encoded .p8 / path to .p8 file
APPLE_TEAM_IDfor asc_upload_buildApple Developer team ID (not needed for asc_upload_ipa)
ASC_BUNDLE_IDyesyour app's bundle identifier
ASC_PROJECT_DIRrecommendedXcode project root where fastlane runs (default: cwd)
ASC_PLATFORMnoIOS (default), MAC_OS, TV_OS, VISION_OS
ASC_FASTLANE_LANEnoupload lane name (default: beta)
ASC_FASTLANE_PLATFORMnofastlane platform prefix, e.g. mac or ios
ASC_UPLOAD_CMDnofull override, e.g. bundle exec fastlane ios beta

Notes

  • Build jobs are children of the server process; if the MCP client disconnects mid-build the job dies. Logs persist in ~/.appstore-mcp/jobs/ either way.
  • asc_submit_review is the point of no return for a release — the tool description tells agents to confirm with a human first.

License

MIT

Frequently asked questions

What is io.github.rabdulsal/appstore-release-mcp?

App Store release pilot — version bump, TestFlight upload, metadata, review submission

How do I install io.github.rabdulsal/appstore-release-mcp?

It runs on your machine. In Claude Code: claude mcp add appstore-release-mcp -e 'APPLE_KEY_ID=<APPLE_KEY_ID>' -e 'APPLE_ISSUER_ID=<APPLE_ISSUER_ID>' -e 'ASC_KEY_PATH=<ASC_KEY_PATH>' -e 'APPLE_KEY_CONTENT=<your apple_key_content>' -e 'APPLE_TEAM_ID=<APPLE_TEAM_ID>' -e 'ASC_BUNDLE_ID=<ASC_BUNDLE_ID>' -e 'ASC_PROJECT_DIR=<ASC_PROJECT_DIR>' -e 'ASC_PLATFORM=<ASC_PLATFORM>' -e 'ASC_FASTLANE_LANE=<ASC_FASTLANE_LANE>' -e 'ASC_FASTLANE_PLATFORM=<ASC_FASTLANE_PLATFORM>' -e 'ASC_UPLOAD_CMD=<ASC_UPLOAD_CMD>' -- npx -y appstore-release-mcp@0.1.1. For other clients, paste the JSON configuration from this page into their MCP settings.

Does io.github.rabdulsal/appstore-release-mcp need an API key?

Yes. It expects APPLE_KEY_ID, APPLE_ISSUER_ID, APPLE_KEY_CONTENT, ASC_BUNDLE_ID, which you set in its configuration.

Is io.github.rabdulsal/appstore-release-mcp open source?

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

Who maintains io.github.rabdulsal/appstore-release-mcp?

It is published by rabdulsal. 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.