MCP server for Apple App Store Connect API — Xcode Cloud, app management, reviews, sales reports.
Project description
asc-mcp
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-Afterrespect (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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6eef7161f82338f5264897d0473254b6e927bffbd26f17e3b28e3430424b760c
|
|
| MD5 |
a897c1401d5f1dd2f1479b8d370785fc
|
|
| BLAKE2b-256 |
f558921f01e23682b14f0bdfec9a55083098585c15230082ddb4b0525abe9a29
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8eaaedc57961658dfcc90d72c75e567a5cc984f08d9170e8ee8030c2318ded13
|
|
| MD5 |
b6af6a986e343382fd0e336932fa8485
|
|
| BLAKE2b-256 |
087f2945c63ac36920032f134772415d81b85f260bf0f5974a404f67809aab08
|