VOOZH about

URL: https://mcp.so/server/asc-mcp/zelentsov-dev

⇱ App Store Connect MCP Server MCP Server


App Store Connect MCP Server

@zelentsov-dev

MCP 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.
Overview

App Store Connect MCP Server

A Model Context Protocol server for the App Store Connect API.
Manage apps, builds, TestFlight, reviews, and more — directly from Claude.

👁 Swift 6.2+
👁 macOS 14.0+
👁 MCP Compatible
👁 MIT License
👁 CI

Works with:
👁 Claude Code
👁 Claude Desktop
👁 VS Code
👁 Cursor
👁 Windsurf
👁 Codex CLI
👁 Gemini CLI


Overview

asc-mcp is a Swift-based MCP server that bridges Claude (or any MCP-compatible host) with the App Store Connect API. It exposes 208 tools across 25 workers, enabling you to automate your entire iOS/macOS release workflow through natural language.

Key capabilities

  • Multi-account — manage multiple App Store Connect teams from a single server
  • Full release pipeline — create versions, attach builds, submit for review, phased rollout
  • TestFlight automation — beta groups, testers, build distribution, localized What's New
  • Build management — track processing, encryption compliance, readiness checks
  • Customer reviews — list, respond, update, delete responses, aggregate statistics
  • In-app purchases — CRUD for IAPs, localizations, price points, review screenshots
  • Subscriptions — subscription CRUD, groups, localizations, prices, offer codes, win-back offers
  • Provisioning — bundle IDs, devices, certificates, profiles, capabilities
  • Marketing — screenshots, app previews, custom product pages, A/B testing (PPO), promoted purchases
  • Analytics & Metrics — sales/financial reports, analytics reports, performance metrics, diagnostics
  • Metadata management — localized descriptions, keywords, What's New across all locales

Quick Start

# 1. Install via Mint
brew install mint
mint install zelentsov-dev/asc-mcp@1.4.0
# 2. Add to Claude Code with env vars (simplest setup)
claude mcp add asc-mcp \
 -e ASC_KEY_ID=XXXXXXXXXX \
 -e ASC_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
 -e ASC_PRIVATE_KEY_PATH=/path/to/AuthKey.p8 \
 -- ~/.mint/bin/asc-mcp

Or use a JSON config file — see Configuration below.

Prerequisites

RequirementVersion
macOS14.0+ (Sonoma)
Swift6.2+
Xcode16.0+ (for building)
App Store Connect API KeyCreate one here

Installation

Option A: Mint (recommended)

Mint is the simplest way to install — one command, no manual cloning.

# Install Mint (if you don't have it)
brew install mint
# Install asc-mcp from GitHub
mint install zelentsov-dev/asc-mcp@1.4.0
# Register in Claude Code
claude mcp add asc-mcp -- ~/.mint/bin/asc-mcp

To install a specific branch or tag:

mint install zelentsov-dev/asc-mcp@main # main branch
mint install zelentsov-dev/asc-mcp@develop # develop branch
mint install zelentsov-dev/asc-mcp@1.4.0 # specific tag

To update to the latest version:

mint install zelentsov-dev/asc-mcp@1.4.0 --force

Option B: Build from Source

git clone https://github.com/zelentsov-dev/asc-mcp.git
cd asc-mcp
swift build -c release
# Register in Claude Code
claude mcp add asc-mcp -- $(pwd)/.build/release/asc-mcp

TIP

For convenience, copy the binary to a location in your PATH:

cp .build/release/asc-mcp /usr/local/bin/asc-mcp

Configuration

1. App Store Connect API Key

  1. Go to App Store Connect → Users and Access → Integrations → Team Keys
  2. Click Generate API Key — select appropriate role (Admin or App Manager recommended)
  3. Download the .p8 private key file (you can only download it once!)
  4. Note the Key ID and Issuer ID

2. Companies Configuration

asc-mcp supports three configuration methods (checked in this order):

Option A: Environment Variables (recommended for MCP clients)

Single company — simplest setup:

export ASC_KEY_ID=XXXXXXXXXX
export ASC_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
export ASC_PRIVATE_KEY_PATH=/path/to/AuthKey.p8
# or pass the key content directly:
# export ASC_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIGT..."
# optional:
# export ASC_COMPANY_NAME="My Company"
# export ASC_VENDOR_NUMBER=YOUR_VENDOR_NUMBER # for analytics

Multiple companies — numbered variables:

export ASC_COMPANY_1_NAME="My Company"
export ASC_COMPANY_1_KEY_ID=XXXXXXXXXX
export ASC_COMPANY_1_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
export ASC_COMPANY_1_KEY_PATH=/path/to/AuthKey1.p8
export ASC_COMPANY_1_VENDOR_NUMBER=YOUR_VENDOR_NUMBER # optional, for analytics
export ASC_COMPANY_2_NAME="Client Corp"
export ASC_COMPANY_2_KEY_ID=YYYYYYYYYY
export ASC_COMPANY_2_ISSUER_ID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
export ASC_COMPANY_2_KEY_PATH=/path/to/AuthKey2.p8

Numbering starts at 1. The server scans while ASC_COMPANY_{N}_KEY_ID exists.

Option B: JSON Config File

Create ~/.config/asc-mcp/companies.json:

{
 "companies": [
 {
 "id": "my-company",
 "name": "My Company",
 "key_id": "XXXXXXXXXX",
 "issuer_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
 "key_path": "/Users/you/.keys/AuthKey_XXXXXXXXXX.p8",
 "vendor_number": "YOUR_VENDOR_NUMBER"
 },
 {
 "id": "client-company",
 "name": "Client Corp",
 "key_id": "YYYYYYYYYY",
 "issuer_id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
 "key_path": "/Users/you/.keys/AuthKey_YYYYYYYYYY.p8",
 "vendor_number": "YOUR_VENDOR_NUMBER"
 }
 ]
}

Note: vendor_number is required for analytics tools (analytics_sales_report, analytics_financial_report, analytics_app_summary). Find it in App Store Connect → Sales and Trends → Reports.

Configuration Priority

The server resolves configuration in this order:

  1. --companies /path/to/companies.json (CLI argument)
  2. Constructor parameter (programmatic)
  3. ASC_MCP_COMPANIES=/path/to/companies.json (env var pointing to JSON file)
  4. Default JSON file paths (~/.config/asc-mcp/companies.json, etc.)
  5. ASC_COMPANY_1_KEY_ID ... (multi-company env vars)
  6. ASC_KEY_ID + ASC_ISSUER_ID (single-company env vars)

3. MCP Host Configuration

IMPORTANT

If the MCP host doesn't inherit your shell PATH, you may need to specify the full path to the binary and ensure .p8 key paths are absolute.

Worker Filtering

The server exposes 208 tools across 25 workers. Some MCP clients impose a tool limit (e.g., Windsurf caps at 100). Use --workers to enable only the workers you need:

# Only load apps, builds, and version lifecycle tools
asc-mcp --workers apps,builds,versions
# Full release workflow subset (~60 tools, fits within any client limit)
asc-mcp --workers apps,builds,versions,reviews,beta_groups,iap
# Monetization focus
asc-mcp --workers apps,iap,subscriptions,offer_codes,winback,pricing,promoted

company and auth workers are always enabled regardless of the filter (they provide core multi-account and authentication functionality).

When builds is enabled, it automatically includes build_processing and build_beta sub-workers.

Available worker names:

WorkerPrefixToolsDescription
appsapps_9App listing, metadata, localizations
buildsbuilds_4Build management
build_processingbuilds_*_processing_4Build states, encryption
build_betabuilds_*_beta_8TestFlight localizations, notifications
versionsapp_versions_13Version lifecycle, submit, release
reviewsreviews_7Customer reviews and responses
beta_groupsbeta_groups_9TestFlight groups
beta_testersbeta_testers_6Tester management
iapiap_17In-app purchases, prices, review screenshots
subscriptionssubscriptions_15Subscription CRUD, groups, localizations, prices
offer_codesoffer_codes_7Subscription offer codes, one-time codes
winbackwinback_5Win-back offers for subscriptions
provisioningprovisioning_17Bundle IDs, devices, certificates
app_infoapp_info_7App info, categories
pricingpricing_6Territories, pricing
usersusers_7Team members, roles
app_eventsapp_events_9In-app events, localizations
analyticsanalytics_11Sales/financial reports, analytics
screenshotsscreenshots_12Screenshots, previews, sets
custom_pagescustom_pages_10Custom product pages
ppoppo_9Product page optimization (A/B tests)
promotedpromoted_5Promoted in-app purchases
metricsmetrics_4Performance metrics, diagnostics

Token Cost

When connected to an LLM client, tool definitions consume context tokens. Here's the approximate footprint:

ConfigurationTools~Tokens
All workers (default)208~24,000
Release workflow: apps,builds,versions,reviews~40~5,500
Monetization: apps,iap,subscriptions,pricing~54~6,500
TestFlight: apps,builds,beta_groups,beta_testers~34~4,500
Marketing: apps,screenshots,custom_pages,ppo,promoted~46~5,800
--workers apps16~1,850

Heaviest workers: Provisioning (17 tools), InAppPurchases (17 tools), Subscriptions (15 tools), AppLifecycle (13 tools), Screenshots (12 tools).

For Claude (200K context) ~22K tokens is ~5–7% — negligible. For clients with smaller context windows, use --workers to reduce the footprint.

Available Tools

208 tools organized across 25 workers (use --workers to filter — see Worker Filtering):

Usage Examples

Complete Release Workflow

You: "Release version 2.1.0 of my app with build 456"
Claude will:
1. app_versions_create(app_id, platform: "IOS", version_string: "2.1.0")
2. app_versions_attach_build(version_id, build_id)
3. app_versions_set_review_details(version_id, contact_email: "...")
4. app_versions_submit_for_review(version_id)
5. app_versions_create_phased_release(version_id) # after approval

TestFlight Distribution

You: "Create a beta group 'External Testers' and distribute the latest build"
Claude will:
1. beta_groups_create(app_id, name: "External Testers")
2. builds_list(app_id, limit: 1) # find latest
3. builds_set_beta_localization(build_id, locale: "en-US", whats_new: "...")
4. beta_groups_add_testers(group_id, tester_ids: [...])

Review Management

You: "Show me all 1-star reviews from the last week and draft responses"
Claude will:
1. reviews_list(app_id, rating: 1, sort: "-createdDate", limit: 50)
2. reviews_create_response(review_id, response_body: "...") # for each

Multi-Company Workflow

You: "Switch to ClientCorp and check their latest build status"
Claude will:
1. company_switch(company: "ClientCorp")
2. apps_list(limit: 5)
3. builds_list(app_id, limit: 1)
4. builds_get_processing_state(build_id)

API Constraints

ConstraintDetails
No emojisMetadata fields (What's New, Description, Keywords) must not contain emoji characters
Version stateOnly versions in PREPARE_FOR_SUBMISSION state can be edited
JWT expiryTokens expire after 20 minutes — the server auto-refreshes them
Rate limitsApple enforces per-account rate limits (documentation)
Locale formatUse standard codes: en-US, ru, de-DE, ja, zh-Hans

Architecture

Sources/asc-mcp/
├── EntryPoint.swift # Entry point, --workers filtering
├── Core/
│ ├── Application.swift # MCP server setup & initialization
│ └── ASCError.swift # Custom error types
├── Helpers/ # JSON formatting, pagination, safe helpers
├── Models/ # API request/response models
│ ├── AppStoreConnect/ # Apps, versions, localizations
│ ├── Builds/ # Builds, beta details, beta groups
│ ├── AppLifecycle/ # Version lifecycle models
│ ├── InAppPurchases/ # IAP models
│ ├── Subscriptions/ # Subscriptions, offer codes, win-back
│ ├── Marketing/ # Screenshots, custom pages, PPO, promoted
│ ├── Metrics/ # Performance metrics, diagnostics
│ ├── Analytics/ # Sales/financial reports
│ ├── Provisioning/ # Bundle IDs, devices, certificates
│ ├── Shared/ # Shared upload/image types
│ └── ... # AppEvents, AppInfo, Pricing, Users
├── Services/
│ ├── HTTPClient.swift # Actor-based HTTP with retry logic
│ ├── JWTService.swift # ES256 JWT token generation
│ └── CompaniesManager.swift # Multi-account management
└── Workers/ # MCP tool implementations (25 workers)
 ├── MainWorker/WorkerManager # Central tool registry & routing
 ├── CompaniesWorker/ # company_* tools
 ├── AuthWorker/ # auth_* tools
 ├── AppsWorker/ # apps_* tools
 ├── BuildsWorker/ # builds_* tools
 ├── BuildProcessingWorker/ # builds_*_processing tools
 ├── BuildBetaDetailsWorker/ # builds_*_beta_* tools
 ├── AppLifecycleWorker/ # app_versions_* tools
 ├── ReviewsWorker/ # reviews_* tools
 ├── BetaGroupsWorker/ # beta_groups_* tools
 ├── BetaTestersWorker/ # beta_testers_* tools
 ├── InAppPurchasesWorker/ # iap_* tools
 ├── SubscriptionsWorker/ # subscriptions_* tools
 ├── OfferCodesWorker/ # offer_codes_* tools
 ├── WinBackOffersWorker/ # winback_* tools
 ├── ProvisioningWorker/ # provisioning_* tools
 ├── AppInfoWorker/ # app_info_* tools
 ├── PricingWorker/ # pricing_* tools
 ├── UsersWorker/ # users_* tools
 ├── AppEventsWorker/ # app_events_* tools
 ├── AnalyticsWorker/ # analytics_* tools
 ├── ScreenshotsWorker/ # screenshots_* tools
 ├── CustomProductPagesWorker/ # custom_pages_* tools
 ├── ProductPageOptimizationWorker/ # ppo_* tools
 ├── PromotedPurchasesWorker/ # promoted_* tools
 └── MetricsWorker/ # metrics_* tools

Design Principles

  • Swift 6 strict concurrency — all workers and services are Sendable, proper actor isolation
  • Actor-based HTTP client — thread-safe with exponential backoff and retry logic
  • Prefix-based routingWorkerManager routes tool calls by name prefix (zero config)
  • Minimal dependencies — only the MCP Swift SDK

Troubleshooting

Development

Building

swift build # Debug build
swift build -c release # Release build (optimized)
swift package clean # Clean build artifacts

Test Mode

.build/debug/asc-mcp --test # Runs built-in integration tests

Adding a New Tool

  1. Create handler method in the appropriate Worker+Handlers.swift
  2. Add tool definition in Worker+ToolDefinitions.swift
  3. Register in worker's getTools() method
  4. Add routing case in worker's handleTool() switch
  5. The WorkerManager auto-routes by prefix — no changes needed there

Adding a New Worker

  1. Create directory: Workers/MyWorker/
  2. Create 3 files: MyWorker.swift, MyWorker+ToolDefinitions.swift, MyWorker+Handlers.swift
  3. Add worker property and initialization in WorkerManager.swift
  4. Add routing rule in WorkerManager.registerWorkers()
  5. Add getMyTools() helper method

Contributing

We welcome contributions! See Contributing Guide for details.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Acknowledgments


This is an unofficial, community-maintained tool and is not affiliated with or endorsed by Apple Inc.

Server Config

{
 "mcpServers": {
 "asc-mcp": {
 "command": "/Users/YOU/.mint/bin/asc-mcp",
 "env": {
 "ASC_KEY_ID": "YOUR_KEY_ID",
 "ASC_ISSUER_ID": "YOUR_ISSUER_ID",
 "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
 }
 }
 }
}
© 2025 MCP.so. All rights reserved.

Build with ShipAny.