zelentsov-dev

App Store Connect MCP Server

Community zelentsov-dev
Updated

MCP server for App Store Connect API — 208 tools for managing apps, builds, TestFlight, subscriptions, and more from Claude, Cursor, VS Code, or any MCP client

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:

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/[email protected]

# 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

Requirement Version
macOS 14.0+ (Sonoma)
Swift 6.2+
Xcode 16.0+ (for building)
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/[email protected]

# 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/[email protected]      # specific tag

To update to the latest version:

mint install zelentsov-dev/[email protected] --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

Claude Code (CLI)
claude mcp add asc-mcp -- ~/.mint/bin/asc-mcp

Or 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"
      }
    }
  }
}
Claude Desktop

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"
      }
    }
  }
}
Codex CLI

Add to ~/.codex/config.toml:

[mcp_servers.asc-mcp]
command = "/path/to/asc-mcp"
startup_timeout_sec = 20
tool_timeout_sec = 60
enabled = true

Set env vars in your shell or use a wrapper script.

Gemini CLI

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"
      }
    }
  }
}
VS Code (Copilot / Continue)

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"
      }
    }
  }
}
Cursor

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"
      }
    }
  }
}
Windsurf

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 ~109 tools by default, so you must use --workers to 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 .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:

Worker Prefix Tools Description
apps apps_ 9 App listing, metadata, localizations
builds builds_ 4 Build management
build_processing builds_*_processing_ 4 Build states, encryption
build_beta builds_*_beta_ 8 TestFlight localizations, notifications
versions app_versions_ 13 Version lifecycle, submit, release
reviews reviews_ 7 Customer reviews and responses
beta_groups beta_groups_ 9 TestFlight groups
beta_testers beta_testers_ 6 Tester management
iap iap_ 17 In-app purchases, prices, review screenshots
subscriptions subscriptions_ 15 Subscription CRUD, groups, localizations, prices
offer_codes offer_codes_ 7 Subscription offer codes, one-time codes
winback winback_ 5 Win-back offers for subscriptions
provisioning provisioning_ 17 Bundle IDs, devices, certificates
app_info app_info_ 7 App info, categories
pricing pricing_ 6 Territories, pricing
users users_ 7 Team members, roles
app_events app_events_ 9 In-app events, localizations
analytics analytics_ 11 Sales/financial reports, analytics
screenshots screenshots_ 12 Screenshots, previews, sets
custom_pages custom_pages_ 10 Custom product pages
ppo ppo_ 9 Product page optimization (A/B tests)
promoted promoted_ 5 Promoted in-app purchases
metrics metrics_ 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) 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 apps 16 ~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):

Company Management — 3 tools
Tool Description
company_list List all configured companies
company_switch Switch active company for API operations
company_current Get current active company info
Authentication — 4 tools
Tool Description
auth_generate_token Generate JWT token for API access
auth_validate_token Validate an existing JWT token
auth_refresh_token Force refresh JWT token
auth_token_status Get JWT token cache status
Apps Management — 9 tools
Tool Description
apps_list List all applications with filtering
apps_get_details Get detailed app information
apps_search Search apps by name or Bundle ID
apps_list_versions List all versions with states
apps_get_metadata Get localized metadata for a version
apps_update_metadata Update metadata (What's New, description, etc.)
apps_list_localizations List localizations with content status
apps_create_localization Create a new localization for a version
apps_delete_localization Delete a localization from a version
Builds — 4 tools
Tool Description
builds_list List builds with processing states
builds_get Get detailed build information
builds_find_by_number Find build by version number
builds_list_for_version Get builds for specific app version
Build Processing — 4 tools
Tool Description
builds_get_processing_state Get current processing state
builds_update_encryption Set encryption compliance
builds_get_processing_status Get detailed processing status
builds_check_readiness Check if build is ready for submission
TestFlight Beta Details — 8 tools
Tool Description
builds_get_beta_detail Get TestFlight configuration for build
builds_update_beta_detail Update TestFlight settings
builds_set_beta_localization Set What's New for TestFlight
builds_list_beta_localizations List all TestFlight localizations
builds_get_beta_groups Get beta groups for a build
builds_get_beta_testers Get individual testers for a build
builds_send_beta_notification Send notification to beta testers
builds_add_beta_group Add build to beta group
TestFlight Beta Groups — 9 tools
Tool Description
beta_groups_list List TestFlight beta groups for an app
beta_groups_create Create a new beta group
beta_groups_update Update beta group settings
beta_groups_delete Delete a beta group
beta_groups_add_testers Add testers to a beta group
beta_groups_remove_testers Remove testers from a beta group
beta_groups_list_testers List testers in a beta group
beta_groups_add_builds Add builds to a beta group
beta_groups_remove_builds Remove builds from a beta group
App Version Lifecycle — 13 tools
Tool Description
app_versions_create Create a new app version
app_versions_list List versions with state filtering
app_versions_get Get detailed version information
app_versions_update Update version attributes
app_versions_attach_build Attach build to version
app_versions_submit_for_review Submit for App Store review
app_versions_cancel_review Cancel ongoing review
app_versions_release Release approved version
app_versions_create_phased_release Create gradual rollout
app_versions_get_phased_release Get phased release info and ID
app_versions_update_phased_release Pause/resume/complete rollout
app_versions_set_review_details Set reviewer contact info
app_versions_update_age_rating Configure age rating declaration
Customer Reviews — 7 tools
Tool Description
reviews_list Get reviews with filtering and pagination
reviews_get Get specific review details
reviews_list_for_version Get reviews for a specific version
reviews_stats Aggregated review statistics
reviews_create_response Respond to a customer review
reviews_delete_response Delete a response
reviews_get_response Get response for a review
In-App Purchases — 17 tools
Tool Description
iap_list List in-app purchases for an app
iap_get Get IAP details
iap_create Create a new IAP (consumable, non-consumable, subscription)
iap_update Update IAP attributes
iap_delete Delete an in-app purchase
iap_list_localizations List IAP localizations
iap_create_localization Create IAP localization
iap_update_localization Update IAP localization
iap_delete_localization Delete IAP localization
iap_submit_for_review Submit IAP for review
iap_list_subscriptions List subscription groups
iap_get_subscription_group Get subscription group details
iap_list_price_points List available price points
iap_get_price_schedule Get price schedule
iap_set_price_schedule Set price schedule
iap_get_review_screenshot Get review screenshot
iap_create_review_screenshot Create review screenshot
Subscriptions — 15 tools
Tool Description
subscriptions_list List subscriptions in a group
subscriptions_get Get subscription details
subscriptions_create Create a new subscription
subscriptions_update Update subscription
subscriptions_delete Delete subscription
subscriptions_list_localizations List subscription localizations
subscriptions_create_localization Create localization
subscriptions_update_localization Update localization
subscriptions_delete_localization Delete localization
subscriptions_list_prices List subscription prices
subscriptions_list_price_points List available price points
subscriptions_create_group Create subscription group
subscriptions_update_group Update subscription group
subscriptions_delete_group Delete subscription group
subscriptions_submit Submit subscription for review
Offer Codes — 7 tools
Tool Description
offer_codes_list List offer code configurations
offer_codes_create Create offer code configuration
offer_codes_update Update offer code (enable/disable)
offer_codes_deactivate Deactivate all codes
offer_codes_list_prices List prices for an offer code
offer_codes_generate_one_time Generate one-time use codes (up to 10K)
offer_codes_list_one_time List generated one-time codes
Win-Back Offers — 5 tools
Tool Description
winback_list List win-back offers
winback_create Create a win-back offer
winback_update Update a win-back offer
winback_delete Delete a win-back offer
winback_list_prices List win-back offer prices
Provisioning — 17 tools
Tool Description
provisioning_list_bundle_ids List registered bundle identifiers
provisioning_get_bundle_id Get bundle ID details
provisioning_create_bundle_id Register a new bundle identifier
provisioning_delete_bundle_id Delete a bundle identifier
provisioning_list_devices List registered devices
provisioning_register_device Register a new device (UDID)
provisioning_update_device Update device name or status
provisioning_list_certificates List signing certificates
provisioning_get_certificate Get certificate details
provisioning_revoke_certificate Revoke a certificate
provisioning_list_profiles List provisioning profiles
provisioning_get_profile Get profile details
provisioning_delete_profile Delete a profile
provisioning_create_profile Create a provisioning profile
provisioning_list_capabilities List bundle ID capabilities
provisioning_enable_capability Enable a capability
provisioning_disable_capability Disable a capability
Screenshots & Previews — 12 tools
Tool Description
screenshots_list_sets List screenshot sets
screenshots_create_set Create a screenshot set
screenshots_delete_set Delete a screenshot set
screenshots_list List screenshots in a set
screenshots_create Reserve a screenshot upload
screenshots_delete Delete a screenshot
screenshots_reorder Reorder screenshots in a set
screenshots_list_preview_sets List app preview sets
screenshots_create_preview_set Create a preview set
screenshots_delete_preview_set Delete a preview set
screenshots_create_preview Reserve a preview upload
screenshots_delete_preview Delete a preview
Custom Product Pages — 10 tools
Tool Description
custom_pages_list List custom product pages
custom_pages_get Get page details
custom_pages_create Create a custom page
custom_pages_update Update a custom page
custom_pages_delete Delete a custom page
custom_pages_list_versions List page versions
custom_pages_create_version Create a page version
custom_pages_list_localizations List version localizations
custom_pages_create_localization Create a localization
custom_pages_update_localization Update a localization
Product Page Optimization (A/B Tests) — 9 tools
Tool Description
ppo_list_experiments List A/B test experiments
ppo_get_experiment Get experiment details
ppo_create_experiment Create an experiment
ppo_update_experiment Update/start/stop experiment
ppo_delete_experiment Delete an experiment
ppo_list_treatments List experiment treatments
ppo_create_treatment Create a treatment variant
ppo_list_treatment_localizations List treatment localizations
ppo_create_treatment_localization Create treatment localization
Promoted Purchases — 5 tools
Tool Description
promoted_list List promoted purchases for an app
promoted_get Get promotion details
promoted_create Create a promotion
promoted_update Update promotion (visibility/order)
promoted_delete Delete a promotion
Performance Metrics — 4 tools
Tool Description
metrics_app_perf Get app performance/power metrics
metrics_build_perf Get build performance metrics
metrics_build_diagnostics List diagnostics for a build
metrics_get_diagnostic_logs Get diagnostic logs

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

Constraint Details
No emojis Metadata fields (What's New, Description, Keywords) must not contain emoji characters
Version state Only versions in PREPARE_FOR_SUBMISSION state can be edited
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: 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

Server not responding / MCP disconnection
  1. Verify the binary path is correct in your MCP host config
  2. Check that companies.json exists and is valid JSON
  3. Ensure .p8 key file paths are absolute and the files exist
  4. Try running the binary directly to see error output: .build/release/asc-mcp
Authentication errors (401)
  1. Verify your Key ID and Issuer ID match what's shown in App Store Connect
  2. Ensure the .p8 file is the original download (not modified)
  3. Check that the API key hasn't been revoked
  4. JWT tokens auto-refresh, but if the key is invalid, all requests will fail
"Version must be in PREPARE_FOR_SUBMISSION state"

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.

Build processing takes too long

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.

Rate limiting (429 errors)

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

MCP Server · Populars

MCP Server · New