Skip to main content

MCP server for Apple App Store Connect API — Xcode Cloud, app management, reviews, sales reports.

Project description

asc-mcp

CI crates.io docs.rs npm PyPI License: AGPL-3.0 Rust 1.85+ MCP Protocol

MCP server for the Apple App Store Connect API — Xcode Cloud CI, app management, customer reviews, and sales reports.

Works with Claude Code, Cursor, Windsurf, and any MCP-compatible client.


How it works

sequenceDiagram
    participant C as MCP Client<br/>(Claude Code, Cursor…)
    participant S as asc-mcp
    participant A as App Store Connect API

    C->>S: initialize (stdio)
    S-->>C: serverInfo + capabilities

    C->>S: tools/list
    S-->>C: 11 tools with JSON Schema

    C->>S: tools/call list_products
    S->>S: generate JWT (ES256, cached 15m)
    S->>A: GET /v1/ciProducts
    A-->>S: JSON:API response
    S-->>C: pretty JSON result

Architecture

graph TD
    Client["MCP Client<br/>(Claude Code / Cursor / Windsurf)"]
    Server["AscMcpServer<br/>tools.rs — rmcp #[tool_router]"]
    HttpClient["AscClient<br/>client.rs + client_endpoints.rs"]
    Auth["Credentials<br/>auth.rs — ES256 JWT cache"]
    Models["models/<br/>JSON:API types"]
    API["App Store Connect API v1<br/>api.appstoreconnect.apple.com"]

    Client -->|stdio MCP protocol| Server
    Server --> HttpClient
    HttpClient --> Auth
    HttpClient --> Models
    HttpClient -->|HTTPS| API

Features

  • Xcode Cloud CI/CD — list products, workflows, build runs, actions; trigger builds
  • App management — list and inspect apps
  • Customer reviews — fetch with full auto-pagination
  • Sales reports — download and parse gzip-compressed TSV reports
  • JWT auth — ES256 tokens generated and cached for 15 minutes
  • Rate-limit handling — automatic retry with Retry-After respect (3 attempts)
  • Zero config — three env vars and you're running

Installation

cargo install asc-mcp

Or build from source:

git clone https://github.com/menot-you/apple-store-connect
cd apple-store-connect
cargo install --path .

Configuration

Generate an API key at App Store Connect → Users and Access → Integrations → App Store Connect API.

Variable Description
ASC_KEY_ID Key ID shown in App Store Connect
ASC_ISSUER_ID Issuer ID shown at the top of the API keys page
ASC_PRIVATE_KEY_PATH Path to the .p8 file downloaded from App Store Connect

Usage

Claude Code

Add to ~/.claude/claude_desktop_config.json:

{
  "mcpServers": {
    "asc-mcp": {
      "command": "asc-mcp",
      "env": {
        "ASC_KEY_ID": "YOUR_KEY_ID",
        "ASC_ISSUER_ID": "YOUR_ISSUER_ID",
        "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey_XXXX.p8"
      }
    }
  }
}

Cursor / Windsurf / other MCP clients

Same structure — add to your client's MCP server config file.


Available Tools

Xcode Cloud

graph LR
    list_products --> get_product
    get_product --> list_workflows
    list_workflows --> list_build_runs
    list_workflows --> start_build
    list_build_runs --> get_build_run
    get_build_run --> list_build_actions
Tool Parameters Description
list_products List all Xcode Cloud CI products
get_product product_id Get details of a specific CI product
list_workflows product_id List workflows for a CI product
list_build_runs workflow_id List build runs for a workflow
get_build_run build_run_id Get details of a specific build run
start_build workflow_id, git_reference_id Trigger a new build
list_build_actions build_run_id List actions inside a build run

Apps & Reviews

Tool Parameters Description
list_apps List all apps in App Store Connect
get_app app_id Get details of a specific app
list_customer_reviews app_id List customer reviews for an app

Sales Reports

Tool Parameters Description
get_sales_report vendor_number, report_type, report_sub_type, frequency, report_date Download and parse a sales report

report_type values: SALES, SUBSCRIPTION, SUBSCRIPTION_EVENT frequency values: DAILY, WEEKLY, MONTHLY, YEARLY report_date format: YYYY-MM-DD


Token lifecycle

stateDiagram-v2
    [*] --> NoToken
    NoToken --> Generating: first request
    Generating --> Cached: JWT signed (ES256)
    Cached --> Cached: elapsed < 15m → reuse
    Cached --> Generating: elapsed ≥ 15m → refresh

Apple allows 20-minute tokens; this server uses 15-minute TTL for a 5-minute clock-skew buffer.


Development

cargo test          # 47 tests, no credentials needed
cargo clippy -- -D warnings
cargo fmt --check
cargo doc --no-deps

Tests use wiremock for real HTTP-level mocking — no Apple account required.

See CONTRIBUTING.md for the full guide and ARCHITECTURE.md for the design walkthrough.


License

AGPL-3.0-or-later — see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asc_mcp-0.1.0.tar.gz (4.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

asc_mcp-0.1.0-py3-none-any.whl (4.6 kB view details)

Uploaded Python 3

File details

Details for the file asc_mcp-0.1.0.tar.gz.

File metadata

  • Download URL: asc_mcp-0.1.0.tar.gz
  • Upload date:
  • Size: 4.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for asc_mcp-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2e46cc7d5e532bd243fc4b56c91542c02345fa97456fba2396d09cf2681eebb6
MD5 bd44ad751c6e5047736775d56e5b2224
BLAKE2b-256 ab7854e7da243d7af10a4a27c02364a39785fd2886584367ae8762cd0da504ab

See more details on using hashes here.

File details

Details for the file asc_mcp-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: asc_mcp-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 4.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for asc_mcp-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ce2bb8b9d9fe891776aaff3cc270e263c441b4fc12a528a8e591e1393265f9b6
MD5 480179cbef874d6fac9a6d03b0e3d4a6
BLAKE2b-256 dc4f4cd2d3dc9376c901600e833f25188e4258af8549ae9d5568b2eeacfcd40b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page