App Store Connect MCP Server
Manage Apple's App Store Connect from any MCP client — apps, versions, metadata, TestFlight, pricing, reports, and any API operation.
Apps & versions – list/inspect apps; create and manage App Store versions (platform, version string, release type, copyright)
Localizations – full CRUD for version descriptions, keywords, what's new, plus app name, subtitle, and privacy URLs
TestFlight – list beta groups, list/add/remove beta testers
Media – list screenshot sets and screenshots, upload new screenshots
Provisioning & team – CRUD bundle IDs, list devices, users, and builds
Pricing & PPP – browse categories, territories, and price points; fetch Apple's equivalent (PPP) prices; set per-territory pricing
Analytics – create/list/delete report requests, list reports, instances, and segments, then download and parse segment data
Sales & finance – download and parse sales/trends and financial reports as structured rows
Performance & diagnostics – app/build power & performance metrics, diagnostic signatures and logs
Any API operation –
asc_api_search,asc_api_describe, andasc_api_requestreach all 1,303 App Store Connect operationsSafety controls – read-only mode (
ASC_READ_ONLY), toolset filtering, JWT auth with credential redaction
Manage iOS, macOS, tvOS, and visionOS apps on the App Store via App Store Connect API, including app listing, version control, localizations, beta testing via TestFlight, screenshots, bundle IDs, devices, users, builds, categories, pricing, and per-territory pricing.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@App Store Connect MCP Server list my apps"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
App Store Connect MCP Server
A Model Context Protocol (MCP) server for Apple's App Store Connect API. Manage your iOS, macOS, tvOS, and visionOS apps directly from Claude, Cursor, or any MCP-compatible client.
Features
Any API Operation - Call any of the 1,303 App Store Connect API operations through
asc_api_request, validated against Apple's OpenAPI spec, withasc_api_searchandasc_api_describeto find and inspect themSubmission & Release - Edit version metadata (copyright, version string, release type), attach builds, App Review details, review submissions, phased and manual release, export compliance
App Info - Categories, age rating declaration, app info localizations, custom EULA
App Store Localizations - Full CRUD for version descriptions, keywords, and what's new
App Management - List and inspect apps across all platforms
Version Control - Create and manage app store versions
TestFlight - Groups, build access, testers and invitations, What to Test notes, beta app localizations, beta review submissions
Screenshots & Previews - Upload, reorder, and delete screenshots and app previews; review screenshots for subscriptions and in-app purchases
Customer Reviews - Read reviews and publish or remove responses
Bundle ID Management - Full CRUD for bundle identifiers
Device Management - List and inspect registered devices
User Management - List and inspect team users
Build Management - List and inspect app builds
Category & Pricing - Browse categories, check pricing and availability
Pricing & PPP - Set per-territory pricing with Purchase Power Parity support
Subscriptions - Groups, subscriptions, localizations, pricing & PPP, availability, promotional, introductory and win-back offers, offer codes
In-App Purchases - Create and manage one-time purchases (lifetime/non-consumable, consumable, non-renewing): metadata, localization, pricing & PPP, availability, offer codes, review screenshots, and review submission
Custom Product Pages - Pages, versions, and per-locale promotional text
Analytics Reports - Request and download app analytics reports (engagement, commerce, usage, performance)
Sales & Finance - Download sales, trends, and financial reports
Performance & Diagnostics - App/build power & performance metrics and diagnostic logs
Toolsets & Read-Only Mode - Expose only the tool groups you need, or block every write with
ASC_READ_ONLY=1Secure by Default - ES256 JWT auth with automatic token refresh, credential redaction in logs
Related MCP server: App Store Connect MCP
Table of Contents
Quick Start
Get an App Store Connect API key (see Prerequisites).
Add the server to your MCP client with
npx -y asc-mcp@latestand your credentials (see MCP Client Configuration).Restart the client. New releases are picked up on each restart.
Installation
npx (recommended)
npx -y asc-mcp@latestYour MCP client runs this command itself (see MCP Client Configuration). npx fetches the newest release whenever the client starts, so you stay up to date.
Global install
npm install -g asc-mcpThen use "command": "asc-mcp" in your client config. A global install does not update by itself: run npm install -g asc-mcp@latest to update.
Updating
npx: restart your MCP client. A running client keeps the version it started with.
Global install:
npm install -g asc-mcp@latest, then restart the client.Pin a version for stability with
asc-mcp@2.0.4(or any version) instead ofasc-mcp@latest.
Once a day the server asks npm for the latest version in the background, without delaying startup. If yours is older, the next time the server starts it tells your assistant, which mentions it to you once. It sends nothing but that request, and installs nothing. Set ASC_DISABLE_UPDATE_CHECK=1 to turn it off.
From Source
git clone https://github.com/SardorbekR/appstore-connect-mcp.git
cd appstore-connect-mcp
npm install
npm run buildConfiguration
Prerequisites: Get Your Apple API Credentials
Sign in to App Store Connect
Go to Users and Access → Integrations → App Store Connect API
Click Generate API Key (or use existing)
Select appropriate role (Admin or App Manager recommended)
Download the .p8 file - you can only download it once!
Note your Key ID (shown in the keys list)
Note your Issuer ID (shown at the top of the page)
Environment Variables
Variable | Required | Description |
| Yes | Your API Key ID (e.g., |
| Yes | Your Issuer ID (UUID format) |
| Yes* | Path to your |
| Yes* | Raw content of |
*One of P8_PATH or P8_CONTENT is required.
Optional settings:
Variable | Default | Description |
| all | Comma-separated tool groups to expose: |
| off |
|
| 80000 | Size cap for |
| off |
|
MCP Client Configuration
Add to your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"app-store-connect": {
"command": "npx",
"args": ["-y", "asc-mcp@latest"],
"env": {
"APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
"APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
"APP_STORE_CONNECT_P8_PATH": "/absolute/path/to/AuthKey.p8"
}
}
}
}Add to your Cursor MCP settings (Settings → MCP Servers):
{
"mcpServers": {
"app-store-connect": {
"command": "npx",
"args": ["-y", "asc-mcp@latest"],
"env": {
"APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
"APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
"APP_STORE_CONNECT_P8_PATH": "/absolute/path/to/AuthKey.p8"
}
}
}
}Add to your Continue configuration:
{
"mcpServers": {
"app-store-connect": {
"command": "npx",
"args": ["-y", "asc-mcp@latest"],
"env": {
"APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
"APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
"APP_STORE_CONNECT_P8_PATH": "/absolute/path/to/AuthKey.p8"
}
}
}
}For CI/CD or containerized environments, you can pass the key content directly:
{
"mcpServers": {
"app-store-connect": {
"command": "npx",
"args": ["-y", "asc-mcp@latest"],
"env": {
"APP_STORE_CONNECT_KEY_ID": "YOUR_KEY_ID",
"APP_STORE_CONNECT_ISSUER_ID": "YOUR_ISSUER_ID",
"APP_STORE_CONNECT_P8_CONTENT": "-----BEGIN PRIVATE KEY-----\nMIGT...your key here...AB12\n-----END PRIVATE KEY-----"
}
}
}
}Available Tools
Apps
Tool | Description | Parameters |
| List all apps in your account |
|
| Get details of a specific app |
|
Versions
Tool | Description | Parameters |
| List all versions for an app |
|
| Get version details |
|
| Create a new app version |
|
Version Localizations
Tool | Description | Parameters |
| List localizations for a version |
|
| Get localization details |
|
| Add a new locale |
|
| Update localization |
|
| Remove a locale |
|
App Info Localizations
Tool | Description | Parameters |
| List app info records |
|
| List name/subtitle localizations |
|
| Update app name, subtitle |
|
Beta Testing (TestFlight)
Tool | Description | Parameters |
| List beta groups for an app |
|
| List testers in a group |
|
| Add a tester to a group |
|
| Remove a tester from a group |
|
Screenshots
Tool | Description | Parameters |
| List screenshot sets |
|
| List screenshots in a set |
|
| Upload a new screenshot |
|
Bundle IDs
Tool | Description | Parameters |
| List all bundle IDs |
|
| Get bundle ID details |
|
| Register a new bundle ID |
|
| Update bundle ID name |
|
| Delete a bundle ID |
|
Devices
Tool | Description | Parameters |
| List registered devices |
|
| Get device details |
|
Users
Tool | Description | Parameters |
| List team users |
|
| Get user details |
|
Builds
Tool | Description | Parameters |
| List builds for an app |
|
| Get build details |
|
Categories & Pricing
Tool | Description | Parameters |
| List app categories |
|
| Get app pricing info |
|
| Get app territory availability |
|
Pricing (PPP)
Tool | Description | Parameters |
| List all territories with currencies |
|
| List available price tiers for an app |
|
| Get PPP equivalent prices across countries |
|
| Set per-territory manual pricing (replaces entire schedule) |
|
In-App Purchases (Lifetime / Non-Consumable)
One-time purchases via Apple's In-App Purchases v2 API. create_in_app_purchase defaults to NON_CONSUMABLE — a "lifetime" unlock. To ship one: create → add a localization → set a price → set availability → submit for review.
Note: App Review usually requires a review screenshot on the in-app purchase. Uploading IAP review screenshots is not yet covered by these tools — add one in App Store Connect if
submit_in_app_purchase_for_reviewis rejected for a missing screenshot.
Tool | Description | Parameters |
| List an app's in-app purchases, optionally by type |
|
| Get a single in-app purchase's details and state |
|
| Create an IAP (defaults to NON_CONSUMABLE / lifetime) |
|
| Update name, Family Sharing, or review note (productId/type immutable) |
|
| Delete an in-app purchase |
|
| List localized names/descriptions |
|
| Add a localized display name (+ description) |
|
| Update a localization |
|
| Delete a localization |
|
| List price points (customer price & proceeds) |
|
| Apple's PPP-equivalent price points for a base price point |
|
| Set pricing (replaces schedule; one base territory to auto-equalize, or full PPP list) |
|
| Read current per-territory prices (manual; optional automatic) |
|
| Get territory availability |
|
| Set territory availability |
|
| Submit the IAP to App Review (independent of an app version) |
|
Analytics Reports
Tool | Description | Parameters |
| Request an analytics report (ongoing or one-time snapshot) |
|
| List analytics report requests for an app |
|
| Get an analytics report request |
|
| Delete an analytics report request |
|
| List reports available within a request |
|
| List instances (by date) of a report |
|
| List downloadable segments of a report instance |
|
| Download a report segment |
|
Sales & Finance
Tool | Description | Parameters |
| Download a sales/trends report |
|
| Download a financial report |
|
Performance & Diagnostics
Tool | Description | Parameters |
| Get an app's power & performance metrics |
|
| Get a build's performance metrics |
|
| List diagnostic signatures for a build |
|
| List diagnostic logs for a signature |
|
Any API Operation (generic)
Tool | Description | Parameters |
| Call any App Store Connect API operation (1303 operations from Apple's OpenAPI 4.5.1). |
|
| Search the App Store Connect API operation index by keywords (matches paths, operation IDs, resource types), e.g. 'phased release', 'customer reviews', 'offer codes'. |
|
| Describe one App Store Connect API operation: query parameters with allowed values, body attributes (types, enums, required), relationships, and a minimal body template. |
|
Subscriptions
Tool | Description | Parameters |
| List all subscription groups for an app. |
|
| Get details of a specific subscription group by its ID. |
|
| Create a new subscription group for an app. |
|
| Update the reference name of a subscription group. |
|
| List the localizations for a subscription group. |
|
| Get a single subscription group localization by its ID. |
|
| Create a localization for a subscription group. |
|
| Update an existing subscription group localization. |
|
| List all auto-renewable subscriptions within a subscription group. |
|
| Get details of a specific auto-renewable subscription by its ID. |
|
| Create a new auto-renewable subscription within a subscription group. |
|
| Update the metadata of an existing auto-renewable subscription. |
|
| Delete an auto-renewable subscription. |
|
| List all localizations (translated names and descriptions) for a subscription. |
|
| Create a localized name and description for a subscription in a specific locale. |
|
| Update the localized name or description for a subscription localization. |
|
| Delete a localization for a subscription. |
|
| List available price points for a subscription, showing customer price and developer proceeds. |
|
| List the current prices set for a subscription, including price tier and territory details. |
|
| Get the territory availability configuration for a subscription — shows which territories it is available in and whether it is automatically available in new territories. |
|
| Set the territory availability for a subscription. |
|
| Set the price for a subscription in a specific territory. |
|
| List all promotional offers configured for a subscription. |
|
| Create a promotional offer for a subscription. |
|
| Replace a promotional offer's per-territory price list. |
|
| Delete a promotional offer from a subscription. |
|
| List the prices set for a promotional offer, with resolved price tier and territory details. |
|
Version Admin & App Review Details
Tool | Description | Parameters |
| Update an App Store version's version string, copyright, release type, or scheduled release date. |
|
| Delete an App Store version. |
|
| Get the build attached to an App Store version (null when none is attached). |
|
| Attach a build to an App Store version. |
|
| Get the App Review details for a version: contact, demo account, and review notes. |
|
| Create App Review details for a version that has none. contactFirstName and contactPhone are required. |
|
| Update App Review details (contact, demo account, notes). |
|
Release & Export Compliance
Tool | Description | Parameters |
| Get the phased release (gradual rollout) of an App Store version. |
|
| Create a phased release for an App Store version. |
|
| Change a phased release to ACTIVE, PAUSED, or COMPLETE. |
|
| Delete a phased release for an App Store version. |
|
| Release an App Store version that is approved and waiting for developer release (PENDING_DEVELOPER_RELEASE). |
|
| List export compliance (encryption) declarations for an app. |
|
| Get one export compliance (encryption) declaration by ID. |
|
| Create an export compliance (encryption) declaration for an app. |
|
| Link builds to an encryption declaration. |
|
| Update a build's usesNonExemptEncryption flag, its encryption declaration, or expire it. |
|
App Review Submissions
Tool | Description | Parameters |
| List review submissions for an app, optionally filtered by state or platform. |
|
| Get a review submission with the items it contains. |
|
| Create a review submission for one platform of an app. |
|
| Add one item to a review submission. |
|
| Remove an item from a review submission. |
|
| Submit a review submission to App Review. |
|
| Cancel a review submission that is in progress. |
|
App Info: Categories, Age Rating, EULA
Tool | Description | Parameters |
| Get the primary and secondary App Store categories and subcategories of an app info record. |
|
| Set or clear App Store categories and subcategories on an app info record. |
|
| List the subcategories of an App Store category, for example the subcategories of GAMES. |
|
| Get the age rating questionnaire answers for an app info record. |
|
| Update age rating questionnaire answers. |
|
| Create an app info localization (name, subtitle, privacy links) for a locale. |
|
| Delete an app info localization. |
|
| Get the custom end user license agreement for an app. |
|
| Create a custom end user license agreement for an app, applied to the given territories (e.g. |
|
| Update an app's custom EULA text and/or territories. |
|
| Delete an app's custom end user license agreement. |
|
Media: Screenshot Sets, App Previews, Review Screenshots
Tool | Description | Parameters |
| Create a screenshot set for one device display size in an App Store version localization. |
|
| Delete a screenshot set and every screenshot in it. |
|
| Delete one screenshot from its screenshot set. |
|
| Set the display order of the screenshots in a set. screenshotIds must list every current screenshot in the set exactly once, in the new order; get the IDs with list_screenshots. |
|
| List the app preview sets (one per device type) in an App Store version localization. |
|
| Create an app preview set for one device type in an App Store version localization. |
|
| Delete an app preview set and every app preview in it. |
|
| List the app previews (videos) in an app preview set. |
|
| Upload a .mov, .m4v, or .mp4 video as an app preview. |
|
| Delete one app preview from its preview set. |
|
| Set the display order of the app previews in a preview set. previewIds must list every current preview in the set exactly once, in the new order; get the IDs with list_previews. |
|
| Upload the App Review screenshot for a subscription from a local file. |
|
| Upload the App Review screenshot for an in-app purchase from a local file. |
|
TestFlight Groups
Tool | Description | Parameters |
| Get a beta group's settings, including its public TestFlight link. |
|
| Create a beta group for an app. |
|
| Update a beta group's settings. |
|
| Delete a beta group. |
|
| List the builds available to a beta group. |
|
| Make one or more builds available to a beta group. |
|
| Remove one or more builds from a beta group. |
|
| Add existing beta testers to a beta group by tester ID. |
|
| Delete a beta tester from the account. |
|
| Send an existing beta tester an invitation to test an app. |
|
TestFlight Builds & Beta Review
Tool | Description | Parameters |
| List the TestFlight 'What to Test' notes for a build, one per locale. |
|
| Add 'What to Test' notes for a build in one locale. |
|
| Replace the 'What to Test' notes of a build localization. |
|
| Delete the 'What to Test' notes of a build for one locale. |
|
| List the TestFlight app details (description, feedback email, URLs) for an app, one per locale. |
|
| Add TestFlight app details for an app in one locale. |
|
| Update the TestFlight app details for one locale. |
|
| Delete the TestFlight app details for one locale. |
|
| Get the TestFlight beta App Review details for an app: contact, demo account, and notes. |
|
| Update the TestFlight beta App Review details (contact, demo account, notes). |
|
| Submit a build to TestFlight beta App Review so it can be shared with external testers. |
|
| List the TestFlight beta App Review submissions for a build, optionally filtered by review state. |
|
| Get the TestFlight settings and processing states for a build (auto-notify, internal and external state). |
|
| Turn automatic tester notifications on or off for a build. |
|
| List the TestFlight pre-release versions (version string and platform) of an app. |
|
Customer Reviews
Tool | Description | Parameters |
| List customer reviews for an app, each with its developer response when one exists. |
|
| Get one customer review by ID, including its developer response when one exists. |
|
| Get the developer response to a customer review (null when there is none). |
|
| Publish a developer response to a customer review. |
|
| Delete a developer response to a customer review. |
|
Subscription Offers (Introductory & Win-Back)
Tool | Description | Parameters |
| List introductory offers for a subscription, with territory and price point IDs. |
|
| Create an introductory offer for a subscription in one territory. |
|
| Change the end date of an introductory offer. |
|
| Delete an introductory offer by ID. |
|
| List win-back offers for a subscription. |
|
| Create a win-back offer for lapsed subscribers, with one price entry per territory. |
|
| Update a win-back offer's eligibility, dates, priority, or promotion intent. |
|
| Delete a win-back offer by ID. |
|
| List the per-territory prices of a win-back offer, with territory and price point IDs. |
|
Subscription Offer Codes
Tool | Description | Parameters |
| List the offer codes for a subscription, optionally filtered by territory codes such as USA. |
|
| Get one subscription offer code by ID, including its code counts and state. |
|
| Create a subscription offer code. |
|
| Activate or deactivate a subscription offer code. |
|
| Generate a batch of one-time use redemption codes for a subscription offer code. |
|
| List the one-time use code batches generated for a subscription offer code. |
|
| Download the redemption codes of a one-time use code batch as CSV, inline or (for large batches) to a new file via savePath. |
|
| Create a custom (vanity) redemption code for a subscription offer code, optionally with an expiration date. |
|
| List the custom codes created for a subscription offer code. |
|
In-App Purchase Offer Codes
Tool | Description | Parameters |
| List the offer codes configured for an in-app purchase. |
|
| Get one in-app purchase offer code by ID. |
|
| Create an in-app purchase offer code with a price per territory. |
|
| Activate or deactivate an in-app purchase offer code. |
|
| Generate a batch of one-time-use redemption codes for an offer code. |
|
| List the one-time-use code batches generated for an offer code, with counts and expiry dates. |
|
| Get the redemption code values of a one-time-use batch as CSV, inline or (for large batches) to a new file via savePath, with the number of non-empty lines. |
|
| Create a custom redemption code for an offer code. |
|
| List the custom redemption codes for an offer code, with redemption counts and expiry dates. |
|
Custom Product Pages
Tool | Description | Parameters |
| List the custom product pages of an app, optionally filtered by visibility. |
|
| Get one custom product page by ID. |
|
| Create a custom product page for an app, with its first version and one localization (the app's primary locale unless locale is given). |
|
| Update a custom product page's name or visibility. |
|
| Delete a custom product page by ID. |
|
| List the versions of a custom product page, optionally filtered by review state. |
|
| Create a new version of a custom product page, optionally with a deep link. |
|
| List the per-locale localizations of a custom product page version, optionally filtered by locale. |
|
| Add a locale with promotional text to a custom product page version. |
|
| Set the promotional text of a custom product page localization. |
|
| Delete a custom product page localization by ID. |
|
Usage Examples
List Your Apps
"Show me all my apps in App Store Connect"
Claude will use list_apps to retrieve and display your apps.
Update App Description
"Update the English description for version 2.0 of MyApp to: 'A revolutionary app that simplifies your daily tasks.'"
Claude will:
Find the app using
list_appsGet the version using
list_app_versionsFind the English localization using
list_version_localizationsUpdate it using
update_version_localization
Add Japanese Localization
"Add Japanese localization to MyApp version 2.0 with description '素晴らしいアプリです' and keywords 'アプリ,便利,簡単'"
Claude will use create_version_localization with locale ja.
Add a Beta Tester
"Add john@example.com as a beta tester to the Internal Testing group for MyApp"
Claude will:
Find the app and beta group using
list_beta_groupsAdd the tester using
add_beta_tester
Set PPP Pricing
"Show me the equivalent prices for my $9.99 tier in India, Brazil, and Turkey"
Claude will:
Find the $9.99 price point using
list_app_price_pointsGet equivalent prices using
get_price_point_equalizationsShow you the PPP-adjusted prices in each territory
"Set my app to $9.99 in the US and use PPP pricing for India and Brazil"
Claude will use set_app_prices with the appropriate price point IDs for each territory.
Create a Lifetime Purchase
"Add a $99.99 lifetime unlock to MyApp with PPP pricing for India and Brazil"
Claude will:
Create a non-consumable IAP with
create_in_app_purchaseAdd a display name with
create_in_app_purchase_localizationFind the $99.99 tier with
list_in_app_purchase_price_points, then PPP equivalents withget_in_app_purchase_price_point_equalizationsApply per-territory pricing with
set_in_app_purchase_priceand open availability withset_in_app_purchase_availabilityConfirm the result with
list_in_app_purchase_prices
Check Version Status
"What's the status of all versions of MyApp?"
Claude will use list_app_versions to show version states (PREPARE_FOR_SUBMISSION, IN_REVIEW, READY_FOR_SALE, etc.)
Prepare and Submit a Version
"Set the copyright of MyApp 2.1 to '2026 Example Inc.', attach build 42, add review notes, and submit it for review"
Claude will use update_app_version, set_app_version_build (only VALID builds attach), update_review_detail, then create_review_submission, add_review_submission_item, and submit_review_submission, which refuses if the submission holds anything besides the items you expect.
Anything Without a Dedicated Tool
"Turn on Game Center for MyApp's next version"
Claude will use asc_api_search to find the operation, asc_api_describe to see its body, and asc_api_request to call it.
Security
Credential Handling
Private keys are never logged or exposed in error messages
JWT tokens are automatically redacted from any error output
Issuer ID is redacted from error messages and details; demo account passwords are never returned and are redacted from errors
Read-only mode (
ASC_READ_ONLY=1) blocks writes in the HTTP client itself, not just in the tool listGeneric requests only reach relative
/v1-/v3paths on the App Store Connect host, with.., encoded, and absolute paths rejected; they must match Apple's spec unlessallowUnknownis set. Demo account passwords and webhook secrets are masked in responsesOffer code CSVs are written only to new files (
savePath, owner-only permissions), never over existing onesToken caching minimizes key usage (15-min tokens, refreshed at 10 min)
Path Validation
P8 file paths are validated against directory traversal attacks (
..not allowed)Only absolute paths are resolved
Best Practices
Never commit credentials - Use environment variables or a secrets manager
Restrict API key permissions - Use minimal required role (App Manager for most operations)
Rotate keys periodically - Generate new API keys and revoke old ones
Secure your .p8 file - Set file permissions to
600(owner read/write only)
chmod 600 /path/to/AuthKey.p8Troubleshooting
"Configuration error: APP_STORE_CONNECT_KEY_ID environment variable is required"
Ensure all required environment variables are set:
APP_STORE_CONNECT_KEY_IDAPP_STORE_CONNECT_ISSUER_IDAPP_STORE_CONNECT_P8_PATHorAPP_STORE_CONNECT_P8_CONTENT
"Failed to read private key"
Verify the path in
APP_STORE_CONNECT_P8_PATHis correct and absoluteCheck file permissions:
ls -la /path/to/AuthKey.p8Ensure the file is a valid
.p8from Apple (starts with-----BEGIN PRIVATE KEY-----)
"Authentication failed"
This usually means:
The API key was revoked in App Store Connect
The Key ID or Issuer ID doesn't match the .p8 file
The .p8 file is corrupted or incomplete
"Rate limit exceeded"
The server includes built-in rate limiting (50 requests/minute). If you hit Apple's limits:
Wait for the indicated retry time
Batch your operations when possible
The server automatically retries with exponential backoff
Tools Not Appearing in Claude
Verify the server is running: check Claude Desktop logs
Ensure the config file path is correct for your OS
Restart Claude Desktop after config changes
Development
Prerequisites
Node.js 20+
npm or pnpm
Setup
# Clone the repository
git clone https://github.com/SardorbekR/appstore-connect-mcp.git
cd appstore-connect-mcp
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm test
# Lint
npm run lint
# Type check
npm run typecheckProject Structure
src/
├── index.ts # MCP server entry point
├── auth/
│ └── jwt.ts # JWT token generation & caching
├── api/
│ ├── client.ts # HTTP client with retry logic and read-only guard
│ ├── upload.ts # Shared asset upload (reserve, upload chunks, commit, poll)
│ └── types.ts # TypeScript interfaces
├── openapi/
│ ├── schema-index.json # Operation index generated from spec/openapi.oas.json
│ └── index.ts # Match, search, and describe operations
├── tools/
│ ├── index.ts # Tool registry (toolsets, read-only filtering)
│ ├── api.tools.ts # Generic asc_api_* tools
│ ├── apps.tools.ts
│ ├── versions.tools.ts
│ ├── localizations.tools.ts
│ ├── app-info.tools.ts
│ ├── beta.tools.ts
│ ├── screenshots.tools.ts
│ ├── bundle-ids.tools.ts
│ ├── devices.tools.ts
│ ├── users.tools.ts
│ ├── builds.tools.ts
│ ├── categories.tools.ts
│ └── ... # One file per domain (subscriptions, release, media, ...)
└── utils/
├── errors.ts # Error classes with redaction
└── validation.ts # Zod schemasOpenAPI Spec
spec/openapi.oas.json is Apple's App Store Connect OpenAPI spec, pinned (see spec/README.md). Tests check every request a tool sends against it.
npm run check-openapi # fail if src/openapi/schema-index.json is stale
npm run update-openapi # download Apple's latest spec and regenerate the index
npx tsx scripts/spec-sheet.ts "PATCH /v1/appInfos/{id}" # print an operation's resolved shapeRunning Locally
# Development mode with auto-reload
npm run dev
# Or run the built version
npm startReleasing
Releases publish from GitHub Actions (.github/workflows/publish.yml) when a version tag is pushed. npm uses trusted publishing (OIDC, no token, provenance attached) and the MCP Registry uses GitHub OIDC.
Set the new version in
package.jsonandpackage-lock.json(npm version X.Y.Z --no-git-tag-version), both fields inserver.json, andSERVER_VERSIONinsrc/index.tsMerge to
maingit tag vX.Y.Z && git push origin vX.Y.ZApprove the run: the publish job waits on the
releaseenvironment until a required reviewer opens the workflow run and clicks Review deployments → Approve
The workflow refuses to publish if any version field differs from the tag, or if typecheck, lint, tests, or the OpenAPI index check fail.
Contributing
Fork the repository
Create a feature branch:
git checkout -b feature/my-featureMake your changes and add tests
Run
npm testandnpm run lintSubmit a pull request
Acknowledgements
The generic API tools, the OpenAPI index format, and several workflow details (review submissions, asset uploads, offer pricing) follow rorkai/App-Store-Connect-CLI (MIT).
License
MIT License - see LICENSE for details.
Links
Available Tools
52 toolsadd_beta_testerB
Add a new beta tester to a beta group by email address.
Inputs: betaGroupId (required), email (required), firstName, lastName.
create_analytics_report_requestB
Create a new analytics report request for an app. Use ONGOING for continuous reports or ONE_TIME_SNAPSHOT for a single snapshot. Reports take time to generate after creation.
Inputs: appId (required), accessType (required).
create_app_versionB
Create a new App Store version for an app.
Inputs: appId (required), platform (required), versionString (required), releaseType, +2 more.
create_bundle_idA
Register a new bundle ID in App Store Connect. The identifier must be unique and follow reverse-domain notation (e.g., com.example.app).
Inputs: identifier (required), name (required), platform (required).
create_version_localizationA
Create a new localization for an App Store version. Add descriptions, keywords, and other metadata in a specific locale.
Inputs: versionId (required), locale (required), description, keywords, +4 more.
delete_analytics_report_requestA
Delete an analytics report request. This stops report generation and removes access to existing reports.
Inputs: requestId (required).
delete_bundle_idA
Delete a bundle ID. Note: This cannot be undone and may affect apps using this bundle ID.
Inputs: bundleIdId (required).
delete_version_localizationB
Delete a version localization. Cannot delete the primary locale.
Inputs: localizationId (required).
download_analytics_report_segmentA
Download and parse an analytics report segment from its pre-signed URL. The segment data is gzip-compressed TSV. Returns parsed headers and rows (as key-value objects). Use list_analytics_report_segments to get the download URL first.
Inputs: url (required), maxRows.
get_analytics_report_requestC
Get details of a specific analytics report request.
Inputs: requestId (required).
get_appA
Get detailed information about a specific app by its ID.
Inputs: appId (required).
get_app_availabilityB
Get app availability information, including which territories the app is available in.
Inputs: appId (required).
get_app_perf_metricsA
Get performance and power metrics for an app (e.g., launch time, memory, battery, hangs). Returns Xcode-style metrics data with values per device and percentile. Use this for app-level aggregate metrics across all builds.
Inputs: appId (required), metricType (required), platform, deviceType.
get_app_price_scheduleC
Get the price schedule for an app, including pricing information.
Inputs: appId (required).
get_app_versionA
Get detailed information about a specific app version.
Inputs: versionId (required).
get_buildB
Get details of a specific build.
Inputs: buildId (required).
get_build_perf_metricsA
Get performance and power metrics for a specific build. Same metric types as get_app_perf_metrics but scoped to a single build. Useful for comparing performance between builds.
Inputs: buildId (required), metricType (required), platform, deviceType.
get_bundle_idC
Get details of a specific bundle ID.
Inputs: bundleIdId (required).
get_deviceB
Get details of a specific registered device.
Inputs: deviceId (required).
get_finance_reportA
Download and parse a finance report from App Store Connect. Returns financial report data as structured rows. Your vendor number can be found in App Store Connect under Settings > Agreements, Tax, and Banking. The regionCode is a 1-2 letter code representing the financial region (e.g., 'US' for United States, 'EU' for Europe, 'JP' for Japan, 'Z1' for rest of world). Report date must be in YYYY-MM format. Reports are typically available 30-45 days after the end of the fiscal month. Use FINANCIAL for revenue summary or FINANCE_DETAIL for line-item details.
Inputs: vendorNumber (required), regionCode (required), reportDate (required), reportType (required), +1 more.
get_price_point_equalizationsA
Get Apple's equivalent price points in other territories for a given price point. This is the core Purchase Power Parity (PPP) data — shows what Apple considers equivalent pricing across countries. Use list_app_price_points first to get a price point ID.
Inputs: pricePointId (required), territories, limit.
get_sales_reportA
Download and parse a sales report from App Store Connect. Returns tab-delimited report data as structured rows. Your vendor number can be found in App Store Connect under Settings > Agreements, Tax, and Banking. Valid report type and sub-type combinations: SALES + SUMMARY (daily/weekly/monthly/yearly), SUBSCRIPTION + SUMMARY (daily), SUBSCRIPTION_EVENT + SUMMARY (daily), SUBSCRIBER + DETAILED (daily), PRE_ORDER + SUMMARY (daily/weekly/monthly). Report date format varies by frequency: DAILY = YYYY-MM-DD, WEEKLY = YYYY-MM-DD (Sunday start), MONTHLY = YYYY-MM, YEARLY = YYYY.
Inputs: vendorNumber (required), reportType (required), reportSubType (required), frequency (required), +3 more.
get_userA
Get details of a specific team user.
Inputs: userId (required).
get_version_localizationB
Get detailed information about a specific version localization.
Inputs: localizationId (required).
list_analytics_report_instancesB
List report instances (dated snapshots) for an analytics report. Each instance represents data for a specific processing date. Can filter by granularity (DAILY, WEEKLY, MONTHLY) and processing date.
Inputs: reportId (required), granularity, processingDate, limit.
list_analytics_report_requestsA
List all analytics report requests for an app. Shows whether each request is active or stopped due to inactivity.
Inputs: appId (required), limit.
list_analytics_reportsA
List analytics reports available for a report request. Can filter by category (APP_STORE_ENGAGEMENT, COMMERCE, APP_USAGE, FRAMEWORKS_USAGE, PERFORMANCE).
Inputs: requestId (required), category, limit.
list_analytics_report_segmentsA
List downloadable segments for a report instance. Each segment contains a URL for downloading the report data, along with its checksum and size.
Inputs: instanceId (required), limit.
list_app_categoriesA
List all app categories available in the App Store. Can filter by platform.
Inputs: limit, platform.
list_app_info_localizationsB
List all localizations for an app info. Returns app name, subtitle, and privacy policy info for each locale.
Inputs: appInfoId (required), limit.
list_app_infosA
List app info records for an app. Use this to get the appInfoId needed for localization operations.
Inputs: appId (required), limit.
list_app_price_pointsA
List available price points for an app. Each price point represents a possible price tier showing customer price and developer proceeds in local currency. Filter by territory to see prices for a specific country.
Inputs: appId (required), territory, limit.
list_appsA
List all apps in your App Store Connect account. Returns app IDs, names, bundle IDs, and SKUs.
Inputs: limit.
list_app_versionsB
List all App Store versions for an app. Can filter by platform and version state.
Inputs: appId (required), platform, versionState, limit.
list_beta_groupsB
List all beta groups for an app. Returns group names, public link info, and settings.
Inputs: appId (required), limit.
list_beta_testersA
List all beta testers in a specific beta group.
Inputs: betaGroupId (required), limit.
list_buildsB
List all builds for an app.
Inputs: appId (required), limit.
list_bundle_idsB
List all bundle IDs registered in App Store Connect. Can filter by platform.
Inputs: limit, platform.
list_devicesC
List all registered devices in App Store Connect. Can filter by platform and status.
Inputs: limit, platform, status.
list_diagnostic_logsA
List diagnostic logs for a specific diagnostic signature. Returns individual log entries for a given performance issue. Use list_diagnostic_signatures first to get a signature ID.
Inputs: signatureId (required), limit.
list_diagnostic_signaturesA
List power and performance diagnostic signatures for a build. Signatures represent recurring performance issues (disk writes, hangs, slow launches) grouped by call stack. Use list_diagnostic_logs with a signature ID to get detailed logs.
Inputs: buildId (required), diagnosticType, limit.
list_screenshotsB
List all screenshots in a screenshot set.
Inputs: screenshotSetId (required), limit.
list_screenshot_setsA
List all screenshot sets for a version localization. Each set represents a different display type (device size).
Inputs: localizationId (required), limit.
list_territoriesA
List all App Store territories (countries/regions) with their currencies. Useful for understanding which markets are available for pricing.
Inputs: limit.
list_usersB
List all users in your App Store Connect team. Can filter by roles.
Inputs: limit, roles.
list_version_localizationsB
List all localizations for an App Store version. Returns description, keywords, what's new, and URLs for each locale.
Inputs: versionId (required), limit.
remove_beta_testerB
Remove a beta tester from a beta group.
Inputs: betaGroupId (required), betaTesterId (required).
set_app_pricesA
Set per-territory manual pricing for an app (Purchase Power Parity). WARNING: This replaces the entire price schedule — include ALL territory prices, not just changes. The base territory price must be included in manualPrices. Use list_app_price_points and get_price_point_equalizations to find price point IDs first.
Inputs: appId (required), baseTerritory (required), manualPrices (required).
update_app_info_localizationA
Update an app info localization. Use this to change app name, subtitle, or privacy policy URL for a locale.
Inputs: localizationId (required), name, subtitle, privacyPolicyUrl, +2 more.
update_bundle_idB
Update a bundle ID's name. Note: The identifier cannot be changed.
Inputs: bundleIdId (required), name (required).
update_version_localizationB
Update an existing version localization. Only provided fields will be updated.
Inputs: localizationId (required), description, keywords, whatsNew, +3 more.
upload_screenshotB
Upload a new screenshot to a screenshot set. Provide the local file path, and this tool will handle the multi-step upload process.
Inputs: screenshotSetId (required), fileName (required), fileSize (required), filePath (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 52 tools
Each tool targets a distinct resource and action, with clear naming that avoids overlap. Even tools like get_app_perf_metrics and get_build_perf_metrics are differentiated by scope (app-level vs build-level).
All tools follow a consistent verb_noun pattern with underscores, using predictable verbs like list_, get_, create_, delete_, update_, upload_. No mixing of cases or irregular patterns.
52 tools is a large number, but the App Store Connect platform has diverse functionality (analytics, beta, pricing, screenshots, diagnostics). The count is borderline heavy but each tool serves a specific, justified purpose.
The tool set covers core CRUD operations for apps, versions, localizations, builds, beta testing, devices, users, and various reports. Minor gaps include lack of submission/review management and in-app purchase handling, but the core workflows are well-supported.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Run App Store Connect from your IDE: pricing, listings, screenshots, releases, AI visibility.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP 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.84MIT
- AlicenseAqualityDmaintenanceA 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.69120 npm14MIT
- AlicenseAqualityBmaintenanceAn 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.41566 npm1MIT
- AlicenseBqualityBmaintenanceA 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.601MIT