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. Works with: 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
Add this skill
npx mdskills install zelentsov-dev/asc-mcpComprehensive MCP server bridging Claude with App Store Connect API via 208 tools across 25 workers
1<p align="center">2 <h1 align="center">App Store Connect MCP Server</h1>3 <p align="center">4 A Model Context Protocol server for the App Store Connect API.<br/>5 Manage apps, builds, TestFlight, reviews, and more — directly from Claude.6 </p>7</p>89<p align="center">10 <a href="https://swift.org"><img src="https://img.shields.io/badge/Swift-6.2+-F05138.svg?style=flat&logo=swift&logoColor=white" alt="Swift 6.2+"></a>11 <a href="https://developer.apple.com/macos/"><img src="https://img.shields.io/badge/macOS-14.0+-000000.svg?style=flat&logo=apple&logoColor=white" alt="macOS 14.0+"></a>12 <a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-compatible-4A90D9.svg?style=flat" alt="MCP Compatible"></a>13 <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=flat" alt="MIT License"></a>14 <a href="https://github.com/zelentsov-dev/asc-mcp/actions"><img src="https://github.com/zelentsov-dev/asc-mcp/actions/workflows/ci.yml/badge.svg" alt="CI"></a>15</p>1617<p align="center">18 <strong>Works with:</strong><br/>19 <a href="https://claude.ai/code"><img src="https://img.shields.io/badge/Claude_Code-black?style=flat&logo=anthropic&logoColor=white" alt="Claude Code"></a>20 <a href="https://claude.ai/download"><img src="https://img.shields.io/badge/Claude_Desktop-black?style=flat&logo=anthropic&logoColor=white" alt="Claude Desktop"></a>21 <a href="https://code.visualstudio.com"><img src="https://img.shields.io/badge/VS_Code-007ACC?style=flat&logo=visualstudiocode&logoColor=white" alt="VS Code"></a>22 <a href="https://cursor.com"><img src="https://img.shields.io/badge/Cursor-000000?style=flat&logo=cursor&logoColor=white" alt="Cursor"></a>23 <a href="https://windsurf.com"><img src="https://img.shields.io/badge/Windsurf-0066FF?style=flat" alt="Windsurf"></a>24 <a href="https://github.com/openai/codex"><img src="https://img.shields.io/badge/Codex_CLI-412991?style=flat&logo=openai&logoColor=white" alt="Codex CLI"></a>25 <a href="https://ai.google.dev"><img src="https://img.shields.io/badge/Gemini_CLI-4285F4?style=flat&logo=google&logoColor=white" alt="Gemini CLI"></a>26</p>2728---2930## Overview3132**asc-mcp** is a Swift-based MCP server that bridges [Claude](https://claude.ai) (or any MCP-compatible host) with the [App Store Connect API](https://developer.apple.com/documentation/appstoreconnectapi). It exposes **208 tools** across 25 workers, enabling you to automate your entire iOS/macOS release workflow through natural language.3334### Key capabilities3536- **Multi-account** — manage multiple App Store Connect teams from a single server37- **Full release pipeline** — create versions, attach builds, submit for review, phased rollout38- **TestFlight automation** — beta groups, testers, build distribution, localized What's New39- **Build management** — track processing, encryption compliance, readiness checks40- **Customer reviews** — list, respond, update, delete responses, aggregate statistics41- **In-app purchases** — CRUD for IAPs, localizations, price points, review screenshots42- **Subscriptions** — subscription CRUD, groups, localizations, prices, offer codes, win-back offers43- **Provisioning** — bundle IDs, devices, certificates, profiles, capabilities44- **Marketing** — screenshots, app previews, custom product pages, A/B testing (PPO), promoted purchases45- **Analytics & Metrics** — sales/financial reports, analytics reports, performance metrics, diagnostics46- **Metadata management** — localized descriptions, keywords, What's New across all locales4748## Quick Start4950```bash51# 1. Install via Mint52brew install mint53mint install zelentsov-dev/asc-mcp@1.4.05455# 2. Add to Claude Code with env vars (simplest setup)56claude mcp add asc-mcp \57 -e ASC_KEY_ID=XXXXXXXXXX \58 -e ASC_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \59 -e ASC_PRIVATE_KEY_PATH=/path/to/AuthKey.p8 \60 -- ~/.mint/bin/asc-mcp61```6263Or use a JSON config file — see [Configuration](#configuration) below.6465## Prerequisites6667| Requirement | Version |68|-------------|---------|69| macOS | 14.0+ (Sonoma) |70| Swift | 6.2+ |71| Xcode | 16.0+ (for building) |72| App Store Connect API Key | [Create one here](https://appstoreconnect.apple.com/access/integrations/api) |7374## Installation7576### Option A: Mint (recommended)7778[Mint](https://github.com/yonaskolb/Mint) is the simplest way to install — one command, no manual cloning.7980```bash81# Install Mint (if you don't have it)82brew install mint8384# Install asc-mcp from GitHub85mint install zelentsov-dev/asc-mcp@1.4.08687# Register in Claude Code88claude mcp add asc-mcp -- ~/.mint/bin/asc-mcp89```9091To install a specific branch or tag:9293```bash94mint install zelentsov-dev/asc-mcp@main # main branch95mint install zelentsov-dev/asc-mcp@develop # develop branch96mint install zelentsov-dev/asc-mcp@1.4.0 # specific tag97```9899To update to the latest version:100101```bash102mint install zelentsov-dev/asc-mcp@1.4.0 --force103```104105### Option B: Build from Source106107```bash108git clone https://github.com/zelentsov-dev/asc-mcp.git109cd asc-mcp110swift build -c release111112# Register in Claude Code113claude mcp add asc-mcp -- $(pwd)/.build/release/asc-mcp114```115116> [!TIP]117> For convenience, copy the binary to a location in your PATH:118> ```bash119> cp .build/release/asc-mcp /usr/local/bin/asc-mcp120> ```121122## Configuration123124### 1. App Store Connect API Key1251261. Go to [App Store Connect → Users and Access → Integrations → Team Keys](https://appstoreconnect.apple.com/access/integrations/api)1272. Click **Generate API Key** — select appropriate role (Admin or App Manager recommended)1283. Download the `.p8` private key file (you can only download it once!)1294. Note the **Key ID** and **Issuer ID**130131### 2. Companies Configuration132133asc-mcp supports three configuration methods (checked in this order):134135#### Option A: Environment Variables (recommended for MCP clients)136137**Single company** — simplest setup:138139```bash140export ASC_KEY_ID=XXXXXXXXXX141export ASC_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx142export ASC_PRIVATE_KEY_PATH=/path/to/AuthKey.p8143# or pass the key content directly:144# export ASC_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIGT..."145# optional:146# export ASC_COMPANY_NAME="My Company"147# export ASC_VENDOR_NUMBER=YOUR_VENDOR_NUMBER # for analytics148```149150**Multiple companies** — numbered variables:151152```bash153export ASC_COMPANY_1_NAME="My Company"154export ASC_COMPANY_1_KEY_ID=XXXXXXXXXX155export ASC_COMPANY_1_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx156export ASC_COMPANY_1_KEY_PATH=/path/to/AuthKey1.p8157export ASC_COMPANY_1_VENDOR_NUMBER=YOUR_VENDOR_NUMBER # optional, for analytics158159export ASC_COMPANY_2_NAME="Client Corp"160export ASC_COMPANY_2_KEY_ID=YYYYYYYYYY161export ASC_COMPANY_2_ISSUER_ID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy162export ASC_COMPANY_2_KEY_PATH=/path/to/AuthKey2.p8163```164165> Numbering starts at 1. The server scans while `ASC_COMPANY_{N}_KEY_ID` exists.166167#### Option B: JSON Config File168169Create `~/.config/asc-mcp/companies.json`:170171```json172{173 "companies": [174 {175 "id": "my-company",176 "name": "My Company",177 "key_id": "XXXXXXXXXX",178 "issuer_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",179 "key_path": "/Users/you/.keys/AuthKey_XXXXXXXXXX.p8",180 "vendor_number": "YOUR_VENDOR_NUMBER"181 },182 {183 "id": "client-company",184 "name": "Client Corp",185 "key_id": "YYYYYYYYYY",186 "issuer_id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",187 "key_path": "/Users/you/.keys/AuthKey_YYYYYYYYYY.p8",188 "vendor_number": "YOUR_VENDOR_NUMBER"189 }190 ]191}192```193194> **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](https://appstoreconnect.apple.com/trends/reports).195196#### Configuration Priority197198The server resolves configuration in this order:1992001. `--companies /path/to/companies.json` (CLI argument)2012. Constructor parameter (programmatic)2023. `ASC_MCP_COMPANIES=/path/to/companies.json` (env var pointing to JSON file)2034. Default JSON file paths (`~/.config/asc-mcp/companies.json`, etc.)2045. `ASC_COMPANY_1_KEY_ID` ... (multi-company env vars)2056. `ASC_KEY_ID` + `ASC_ISSUER_ID` (single-company env vars)206207### 3. MCP Host Configuration208209<details>210<summary><strong>Claude Code (CLI)</strong></summary>211212```bash213claude mcp add asc-mcp -- ~/.mint/bin/asc-mcp214```215216Or add to `.mcp.json` (project) / `.claude/settings.json` (global) with env vars:217218```json219{220 "mcpServers": {221 "asc-mcp": {222 "command": "/path/to/asc-mcp",223 "env": {224 "ASC_KEY_ID": "XXXXXXXXXX",225 "ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",226 "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"227 }228 }229 }230}231```232233</details>234235<details>236<summary><strong>Claude Desktop</strong></summary>237238Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:239240```json241{242 "mcpServers": {243 "asc-mcp": {244 "command": "/path/to/asc-mcp",245 "env": {246 "ASC_KEY_ID": "XXXXXXXXXX",247 "ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",248 "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"249 }250 }251 }252}253```254255</details>256257<details>258<summary><strong>Codex CLI</strong></summary>259260Add to `~/.codex/config.toml`:261262```toml263[mcp_servers.asc-mcp]264command = "/path/to/asc-mcp"265startup_timeout_sec = 20266tool_timeout_sec = 60267enabled = true268```269270Set env vars in your shell or use a wrapper script.271272</details>273274<details>275<summary><strong>Gemini CLI</strong></summary>276277Add to `~/.gemini/settings.json`:278279```json280{281 "mcpServers": {282 "asc-mcp": {283 "command": "/path/to/asc-mcp",284 "timeout": 60000,285 "env": {286 "ASC_KEY_ID": "XXXXXXXXXX",287 "ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",288 "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"289 }290 }291 }292}293```294295</details>296297<details>298<summary><strong>VS Code (Copilot / Continue)</strong></summary>299300Add to `.vscode/mcp.json`:301302```json303{304 "servers": {305 "asc-mcp": {306 "command": "/path/to/asc-mcp",307 "env": {308 "ASC_KEY_ID": "XXXXXXXXXX",309 "ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",310 "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"311 }312 }313 }314}315```316317</details>318319<details>320<summary><strong>Cursor</strong></summary>321322Add to Cursor settings → MCP Servers:323324```json325{326 "mcpServers": {327 "asc-mcp": {328 "command": "/path/to/asc-mcp",329 "env": {330 "ASC_KEY_ID": "XXXXXXXXXX",331 "ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",332 "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"333 }334 }335 }336}337```338339</details>340341<details>342<summary><strong>Windsurf</strong></summary>343344Add to `~/.codeium/windsurf/mcp_config.json`:345346```json347{348 "mcpServers": {349 "asc-mcp": {350 "command": "/path/to/asc-mcp",351 "args": ["--workers", "apps,builds,versions,reviews,beta_groups,iap"],352 "env": {353 "ASC_KEY_ID": "XXXXXXXXXX",354 "ASC_ISSUER_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",355 "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"356 }357 }358 }359}360```361362> **Note:** Windsurf has a 100-tool limit. The server exposes ~109 tools by default, so you must use `--workers` to select a subset. See [Worker Filtering](#worker-filtering) below.363364</details>365366> [!IMPORTANT]367> 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.368369### Worker Filtering370371The 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:372373```bash374# Only load apps, builds, and version lifecycle tools375asc-mcp --workers apps,builds,versions376377# Full release workflow subset (~60 tools, fits within any client limit)378asc-mcp --workers apps,builds,versions,reviews,beta_groups,iap379380# Monetization focus381asc-mcp --workers apps,iap,subscriptions,offer_codes,winback,pricing,promoted382```383384`company` and `auth` workers are **always enabled** regardless of the filter (they provide core multi-account and authentication functionality).385386When `builds` is enabled, it automatically includes `build_processing` and `build_beta` sub-workers.387388**Available worker names:**389390| Worker | Prefix | Tools | Description |391|--------|--------|-------|-------------|392| `apps` | `apps_` | 9 | App listing, metadata, localizations |393| `builds` | `builds_` | 4 | Build management |394| `build_processing` | `builds_*_processing_` | 4 | Build states, encryption |395| `build_beta` | `builds_*_beta_` | 8 | TestFlight localizations, notifications |396| `versions` | `app_versions_` | 13 | Version lifecycle, submit, release |397| `reviews` | `reviews_` | 7 | Customer reviews and responses |398| `beta_groups` | `beta_groups_` | 9 | TestFlight groups |399| `beta_testers` | `beta_testers_` | 6 | Tester management |400| `iap` | `iap_` | 17 | In-app purchases, prices, review screenshots |401| `subscriptions` | `subscriptions_` | 15 | Subscription CRUD, groups, localizations, prices |402| `offer_codes` | `offer_codes_` | 7 | Subscription offer codes, one-time codes |403| `winback` | `winback_` | 5 | Win-back offers for subscriptions |404| `provisioning` | `provisioning_` | 17 | Bundle IDs, devices, certificates |405| `app_info` | `app_info_` | 7 | App info, categories |406| `pricing` | `pricing_` | 6 | Territories, pricing |407| `users` | `users_` | 7 | Team members, roles |408| `app_events` | `app_events_` | 9 | In-app events, localizations |409| `analytics` | `analytics_` | 11 | Sales/financial reports, analytics |410| `screenshots` | `screenshots_` | 12 | Screenshots, previews, sets |411| `custom_pages` | `custom_pages_` | 10 | Custom product pages |412| `ppo` | `ppo_` | 9 | Product page optimization (A/B tests) |413| `promoted` | `promoted_` | 5 | Promoted in-app purchases |414| `metrics` | `metrics_` | 4 | Performance metrics, diagnostics |415416### Token Cost417418When connected to an LLM client, tool definitions consume context tokens. Here's the approximate footprint:419420| Configuration | Tools | ~Tokens |421|---|---:|---:|422| All workers (default) | 208 | **~24,000** |423| Release workflow: `apps,builds,versions,reviews` | ~40 | ~5,500 |424| Monetization: `apps,iap,subscriptions,pricing` | ~54 | ~6,500 |425| TestFlight: `apps,builds,beta_groups,beta_testers` | ~34 | ~4,500 |426| Marketing: `apps,screenshots,custom_pages,ppo,promoted` | ~46 | ~5,800 |427| `--workers apps` | 16 | ~1,850 |428429**Heaviest workers:** Provisioning (17 tools), InAppPurchases (17 tools), Subscriptions (15 tools), AppLifecycle (13 tools), Screenshots (12 tools).430431For Claude (200K context) ~22K tokens is ~5–7% — negligible. For clients with smaller context windows, use `--workers` to reduce the footprint.432433## Available Tools434435**208 tools** organized across 25 workers (use `--workers` to filter — see [Worker Filtering](#worker-filtering)):436437<details>438<summary><strong>Company Management</strong> — 3 tools</summary>439440| Tool | Description |441|------|-------------|442| `company_list` | List all configured companies |443| `company_switch` | Switch active company for API operations |444| `company_current` | Get current active company info |445446</details>447448<details>449<summary><strong>Authentication</strong> — 4 tools</summary>450451| Tool | Description |452|------|-------------|453| `auth_generate_token` | Generate JWT token for API access |454| `auth_validate_token` | Validate an existing JWT token |455| `auth_refresh_token` | Force refresh JWT token |456| `auth_token_status` | Get JWT token cache status |457458</details>459460<details>461<summary><strong>Apps Management</strong> — 9 tools</summary>462463| Tool | Description |464|------|-------------|465| `apps_list` | List all applications with filtering |466| `apps_get_details` | Get detailed app information |467| `apps_search` | Search apps by name or Bundle ID |468| `apps_list_versions` | List all versions with states |469| `apps_get_metadata` | Get localized metadata for a version |470| `apps_update_metadata` | Update metadata (What's New, description, etc.) |471| `apps_list_localizations` | List localizations with content status |472| `apps_create_localization` | Create a new localization for a version |473| `apps_delete_localization` | Delete a localization from a version |474475</details>476477<details>478<summary><strong>Builds</strong> — 4 tools</summary>479480| Tool | Description |481|------|-------------|482| `builds_list` | List builds with processing states |483| `builds_get` | Get detailed build information |484| `builds_find_by_number` | Find build by version number |485| `builds_list_for_version` | Get builds for specific app version |486487</details>488489<details>490<summary><strong>Build Processing</strong> — 4 tools</summary>491492| Tool | Description |493|------|-------------|494| `builds_get_processing_state` | Get current processing state |495| `builds_update_encryption` | Set encryption compliance |496| `builds_get_processing_status` | Get detailed processing status |497| `builds_check_readiness` | Check if build is ready for submission |498499</details>500501<details>502<summary><strong>TestFlight Beta Details</strong> — 8 tools</summary>503504| Tool | Description |505|------|-------------|506| `builds_get_beta_detail` | Get TestFlight configuration for build |507| `builds_update_beta_detail` | Update TestFlight settings |508| `builds_set_beta_localization` | Set What's New for TestFlight |509| `builds_list_beta_localizations` | List all TestFlight localizations |510| `builds_get_beta_groups` | Get beta groups for a build |511| `builds_get_beta_testers` | Get individual testers for a build |512| `builds_send_beta_notification` | Send notification to beta testers |513| `builds_add_beta_group` | Add build to beta group |514515</details>516517<details>518<summary><strong>TestFlight Beta Groups</strong> — 9 tools</summary>519520| Tool | Description |521|------|-------------|522| `beta_groups_list` | List TestFlight beta groups for an app |523| `beta_groups_create` | Create a new beta group |524| `beta_groups_update` | Update beta group settings |525| `beta_groups_delete` | Delete a beta group |526| `beta_groups_add_testers` | Add testers to a beta group |527| `beta_groups_remove_testers` | Remove testers from a beta group |528| `beta_groups_list_testers` | List testers in a beta group |529| `beta_groups_add_builds` | Add builds to a beta group |530| `beta_groups_remove_builds` | Remove builds from a beta group |531532</details>533534<details>535<summary><strong>App Version Lifecycle</strong> — 13 tools</summary>536537| Tool | Description |538|------|-------------|539| `app_versions_create` | Create a new app version |540| `app_versions_list` | List versions with state filtering |541| `app_versions_get` | Get detailed version information |542| `app_versions_update` | Update version attributes |543| `app_versions_attach_build` | Attach build to version |544| `app_versions_submit_for_review` | Submit for App Store review |545| `app_versions_cancel_review` | Cancel ongoing review |546| `app_versions_release` | Release approved version |547| `app_versions_create_phased_release` | Create gradual rollout |548| `app_versions_get_phased_release` | Get phased release info and ID |549| `app_versions_update_phased_release` | Pause/resume/complete rollout |550| `app_versions_set_review_details` | Set reviewer contact info |551| `app_versions_update_age_rating` | Configure age rating declaration |552553</details>554555<details>556<summary><strong>Customer Reviews</strong> — 7 tools</summary>557558| Tool | Description |559|------|-------------|560| `reviews_list` | Get reviews with filtering and pagination |561| `reviews_get` | Get specific review details |562| `reviews_list_for_version` | Get reviews for a specific version |563| `reviews_stats` | Aggregated review statistics |564| `reviews_create_response` | Respond to a customer review |565| `reviews_delete_response` | Delete a response |566| `reviews_get_response` | Get response for a review |567568</details>569570<details>571<summary><strong>In-App Purchases</strong> — 17 tools</summary>572573| Tool | Description |574|------|-------------|575| `iap_list` | List in-app purchases for an app |576| `iap_get` | Get IAP details |577| `iap_create` | Create a new IAP (consumable, non-consumable, subscription) |578| `iap_update` | Update IAP attributes |579| `iap_delete` | Delete an in-app purchase |580| `iap_list_localizations` | List IAP localizations |581| `iap_create_localization` | Create IAP localization |582| `iap_update_localization` | Update IAP localization |583| `iap_delete_localization` | Delete IAP localization |584| `iap_submit_for_review` | Submit IAP for review |585| `iap_list_subscriptions` | List subscription groups |586| `iap_get_subscription_group` | Get subscription group details |587| `iap_list_price_points` | List available price points |588| `iap_get_price_schedule` | Get price schedule |589| `iap_set_price_schedule` | Set price schedule |590| `iap_get_review_screenshot` | Get review screenshot |591| `iap_create_review_screenshot` | Create review screenshot |592593</details>594595<details>596<summary><strong>Subscriptions</strong> — 15 tools</summary>597598| Tool | Description |599|------|-------------|600| `subscriptions_list` | List subscriptions in a group |601| `subscriptions_get` | Get subscription details |602| `subscriptions_create` | Create a new subscription |603| `subscriptions_update` | Update subscription |604| `subscriptions_delete` | Delete subscription |605| `subscriptions_list_localizations` | List subscription localizations |606| `subscriptions_create_localization` | Create localization |607| `subscriptions_update_localization` | Update localization |608| `subscriptions_delete_localization` | Delete localization |609| `subscriptions_list_prices` | List subscription prices |610| `subscriptions_list_price_points` | List available price points |611| `subscriptions_create_group` | Create subscription group |612| `subscriptions_update_group` | Update subscription group |613| `subscriptions_delete_group` | Delete subscription group |614| `subscriptions_submit` | Submit subscription for review |615616</details>617618<details>619<summary><strong>Offer Codes</strong> — 7 tools</summary>620621| Tool | Description |622|------|-------------|623| `offer_codes_list` | List offer code configurations |624| `offer_codes_create` | Create offer code configuration |625| `offer_codes_update` | Update offer code (enable/disable) |626| `offer_codes_deactivate` | Deactivate all codes |627| `offer_codes_list_prices` | List prices for an offer code |628| `offer_codes_generate_one_time` | Generate one-time use codes (up to 10K) |629| `offer_codes_list_one_time` | List generated one-time codes |630631</details>632633<details>634<summary><strong>Win-Back Offers</strong> — 5 tools</summary>635636| Tool | Description |637|------|-------------|638| `winback_list` | List win-back offers |639| `winback_create` | Create a win-back offer |640| `winback_update` | Update a win-back offer |641| `winback_delete` | Delete a win-back offer |642| `winback_list_prices` | List win-back offer prices |643644</details>645646<details>647<summary><strong>Provisioning</strong> — 17 tools</summary>648649| Tool | Description |650|------|-------------|651| `provisioning_list_bundle_ids` | List registered bundle identifiers |652| `provisioning_get_bundle_id` | Get bundle ID details |653| `provisioning_create_bundle_id` | Register a new bundle identifier |654| `provisioning_delete_bundle_id` | Delete a bundle identifier |655| `provisioning_list_devices` | List registered devices |656| `provisioning_register_device` | Register a new device (UDID) |657| `provisioning_update_device` | Update device name or status |658| `provisioning_list_certificates` | List signing certificates |659| `provisioning_get_certificate` | Get certificate details |660| `provisioning_revoke_certificate` | Revoke a certificate |661| `provisioning_list_profiles` | List provisioning profiles |662| `provisioning_get_profile` | Get profile details |663| `provisioning_delete_profile` | Delete a profile |664| `provisioning_create_profile` | Create a provisioning profile |665| `provisioning_list_capabilities` | List bundle ID capabilities |666| `provisioning_enable_capability` | Enable a capability |667| `provisioning_disable_capability` | Disable a capability |668669</details>670671<details>672<summary><strong>Screenshots & Previews</strong> — 12 tools</summary>673674| Tool | Description |675|------|-------------|676| `screenshots_list_sets` | List screenshot sets |677| `screenshots_create_set` | Create a screenshot set |678| `screenshots_delete_set` | Delete a screenshot set |679| `screenshots_list` | List screenshots in a set |680| `screenshots_create` | Reserve a screenshot upload |681| `screenshots_delete` | Delete a screenshot |682| `screenshots_reorder` | Reorder screenshots in a set |683| `screenshots_list_preview_sets` | List app preview sets |684| `screenshots_create_preview_set` | Create a preview set |685| `screenshots_delete_preview_set` | Delete a preview set |686| `screenshots_create_preview` | Reserve a preview upload |687| `screenshots_delete_preview` | Delete a preview |688689</details>690691<details>692<summary><strong>Custom Product Pages</strong> — 10 tools</summary>693694| Tool | Description |695|------|-------------|696| `custom_pages_list` | List custom product pages |697| `custom_pages_get` | Get page details |698| `custom_pages_create` | Create a custom page |699| `custom_pages_update` | Update a custom page |700| `custom_pages_delete` | Delete a custom page |701| `custom_pages_list_versions` | List page versions |702| `custom_pages_create_version` | Create a page version |703| `custom_pages_list_localizations` | List version localizations |704| `custom_pages_create_localization` | Create a localization |705| `custom_pages_update_localization` | Update a localization |706707</details>708709<details>710<summary><strong>Product Page Optimization (A/B Tests)</strong> — 9 tools</summary>711712| Tool | Description |713|------|-------------|714| `ppo_list_experiments` | List A/B test experiments |715| `ppo_get_experiment` | Get experiment details |716| `ppo_create_experiment` | Create an experiment |717| `ppo_update_experiment` | Update/start/stop experiment |718| `ppo_delete_experiment` | Delete an experiment |719| `ppo_list_treatments` | List experiment treatments |720| `ppo_create_treatment` | Create a treatment variant |721| `ppo_list_treatment_localizations` | List treatment localizations |722| `ppo_create_treatment_localization` | Create treatment localization |723724</details>725726<details>727<summary><strong>Promoted Purchases</strong> — 5 tools</summary>728729| Tool | Description |730|------|-------------|731| `promoted_list` | List promoted purchases for an app |732| `promoted_get` | Get promotion details |733| `promoted_create` | Create a promotion |734| `promoted_update` | Update promotion (visibility/order) |735| `promoted_delete` | Delete a promotion |736737</details>738739<details>740<summary><strong>Performance Metrics</strong> — 4 tools</summary>741742| Tool | Description |743|------|-------------|744| `metrics_app_perf` | Get app performance/power metrics |745| `metrics_build_perf` | Get build performance metrics |746| `metrics_build_diagnostics` | List diagnostics for a build |747| `metrics_get_diagnostic_logs` | Get diagnostic logs |748749</details>750751## Usage Examples752753### Complete Release Workflow754755```756You: "Release version 2.1.0 of my app with build 456"757758Claude will:7591. app_versions_create(app_id, platform: "IOS", version_string: "2.1.0")7602. app_versions_attach_build(version_id, build_id)7613. app_versions_set_review_details(version_id, contact_email: "...")7624. app_versions_submit_for_review(version_id)7635. app_versions_create_phased_release(version_id) # after approval764```765766### TestFlight Distribution767768```769You: "Create a beta group 'External Testers' and distribute the latest build"770771Claude will:7721. beta_groups_create(app_id, name: "External Testers")7732. builds_list(app_id, limit: 1) # find latest7743. builds_set_beta_localization(build_id, locale: "en-US", whats_new: "...")7754. beta_groups_add_testers(group_id, tester_ids: [...])776```777778### Review Management779780```781You: "Show me all 1-star reviews from the last week and draft responses"782783Claude will:7841. reviews_list(app_id, rating: 1, sort: "-createdDate", limit: 50)7852. reviews_create_response(review_id, response_body: "...") # for each786```787788### Multi-Company Workflow789790```791You: "Switch to ClientCorp and check their latest build status"792793Claude will:7941. company_switch(company: "ClientCorp")7952. apps_list(limit: 5)7963. builds_list(app_id, limit: 1)7974. builds_get_processing_state(build_id)798```799800## API Constraints801802| Constraint | Details |803|------------|---------|804| **No emojis** | Metadata fields (What's New, Description, Keywords) must not contain emoji characters |805| **Version state** | Only versions in `PREPARE_FOR_SUBMISSION` state can be edited |806| **JWT expiry** | Tokens expire after 20 minutes — the server auto-refreshes them |807| **Rate limits** | Apple enforces per-account rate limits ([documentation](https://developer.apple.com/documentation/appstoreconnectapi/identifying-rate-limits)) |808| **Locale format** | Use standard codes: `en-US`, `ru`, `de-DE`, `ja`, `zh-Hans` |809810## Architecture811812```813Sources/asc-mcp/814├── EntryPoint.swift # Entry point, --workers filtering815├── Core/816│ ├── Application.swift # MCP server setup & initialization817│ └── ASCError.swift # Custom error types818├── Helpers/ # JSON formatting, pagination, safe helpers819├── Models/ # API request/response models820│ ├── AppStoreConnect/ # Apps, versions, localizations821│ ├── Builds/ # Builds, beta details, beta groups822│ ├── AppLifecycle/ # Version lifecycle models823│ ├── InAppPurchases/ # IAP models824│ ├── Subscriptions/ # Subscriptions, offer codes, win-back825│ ├── Marketing/ # Screenshots, custom pages, PPO, promoted826│ ├── Metrics/ # Performance metrics, diagnostics827│ ├── Analytics/ # Sales/financial reports828│ ├── Provisioning/ # Bundle IDs, devices, certificates829│ ├── Shared/ # Shared upload/image types830│ └── ... # AppEvents, AppInfo, Pricing, Users831├── Services/832│ ├── HTTPClient.swift # Actor-based HTTP with retry logic833│ ├── JWTService.swift # ES256 JWT token generation834│ └── CompaniesManager.swift # Multi-account management835└── Workers/ # MCP tool implementations (25 workers)836 ├── MainWorker/WorkerManager # Central tool registry & routing837 ├── CompaniesWorker/ # company_* tools838 ├── AuthWorker/ # auth_* tools839 ├── AppsWorker/ # apps_* tools840 ├── BuildsWorker/ # builds_* tools841 ├── BuildProcessingWorker/ # builds_*_processing tools842 ├── BuildBetaDetailsWorker/ # builds_*_beta_* tools843 ├── AppLifecycleWorker/ # app_versions_* tools844 ├── ReviewsWorker/ # reviews_* tools845 ├── BetaGroupsWorker/ # beta_groups_* tools846 ├── BetaTestersWorker/ # beta_testers_* tools847 ├── InAppPurchasesWorker/ # iap_* tools848 ├── SubscriptionsWorker/ # subscriptions_* tools849 ├── OfferCodesWorker/ # offer_codes_* tools850 ├── WinBackOffersWorker/ # winback_* tools851 ├── ProvisioningWorker/ # provisioning_* tools852 ├── AppInfoWorker/ # app_info_* tools853 ├── PricingWorker/ # pricing_* tools854 ├── UsersWorker/ # users_* tools855 ├── AppEventsWorker/ # app_events_* tools856 ├── AnalyticsWorker/ # analytics_* tools857 ├── ScreenshotsWorker/ # screenshots_* tools858 ├── CustomProductPagesWorker/ # custom_pages_* tools859 ├── ProductPageOptimizationWorker/ # ppo_* tools860 ├── PromotedPurchasesWorker/ # promoted_* tools861 └── MetricsWorker/ # metrics_* tools862```863864### Design Principles865866- **Swift 6 strict concurrency** — all workers and services are `Sendable`, proper actor isolation867- **Actor-based HTTP client** — thread-safe with exponential backoff and retry logic868- **Prefix-based routing** — `WorkerManager` routes tool calls by name prefix (zero config)869- **Minimal dependencies** — only the [MCP Swift SDK](https://github.com/modelcontextprotocol/swift-sdk)870871## Troubleshooting872873<details>874<summary><strong>Server not responding / MCP disconnection</strong></summary>8758761. Verify the binary path is correct in your MCP host config8772. Check that `companies.json` exists and is valid JSON8783. Ensure `.p8` key file paths are absolute and the files exist8794. Try running the binary directly to see error output: `.build/release/asc-mcp`880881</details>882883<details>884<summary><strong>Authentication errors (401)</strong></summary>8858861. Verify your Key ID and Issuer ID match what's shown in App Store Connect8872. Ensure the `.p8` file is the original download (not modified)8883. Check that the API key hasn't been revoked8894. JWT tokens auto-refresh, but if the key is invalid, all requests will fail890891</details>892893<details>894<summary><strong>"Version must be in PREPARE_FOR_SUBMISSION state"</strong></summary>895896You can only edit metadata for versions that are in `PREPARE_FOR_SUBMISSION` state. Versions in `READY_FOR_SALE`, `IN_REVIEW`, or `WAITING_FOR_REVIEW` are read-only. Create a new version first if needed.897898</details>899900<details>901<summary><strong>Build processing takes too long</strong></summary>902903Use `builds_wait_for_processing` with a reasonable timeout (default 1800s). Apple's build processing typically takes 5–30 minutes but can be longer during peak times.904905</details>906907<details>908<summary><strong>Rate limiting (429 errors)</strong></summary>909910The HTTP client automatically retries with exponential backoff on 429 responses. If you consistently hit limits, reduce the frequency of API calls or use pagination with smaller page sizes.911912</details>913914## Development915916### Building917918```bash919swift build # Debug build920swift build -c release # Release build (optimized)921swift package clean # Clean build artifacts922```923924### Test Mode925926```bash927.build/debug/asc-mcp --test # Runs built-in integration tests928```929930### Adding a New Tool9319321. Create handler method in the appropriate `Worker+Handlers.swift`9332. Add tool definition in `Worker+ToolDefinitions.swift`9343. Register in worker's `getTools()` method9354. Add routing case in worker's `handleTool()` switch9365. The `WorkerManager` auto-routes by prefix — no changes needed there937938### Adding a New Worker9399401. Create directory: `Workers/MyWorker/`9412. Create 3 files: `MyWorker.swift`, `MyWorker+ToolDefinitions.swift`, `MyWorker+Handlers.swift`9423. Add worker property and initialization in `WorkerManager.swift`9434. Add routing rule in `WorkerManager.registerWorkers()`9445. Add `getMyTools()` helper method945946## Contributing947948We welcome contributions! See [Contributing Guide](CONTRIBUTING.md) for details.949950## License951952This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.953954## Acknowledgments955956- [Model Context Protocol](https://modelcontextprotocol.io) — the protocol specification and [Swift SDK](https://github.com/modelcontextprotocol/swift-sdk)957- [App Store Connect API](https://developer.apple.com/documentation/appstoreconnectapi) — Apple's official REST API958959---960961<sub>This is an unofficial, community-maintained tool and is not affiliated with or endorsed by Apple Inc.</sub>962
Full transparency — inspect the skill content before installing.