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 389 tools across 30 App Store tool domains + 2 core domains, 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, availability, offer codes, win-back, intro, and promotional offers
- Provisioning — bundle IDs, devices, certificates, profiles, capabilities
- Marketing — screenshots, app previews, custom product pages, A/B testing (PPO), promoted purchases
- Accessibility declarations — manage App Store accessibility support declarations by device family
- Webhooks — manage webhook configurations, inspect delivery diagnostics, verify signatures, parse payloads, and triage events
- Analytics & Metrics — sales/financial reports, analytics reports, performance metrics, diagnostics
- Metadata management — localized descriptions, keywords, What's New across all locales
- MCP 2025-11-25 surface — tool annotations, output schemas for stable tools, structured JSON results, and safe result-size metadata
- OpenAPI drift tooling — generate coverage reports from Apple's official App Store Connect OpenAPI specification
Quick Start
# 1. Install via Mint
brew install mint
mint install zelentsov-dev/asc-mcp@v3.0.2
# 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-mcpOr use a JSON config file — see Configuration below.
Prerequisites
| Requirement | Version |
|---|---|
| macOS | 14.0+ (Sonoma) |
| Swift | 6.2+ |
| Xcode | 26.0+ or a Swift 6.2 toolchain |
| App Store Connect API Key | Create 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@v3.0.2
# Register in Claude Code
claude mcp add asc-mcp -- ~/.mint/bin/asc-mcpTo 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@v3.0.2 # specific tagTo update to the latest version:
mint install zelentsov-dev/asc-mcp@v3.0.2 --forceOption 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
- Go to App Store Connect → Users and Access → Integrations → Team Keys
- Click Generate API Key — select appropriate role (Admin or App Manager recommended)
- Download the
.p8private key file (you can only download it once!) - 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 analyticsMultiple 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.p8Numbering starts at 1. The server scans while
ASC_COMPANY_{N}_KEY_IDexists.
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_numberis 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:
--companies /path/to/companies.json(CLI argument)- Constructor parameter (programmatic)
ASC_MCP_COMPANIES=/path/to/companies.json(env var pointing to JSON file)- Default JSON file paths (
~/.config/asc-mcp/companies.json, etc.) ASC_COMPANY_1_KEY_ID... (multi-company env vars)ASC_KEY_ID+ASC_ISSUER_ID(single-company env vars)
3. MCP Host Configuration
<details> <summary><strong>Claude Code (CLI)</strong></summary>claude mcp add asc-mcp -- ~/.mint/bin/asc-mcpOr add to .mcp.json (project) / .claude/settings.json (global) with env vars:
{
"mcpServers": {
"asc-mcp": {
"command": "/path/to/asc-mcp",
"env": {
"ASC_KEY_ID": "XXXXXXXXXX",
"ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
}
}
}
}Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"asc-mcp": {
"command": "/path/to/asc-mcp",
"env": {
"ASC_KEY_ID": "XXXXXXXXXX",
"ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
}
}
}
}Add to ~/.codex/config.toml:
[mcp_servers.asc-mcp]
command = "/path/to/asc-mcp"
startup_timeout_sec = 20
tool_timeout_sec = 60
enabled = trueSet env vars in your shell or use a wrapper script.
</details> <details> <summary><strong>Gemini CLI</strong></summary>Add to ~/.gemini/settings.json:
{
"mcpServers": {
"asc-mcp": {
"command": "/path/to/asc-mcp",
"timeout": 60000,
"env": {
"ASC_KEY_ID": "XXXXXXXXXX",
"ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
}
}
}
}Add to .vscode/mcp.json:
{
"servers": {
"asc-mcp": {
"command": "/path/to/asc-mcp",
"env": {
"ASC_KEY_ID": "XXXXXXXXXX",
"ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
}
}
}
}Add to Cursor settings → MCP Servers:
{
"mcpServers": {
"asc-mcp": {
"command": "/path/to/asc-mcp",
"env": {
"ASC_KEY_ID": "XXXXXXXXXX",
"ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
}
}
}
}Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"asc-mcp": {
"command": "/path/to/asc-mcp",
"args": ["--workers", "apps,builds,versions,reviews,beta_groups,iap"],
"env": {
"ASC_KEY_ID": "XXXXXXXXXX",
"ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
}
}
}
}</details>Note: Windsurf has a 100-tool limit. The server exposes 389 tools by default, so you must use
--workersto select a subset. See Worker Filtering below.
[!IMPORTANT] If the MCP host doesn't inherit your shell PATH, you may need to specify the full path to the binary and ensure
.p8key paths a
…