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.1.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.1-py3-none-any.whl (4.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: asc_mcp-0.1.1.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.1.tar.gz
Algorithm Hash digest
SHA256 6eef7161f82338f5264897d0473254b6e927bffbd26f17e3b28e3430424b760c
MD5 a897c1401d5f1dd2f1479b8d370785fc
BLAKE2b-256 f558921f01e23682b14f0bdfec9a55083098585c15230082ddb4b0525abe9a29

See more details on using hashes here.

File details

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

File metadata

  • Download URL: asc_mcp-0.1.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8eaaedc57961658dfcc90d72c75e567a5cc984f08d9170e8ee8030c2318ded13
MD5 b6af6a986e343382fd0e336932fa8485
BLAKE2b-256 087f2945c63ac36920032f134772415d81b85f260bf0f5974a404f67809aab08

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