Server data from the Official MCP Registry
MCP server for Apple's App Store Connect API. Manage apps, TestFlight, and more.
MCP server for Apple's App Store Connect API. Manage apps, TestFlight, and more.
Valid MCP server (1 strong, 1 medium validity signals). 10 known CVEs in dependencies (1 critical, 5 high severity) Package registry verified. Imported from the Official MCP Registry.
4 files analyzed · 11 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Unverified package source
We couldn't verify that the installable package matches the reviewed source code. Proceed with caution.
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-sardorbekr-appstore-connect": {
"args": [
"-y",
"asc-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
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.
# 1. Install
npm install -g asc-mcp
# 2. Set credentials (get from App Store Connect > Users and Access > Keys)
export APP_STORE_CONNECT_KEY_ID="YOUR_KEY_ID"
export APP_STORE_CONNECT_ISSUER_ID="YOUR_ISSUER_ID"
export APP_STORE_CONNECT_P8_PATH="/path/to/AuthKey.p8"
# 3. Add to your MCP client config and start using!
npm install -g asc-mcp
npx asc-mcp
git clone https://github.com/SardorbekR/appstore-connect-mcp.git
cd appstore-connect-mcp
npm install
npm run build
| Variable | Required | Description |
|---|---|---|
APP_STORE_CONNECT_KEY_ID | Yes | Your API Key ID (e.g., ABC123DEFG) |
APP_STORE_CONNECT_ISSUER_ID | Yes | Your Issuer ID (UUID format) |
APP_STORE_CONNECT_P8_PATH | Yes* | Path to your .p8 private key file |
APP_STORE_CONNECT_P8_CONTENT | Yes* | Raw content of .p8 key (alternative to path) |
*One of P8_PATH or P8_CONTENT is required.
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": "asc-mcp",
"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"],
"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": "asc-mcp",
"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": "asc-mcp",
"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-----"
}
}
}
}
| Tool | Description | Parameters |
|---|---|---|
list_apps | List all apps in your account | limit? (number, 1-200) |
get_app | Get details of a specific app | appId (string, required) |
| Tool | Description | Parameters |
|---|---|---|
list_app_versions | List all versions for an app | appId, platform?, versionState?, limit? |
get_app_version | Get version details | versionId |
create_app_version | Create a new app version | appId, platform, versionString, releaseType? |
| Tool | Description | Parameters |
|---|---|---|
list_version_localizations | List localizations for a version | versionId, limit? |
get_version_localization | Get localization details | localizationId |
create_version_localization | Add a new locale | versionId, locale, description?, keywords?, whatsNew? |
update_version_localization | Update localization | localizationId, description?, keywords?, whatsNew?, promotionalText? |
delete_version_localization | Remove a locale | localizationId |
| Tool | Description | Parameters |
|---|---|---|
list_app_infos | List app info records | appId, limit? |
list_app_info_localizations | List name/subtitle localizations | appInfoId, limit? |
update_app_info_localization | Update app name, subtitle | localizationId, name?, subtitle?, privacyPolicyUrl? |
| Tool | Description | Parameters |
|---|---|---|
list_beta_groups | List beta groups for an app | appId, limit? |
list_beta_testers | List testers in a group | betaGroupId, limit? |
add_beta_tester | Add a tester to a group | betaGroupId, email, firstName?, lastName? |
remove_beta_tester | Remove a tester from a group | betaGroupId, betaTesterId |
| Tool | Description | Parameters |
|---|---|---|
list_screenshot_sets | List screenshot sets | localizationId, limit? |
list_screenshots | List screenshots in a set | screenshotSetId, limit? |
upload_screenshot | Upload a new screenshot | screenshotSetId, fileName, fileSize, filePath |
| Tool | Description | Parameters |
|---|---|---|
list_bundle_ids | List all bundle IDs | limit?, platform? |
get_bundle_id | Get bundle ID details | bundleIdId |
create_bundle_id | Register a new bundle ID | identifier, name, platform |
update_bundle_id | Update bundle ID name | bundleIdId, name |
delete_bundle_id | Delete a bundle ID | bundleIdId |
| Tool | Description | Parameters |
|---|---|---|
list_devices | List registered devices | limit?, platform?, status? |
get_device | Get device details | deviceId |
| Tool | Description | Parameters |
|---|---|---|
list_users | List team users | limit?, roles? |
get_user | Get user details | userId |
| Tool | Description | Parameters |
|---|---|---|
list_builds | List builds for an app | appId, limit? |
get_build | Get build details | buildId |
| Tool | Description | Parameters |
|---|---|---|
list_app_categories | List app categories | limit?, platform? |
get_app_price_schedule | Get app pricing info | appId |
get_app_availability | Get app territory availability | appId |
| Tool | Description | Parameters |
|---|---|---|
list_territories | List all territories with currencies | limit? |
list_app_price_points | List available price tiers for an app | appId, territory?, limit? |
get_price_point_equalizations | Get PPP equivalent prices across countries | pricePointId, territories?, limit? |
set_app_prices | Set per-territory manual pricing (replaces entire schedule) | appId, baseTerritory, manualPrices |
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_in_app_purchases | List an app's in-app purchases, optionally by type | appId, inAppPurchaseType?, limit? |
get_in_app_purchase | Get a single in-app purchase's details and state | inAppPurchaseId |
create_in_app_purchase | Create an IAP (defaults to NON_CONSUMABLE / lifetime) | appId, name, productId, inAppPurchaseType?, familySharable?, reviewNote? |
update_in_app_purchase | Update name, Family Sharing, or review note (productId/type immutable) | inAppPurchaseId, name?, familySharable?, reviewNote? |
delete_in_app_purchase | Delete an in-app purchase | inAppPurchaseId |
list_in_app_purchase_localizations | List localized names/descriptions | inAppPurchaseId, limit? |
create_in_app_purchase_localization | Add a localized display name (+ description) | inAppPurchaseId, locale, name, description? |
update_in_app_purchase_localization | Update a localization | localizationId, name?, description? |
delete_in_app_purchase_localization | Delete a localization | localizationId |
list_in_app_purchase_price_points | List price points (customer price & proceeds) | inAppPurchaseId, territory?, limit?, offset? |
get_in_app_purchase_price_point_equalizations | Apple's PPP-equivalent price points for a base price point | pricePointId, territories?, limit? |
set_in_app_purchase_price | Set pricing (replaces schedule; one base territory to auto-equalize, or full PPP list) | inAppPurchaseId, baseTerritory, manualPrices |
list_in_app_purchase_prices | Read current per-territory prices (manual; optional automatic) | inAppPurchaseId, territory?, includeAutomatic?, limit? |
get_in_app_purchase_availability | Get territory availability | inAppPurchaseId |
set_in_app_purchase_availability | Set territory availability | inAppPurchaseId, availableInNewTerritories, territories? |
submit_in_app_purchase_for_review | Submit the IAP to App Review (independent of an app version) | inAppPurchaseId |
| Tool | Description | Parameters |
|---|---|---|
create_analytics_report_request | Request an analytics report (ongoing or one-time snapshot) | appId, accessType |
list_analytics_report_requests | List analytics report requests for an app | appId |
get_analytics_report_request | Get an analytics report request | requestId |
delete_analytics_report_request | Delete an analytics report request | requestId |
list_analytics_reports | List reports available within a request | requestId |
list_analytics_report_instances | List instances (by date) of a report | reportId |
list_analytics_report_segments | List downloadable segments of a report instance | instanceId |
download_analytics_report_segment | Download a report segment | url |
| Tool | Description | Parameters |
|---|---|---|
get_sales_report | Download a sales/trends report | vendorNumber, reportType, reportSubType, frequency, reportDate |
get_finance_report | Download a financial report | vendorNumber, regionCode, reportDate, reportType |
| Tool | Description | Parameters |
|---|---|---|
get_app_perf_metrics | Get an app's power & performance metrics | appId, metricType |
get_build_perf_metrics | Get a build's performance metrics | buildId, metricType |
list_diagnostic_signatures | List diagnostic signatures for a build | buildId |
list_diagnostic_logs | List diagnostic logs for a signature | signatureId |
"Show me all my apps in App Store Connect"
Claude will use list_apps to retrieve and display your apps.
"Update the English description for version 2.0 of MyApp to: 'A revolutionary app that simplifies your daily tasks.'"
Claude will:
list_appslist_app_versionslist_version_localizationsupdate_version_localization"Add Japanese localization to MyApp version 2.0 with description '素晴らしいアプリです' and keywords 'アプリ,便利,簡単'"
Claude will use create_version_localization with locale ja.
"Add john@example.com as a beta tester to the Internal Testing group for MyApp"
Claude will:
list_beta_groupsadd_beta_tester"Show me the equivalent prices for my $9.99 tier in India, Brazil, and Turkey"
Claude will:
list_app_price_pointsget_price_point_equalizations"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.
"Add a $99.99 lifetime unlock to MyApp with PPP pricing for India and Brazil"
Claude will:
create_in_app_purchasecreate_in_app_purchase_localizationlist_in_app_purchase_price_points, then PPP equivalents with get_in_app_purchase_price_point_equalizationsset_in_app_purchase_price and open availability with set_in_app_purchase_availabilitylist_in_app_purchase_prices"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.)
.. not allowed)600 (owner read/write only)chmod 600 /path/to/AuthKey.p8
Ensure all required environment variables are set:
APP_STORE_CONNECT_KEY_IDAPP_STORE_CONNECT_ISSUER_IDAPP_STORE_CONNECT_P8_PATH or APP_STORE_CONNECT_P8_CONTENTAPP_STORE_CONNECT_P8_PATH is correct and absolutels -la /path/to/AuthKey.p8.p8 from Apple (starts with -----BEGIN PRIVATE KEY-----)This usually means:
The server includes built-in rate limiting (50 requests/minute). If you hit Apple's limits:
# 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 typecheck
src/
├── index.ts # MCP server entry point
├── auth/
│ └── jwt.ts # JWT token generation & caching
├── api/
│ ├── client.ts # HTTP client with retry logic
│ └── types.ts # TypeScript interfaces
├── tools/
│ ├── index.ts # Tool registry
│ ├── 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
└── utils/
├── errors.ts # Error classes with redaction
└── validation.ts # Zod schemas
# Development mode with auto-reload
npm run dev
# Or run the built version
npm start
git checkout -b feature/my-featurenpm test and npm run lintMIT License - see LICENSE for details.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.