asc-mcp
Integrates with Apple's developer ecosystem to manage certificates, provisioning profiles, bundle IDs, and app capabilities via the App Store Connect API.
Enables programmatic management of the App Store Connect API, covering apps, builds, TestFlight beta testing, customer reviews, in-app purchases, and subscriptions.
Automates iOS app release workflows including version creation, build attachment, TestFlight distribution, and submission for review.
Supports the management of macOS applications through the App Store Connect API, including metadata management, build tracking, and release automation.
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 339 tools across 35 worker 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, 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
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@v2.2.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-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 |
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@v2.2.0
# 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@v2.2.0 # specific tagTo update to the latest version:
mint install zelentsov-dev/asc-mcp@v2.2.0 --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-mcpFor convenience, copy the binary to a location in your PATH:
cp .build/release/asc-mcp /usr/local/bin/asc-mcpConfiguration
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
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.
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"
}
}
}
}Note: Windsurf has a 100-tool limit. The server exposes 339 tools by default, so you must use
--workersto select a subset. See Worker Filtering below.
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 339 tools across 35 worker domains. 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,promotedcompany 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.
Read-Only Mode
Use --read-only when you want safe inspection without App Store Connect mutations:
asc-mcp --read-only
asc-mcp --read-only --workers apps,builds,reviews,analyticsIn this mode, read tools such as *_list, *_get, *_search, *_status, auth_*, analytics, and metrics remain available. Tools that can create, update, upload, submit, release, delete, revoke, clear, cancel, or otherwise mutate App Store Connect are blocked before their worker handler runs. company_switch remains available because it changes only the local active company context.
OpenAPI Drift Tooling
Use the built-in OpenAPI coverage command to compare the maintained asc-mcp coverage map with Apple's latest App Store Connect OpenAPI specification. This command does not load App Store Connect credentials, does not start the MCP server, and does not call Apple APIs beyond your explicit spec download.
rm -rf /tmp/asc-openapi
mkdir -p /tmp/asc-openapi
curl -L --fail -o /tmp/asc-openapi/spec.zip \
https://developer.apple.com/sample-code/app-store-connect/app-store-connect-openapi-specification.zip
unzip -q /tmp/asc-openapi/spec.zip -d /tmp/asc-openapi
swift run asc-mcp openapi-coverage \
--spec /tmp/asc-openapi/openapi.oas.json \
--output ASC-OPENAPI-COVERAGE-GENERATED.mdThe generated report records Apple spec metadata, path and operation counts, domain status, P0/P1 gaps, missing domains, and unclassified paths. The current checked-in report is ASC-OPENAPI-COVERAGE-GENERATED.md, generated from App Store Connect API 4.3.
Available worker names:
Worker | Prefix | Tools | Description |
|
| 3 | Multi-account management |
|
| 4 | JWT token tools |
|
| 9 | App listing, metadata, localizations |
|
| 8 | Webhook notifications and deliveries |
|
| 30 | Xcode Cloud products, workflows, build runs, artifacts, issues, test results, and SCM |
|
| 4 | Build management |
|
| 4 | Build states, encryption |
|
| 11 | TestFlight localizations, notifications |
|
| 14 | Version lifecycle, submit, release |
|
| 8 | Customer reviews and responses |
|
| 9 | TestFlight groups |
|
| 8 | TestFlight feedback screenshots, crash submissions, crash logs |
|
| 12 | Tester management |
|
| 24 | In-app purchases, prices, review screenshots |
|
| 29 | Subscription CRUD, groups, localizations, prices |
|
| 10 | Subscription offer codes, one-time codes |
|
| 5 | Win-back offers for subscriptions |
|
| 4 | Subscription introductory offers |
|
| 6 | Subscription promotional offers |
|
| 3 | Sandbox testers |
|
| 10 | Beta app localizations and review |
|
| 3 | Pre-release versions |
|
| 3 | Beta license agreements |
|
| 17 | Bundle IDs, devices, certificates |
|
| 10 | App info, categories, EULA |
|
| 9 | Territories, pricing |
|
| 10 | Team members, roles |
|
| 9 | In-app events, localizations |
|
| 11 | Sales/financial reports, analytics |
|
| 16 | Screenshots, previews, sets |
|
| 10 | Custom product pages |
|
| 9 | Product page optimization (A/B tests) |
|
| 9 | Promoted in-app purchases |
|
| 4 | App Store review attachments |
|
| 4 | Performance metrics, diagnostics |
Token Cost
When connected to an LLM client, tool definitions consume context tokens. Here's the approximate footprint:
Configuration | Tools | ~Tokens |
All workers (default) | 339 | ~38,000 |
Release workflow: | ~57 | ~7,000 |
Monetization: | ~78 | ~9,000 |
TestFlight: | ~56 | ~6,000 |
Marketing: | ~60 | ~6,800 |
| 16 | ~2,000 |
Heaviest workers: Xcode Cloud (30 tools), Subscriptions (29 tools), InAppPurchases (24 tools), Provisioning (17 tools), Screenshots (16 tools).
For Claude (200K context) ~38K tokens is about 19% of the window. For clients with smaller context windows, use --workers to reduce the footprint.
Available Tools
339 tools organized across 35 worker domains (use --workers to filter — see Worker Filtering):
Tool | Description |
| List all configured companies |
| Switch active company for API operations |
| Get current active company info |
Tool | Description |
| Generate JWT token for API access |
| Validate an existing JWT token |
| Force refresh JWT token |
| Get JWT token cache status |
Tool | Description |
| List all applications with filtering |
| Get detailed app information |
| Search apps by name or Bundle ID |
| List all versions with states |
| Get localized metadata for a version |
| Update metadata (What's New, description, etc.) |
| List localizations with content status |
| Create a new localization for a version |
| Delete a localization from a version |
Tool | Description |
| List webhooks for an app |
| Get a webhook by ID |
| Create a webhook configuration |
| Update webhook fields |
| Delete a webhook |
| List delivery attempts |
| Redeliver an existing delivery |
| Send a test ping |
Tool | Description |
| List Xcode Cloud products |
| Get an Xcode Cloud product |
| List workflows for a product |
| List build runs for a product |
| Get a workflow |
| List build runs for a workflow |
| Get a build run |
| Start or rebuild an Xcode Cloud build |
| List build actions for a run |
| List App Store Connect builds created by a run |
| Get a build action |
| List artifacts for an action |
| List issues for an action |
| List test results for an action |
| Get an artifact |
| Get an issue |
| Get a test result |
| List available Xcode versions |
| Get an Xcode version |
| List available macOS versions |
| Get a macOS version |
| List SCM providers |
| Get an SCM provider |
| List repositories for an SCM provider |
| List SCM repositories |
| Get an SCM repository |
| List repository git references |
| List repository pull requests |
| Get a git reference |
| Get a pull request |
Tool | Description |
| List beta crash feedback submissions |
| Get one beta crash feedback submission |
| Read crash log for a submission |
| Read crash log by crash log ID |
| Delete a beta crash feedback submission |
| List beta screenshot feedback submissions |
| Get one beta screenshot feedback submission |
| Delete a beta screenshot feedback submission |
Tool | Description |
| List builds with processing states |
| Get detailed build information |
| Find build by version number |
| Get builds for specific app version |
Tool | Description |
| Get current processing state |
| Set encryption compliance |
| Get detailed processing status |
| Check if build is ready for submission |
Tool | Description |
| Get TestFlight configuration for build |
| Update TestFlight settings |
| Set What's New for TestFlight |
| List all TestFlight localizations |
| Get beta groups for a build |
| Get individual testers for a build |
| Send notification to beta testers |
| Add build to beta groups |
| Add individual testers to a build |
| Remove individual testers from a build |
| List individual testers assigned to a build |
Tool | Description |
| List TestFlight beta groups for an app |
| Create a new beta group |
| Update beta group settings |
| Delete a beta group |
| Add testers to a beta group |
| Remove testers from a beta group |
| List testers in a beta group |
| Add builds to a beta group |
| Remove builds from a beta group |
Includes tester list/search/get/create/delete, app relationships, invitations, beta group assignment, build assignment, and app removal tools.
Tool | Description |
| Create a new app version |
| List versions with state filtering |
| Get detailed version information |
| Update version attributes |
| Attach build to version |
| Submit for App Store review |
| Cancel ongoing review |
| Release approved version |
| Create gradual rollout |
| Get phased release info and ID |
| Pause/resume/complete rollout |
| Set reviewer contact info |
| Configure age rating declaration |
| Delete an editable app version |
Tool | Description |
| Get reviews with filtering and pagination |
| Get specific review details |
| Get reviews for a specific version |
| Aggregated review statistics |
| Respond to a customer review |
| Delete a response |
| Get response for a review |
| Summarize review themes and ratings |
Tool | Description |
| List in-app purchases for an app |
| Get IAP details |
| Create a new IAP (consumable, non-consumable, subscription) |
| Update IAP attributes |
| Delete an in-app purchase |
| List IAP localizations |
| Create IAP localization |
| Update IAP localization |
| Delete IAP localization |
| Submit IAP for review |
| List subscription groups |
| Get subscription group details |
| List available price points |
| Get price schedule |
| Set price schedule |
| Get review screenshot |
| Set territory availability |
| Get territory availability |
| Upload promotional image |
| Get promotional image |
| Delete promotional image |
| Upload review screenshot |
| Delete review screenshot |
| List promotional images |
Tool | Description |
| List subscriptions in a group |
| Get subscription details |
| Create a new subscription |
| Update subscription |
| Delete subscription |
| List subscription localizations |
| Create localization |
| Update localization |
| Delete localization |
| List subscription prices |
| List available price points |
| Create subscription group |
| Update subscription group |
| Delete subscription group |
| List subscription group localizations |
| Create subscription group localization |
| Get subscription group localization |
| Update subscription group localization |
| Delete subscription group localization |
| Delete subscription price |
| Submit subscription for review |
| Upload subscription image |
| Get subscription image |
| Delete subscription image |
| Upload review screenshot |
| Get review screenshot |
| Delete review screenshot |
| List subscription images |
| Get review screenshot for a subscription |
Tool | Description |
| List offer code configurations |
| Create offer code configuration |
| Update offer code (enable/disable) |
| Deactivate all codes |
| List prices for an offer code |
| Generate one-time use codes (up to 10K) |
| List generated one-time codes |
| Create a custom offer code |
| Get custom offer code details |
| Deactivate a custom offer code |
Tool | Description |
| List win-back offers |
| Create a win-back offer |
| Update a win-back offer |
| Delete a win-back offer |
| List win-back offer prices |
Tool | Description |
| List introductory offers for a subscription |
| Create an introductory offer |
| Update an introductory offer (end date only) |
| Delete an introductory offer |
Tool | Description |
| List promotional offers for a subscription |
| Get a promotional offer |
| Create a promotional offer |
| Update promotional offer prices |
| Delete a promotional offer |
| List prices for a promotional offer |
Tool | Description |
| List sandbox testers |
| Update sandbox tester settings |
| Clear purchase history for sandbox testers |
Tool | Description |
| List beta app localizations |
| Create beta app localization |
| Get beta app localization |
| Update beta app localization |
| Delete beta app localization |
| Submit build for beta review |
| List beta review submissions |
| Get beta review submission |
| Get beta app review details |
| Update beta app review details |
Includes pre-release version listing, details, and associated builds.
Includes beta license agreement list, get, and update.
Tool | Description |
| List registered bundle identifiers |
| Get bundle ID details |
| Register a new bundle identifier |
| Delete a bundle identifier |
| List registered devices |
| Register a new device (UDID) |
| Update device name or status |
| List signing certificates |
| Get certificate details |
| Revoke a certificate |
| List provisioning profiles |
| Get profile details |
| Delete a profile |
| Create a provisioning profile |
| List bundle ID capabilities |
| Enable a capability |
| Disable a capability |
Includes app info list/get/update, app info localizations, and EULA get/create/update tools.
Includes territories, availability, price points, price schedules, and App Store availability v2 tools.
Includes team member list/get/update/remove, invitations, visible apps, and visible app relationship updates.
Includes in-app event CRUD plus event localization list/create/update/delete.
Includes sales, financial, app summary, analytics report request, report, instance, snapshot, and segment tools.
Tool | Description |
| List screenshot sets |
| Create a screenshot set |
| Delete a screenshot set |
| List screenshots in a set |
| Upload a screenshot |
| Get screenshot details |
| Delete a screenshot |
| Reorder screenshots in a set |
| List app preview sets |
| Create a preview set |
| Delete a preview set |
| Upload an app preview |
| Get preview details |
| List previews in a preview set |
| Upload screenshots in a batch |
| Delete a preview |
Tool | Description |
| List custom product pages |
| Get page details |
| Create a custom page |
| Update a custom page |
| Delete a custom page |
| List page versions |
| Create a page version |
| List version localizations |
| Create a localization |
| Update a localization |
Tool | Description |
| List A/B test experiments |
| Get experiment details |
| Create an experiment |
| Update/start/stop experiment |
| Delete an experiment |
| List experiment treatments |
| Create a treatment variant |
| List treatment localizations |
| Create treatment localization |
Tool | Description |
| List promoted purchases for an app |
| Get promotion details |
| Create a promotion |
| Update promotion (visibility/order) |
| Delete a promotion |
| Upload promoted purchase image |
| Get promoted purchase image |
| Delete promoted purchase image |
| Get image for a promoted purchase |
Includes App Store review attachment upload, get, delete, and list tools.
Tool | Description |
| Get app performance/power metrics |
| Get build performance metrics |
| List diagnostics for a build |
| Get diagnostic logs |
Usage Examples
Complete Release Workflow
You: "Release version 2.2.0 of my app with build 456"
Claude will:
1. app_versions_create(app_id, platform: "IOS", version_string: "2.2.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 approvalTestFlight 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 eachMulti-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
Constraint | Details |
No emojis | Metadata fields (What's New, Description, Keywords) must not contain emoji characters |
Version state | Only versions in |
JWT expiry | Tokens expire after 20 minutes — the server auto-refreshes them |
Rate limits | Apple enforces per-account rate limits (documentation) |
Locale format | Use standard codes: |
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 (35 worker domains + MainWorker router)
├── 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
├── IntroductoryOffersWorker/ # intro_offers_* tools
├── PromotionalOffersWorker/ # promo_offers_* tools
├── SandboxTestersWorker/ # sandbox_* tools
├── BetaAppWorker/ # beta_app_* 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_* toolsDesign Principles
Swift 6 strict concurrency — all workers and services are
Sendable, proper actor isolationActor-based HTTP client — thread-safe with exponential backoff and retry logic
Prefix-based routing —
WorkerManagerroutes tool calls by name prefix (zero config)Minimal dependencies — only the MCP Swift SDK
Troubleshooting
Verify the binary path is correct in your MCP host config
Check that
companies.jsonexists and is valid JSONEnsure
.p8key file paths are absolute and the files existTry running the binary directly to see error output:
.build/release/asc-mcp
Verify your Key ID and Issuer ID match what's shown in App Store Connect
Ensure the
.p8file is the original download (not modified)Check that the API key hasn't been revoked
JWT tokens auto-refresh, but if the key is invalid, all requests will fail
You 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.
Use 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.
The 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.
Development
Building
swift build # Debug build
swift build -c release # Release build (optimized)
swift package clean # Clean build artifactsTest Mode
.build/debug/asc-mcp --test # Runs built-in integration testsAdding a New Tool
Create handler method in the appropriate
Worker+Handlers.swiftAdd tool definition in
Worker+ToolDefinitions.swiftRegister in worker's
getTools()methodAdd routing case in worker's
handleTool()switchThe
WorkerManagerauto-routes by prefix — no changes needed there
Adding a New Worker
Create directory:
Workers/MyWorker/Create 3 files:
MyWorker.swift,MyWorker+ToolDefinitions.swift,MyWorker+Handlers.swiftAdd worker property and initialization in
WorkerManager.swiftAdd routing rule in
WorkerManager.registerWorkers()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
Model Context Protocol — the protocol specification and Swift SDK
App Store Connect API — Apple's official REST API
This is an unofficial, community-maintained tool and is not affiliated with or endorsed by Apple Inc.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zelentsov-dev/asc-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server