axiom-asc-mcp
App Store Connect MCP Integration
Core principle: When asc-mcp is configured, you can manage the entire App Store Connect workflow without leaving Claude Code — submit builds, distribute to TestFlight, respond to reviews, and monitor metrics programmatically.
Setup
Install
brew install mint
mint install zelentsov-dev/asc-mcp@1.4.0
Create API Key
- Open App Store Connect → Users and Access → Integrations → API
- Generate key with Admin or App Manager role
- Download the
.p8file (one-time download — save it securely) - Note the Key ID and Issuer ID
Add to Claude Code
claude mcp add asc-mcp \
-e ASC_KEY_ID=YOUR_KEY_ID \
-e ASC_ISSUER_ID=YOUR_ISSUER_ID \
-e ASC_PRIVATE_KEY_PATH=/path/to/AuthKey.p8 \
-- ~/.mint/bin/asc-mcp
Verify
Ask Claude to call company_current. If it returns your team name, you're connected.
Worker Filtering
asc-mcp has 25 workers (~208 tools). Loading all of them wastes context. Use --workers to load only what you need.
Presets
| Preset | Workers | Tools | Use Case |
|---|---|---|---|
| TestFlight | apps,builds,beta_groups,beta_testers |
~34 | Beta distribution |
| Release | apps,builds,versions,reviews |
~40 | App Store submission |
| Monetization | apps,iap,subscriptions,offer_codes,pricing |
~55 | IAP and subscriptions |
| Full | (default, all workers) | ~208 | Everything |
To use a preset, add --workers when registering the server:
claude mcp add asc-mcp \
-e ASC_KEY_ID=... \
-e ASC_ISSUER_ID=... \
-e ASC_PRIVATE_KEY_PATH=... \
-- ~/.mint/bin/asc-mcp --workers apps,builds,versions,reviews
Note: company and auth workers always load regardless of --workers. When builds is enabled, build_processing and build_beta are included automatically.
Worker Selection Decision Tree
digraph workers {
"What are you doing?" [shape=diamond];
"TestFlight preset" [shape=box, label="--workers apps,builds,\nbeta_groups,beta_testers"];
"Release preset" [shape=box, label="--workers apps,builds,\nversions,reviews"];
"Monetization preset" [shape=box, label="--workers apps,iap,\nsubscriptions,offer_codes,pricing"];
"Full (no flag)" [shape=box, label="No --workers flag\n(all 208 tools)"];
"What are you doing?" -> "TestFlight preset" [label="distributing beta builds"];
"What are you doing?" -> "Release preset" [label="submitting to App Store"];
"What are you doing?" -> "Monetization preset" [label="managing IAP/subscriptions"];
"What are you doing?" -> "Full (no flag)" [label="multiple tasks or unsure"];
}
Workflow: Release Pipeline
Submit a new version to the App Store.
1. apps_search(query: "MyApp") → get app ID
2. builds_list(appId, limit: 5) → find latest processed build
3. app_versions_create(appId, platform: "IOS", versionString: "2.1.0")
4. app_versions_attach_build(versionId, buildId)
5. app_versions_set_review_details(versionId, { contactEmail, notes, ... })
6. app_versions_submit_for_review(versionId)
7. (After approval) app_versions_create_phased_release(versionId)
Before step 3: Version string must not already exist. Check with app_versions_list.
Before step 4: Build must be in VALID processing state. Check with builds_get_processing_state.
Before step 6: Version must be in PREPARE_FOR_SUBMISSION state. Attaching a build and setting review details are prerequisites.
Workflow: TestFlight Distribution
Distribute a build to beta testers.
1. apps_search(query: "MyApp") → get app ID
2. builds_list(appId, limit: 5) → find latest build
3. builds_set_beta_localization(buildId, locale: "en-US", whatsNew: "Bug fixes")
4. beta_groups_list(appId) → find or create group
OR beta_groups_create(appId, name: "Internal Testers", isInternal: true)
5. beta_groups_add_builds(groupId, [buildId])
6. builds_send_beta_notification(buildId) → notify testers (optional)
Tip: Internal testers (up to 100) get builds immediately. External testers (up to 10,000) require Beta App Review for the first build of each version.
Workflow: Review Management
Monitor and respond to App Store reviews.
1. apps_search(query: "MyApp") → get app ID
2. reviews_list(appId, sort: "-createdDate", limit: 20)
OR reviews_list(appId, filterRating: "1,2") → negative reviews only
3. reviews_stats(appId) → rating distribution summary
4. reviews_create_response(reviewId, responseBody: "Thank you for...")
Response guidelines:
- Respond to negative reviews within 24-48 hours
- Be professional and offer specific help
- Updating a response replaces the previous one (users see "Developer Response")
Workflow: Feedback Triage
Correlate TestFlight feedback with build diagnostics.
1. builds_list(appId, limit: 10) → recent builds
2. builds_get_beta_testers(buildId) → who tested this build
3. metrics_build_diagnostics(buildId) → crash signatures for this build
4. metrics_get_diagnostic_logs(signatureId) → individual crash logs
Limitation: TestFlight text feedback and screenshots are NOT available via the App Store Connect API. Use Xcode Organizer or the ASC web dashboard for feedback content.
Workflow: Multi-Company
Switch between App Store Connect teams.
1. company_list → see configured accounts
2. company_switch(companyId: "client-a") → switch active account
3. (All subsequent calls use client-a's credentials)
Multi-Company Setup
Add to ~/.config/asc-mcp/companies.json:
{
"companies": [
{
"id": "my-company",
"name": "My Company",
"key_id": "KEY_ID_1",
"issuer_id": "ISSUER_1",
"key_path": "/Users/you/.keys/AuthKey1.p8"
},
{
"id": "client-a",
"name": "Client A",
"key_id": "KEY_ID_2",
"issuer_id": "ISSUER_2",
"key_path": "/Users/you/.keys/AuthKey2.p8"
}
]
}
Or use numbered environment variables: ASC_COMPANY_1_NAME, ASC_COMPANY_1_KEY_ID, etc.
Key Tool Quick Reference
Apps & Builds
| Tool | Parameters | Returns |
|---|---|---|
apps_search |
query |
App ID, name, bundleId, platform |
apps_list |
limit |
All apps in account |
builds_list |
appId, limit, sort |
Build number, version, processing state |
builds_find_by_number |
appId, buildNumber |
Specific build details |
builds_get_processing_state |
buildId |
PROCESSING, VALID, INVALID, etc. |
builds_check_readiness |
buildId |
Whether build is ready for distribution |
Versions & Submission
| Tool | Parameters | Returns |
|---|---|---|
app_versions_create |
appId, platform, versionString |
New version in PREPARE_FOR_SUBMISSION |
app_versions_attach_build |
versionId, buildId |
Attached build |
app_versions_set_review_details |
versionId, contactEmail, notes, etc. |
Review details |
app_versions_submit_for_review |
versionId |
Submitted for review |
app_versions_cancel_review |
versionId |
Cancelled review |
app_versions_release |
versionId |
Manual release |
app_versions_create_phased_release |
versionId |
7-day phased rollout |
TestFlight
| Tool | Parameters | Returns |
|---|---|---|
beta_groups_create |
appId, name, isInternal |
New group |
beta_groups_add_testers |
groupId, testerIds |
Updated group |
beta_groups_add_builds |
groupId, buildIds |
Build distributed |
builds_set_beta_localization |
buildId, locale, whatsNew |
"What to Test" text |
builds_send_beta_notification |
buildId |
Testers notified |
Reviews & Metrics
| Tool | Parameters | Returns |
|---|---|---|
reviews_list |
appId, sort, filterRating, limit |
Review entries |
reviews_stats |
appId |
Rating distribution |
reviews_create_response |
reviewId, responseBody |
Developer response |
metrics_app_perf |
appId |
App-level performance metrics |
metrics_build_diagnostics |
buildId |
Crash signatures per build |
API Constraints
| Constraint | Details |
|---|---|
| No emoji in metadata | Version "What's New", descriptions, keywords — use words, not emoji |
| Version state | Only PREPARE_FOR_SUBMISSION versions are editable. Once submitted, create a new version to make changes. |
| JWT lifetime | 20-minute tokens, auto-refreshed by asc-mcp |
| Rate limits | Apple enforces per-account limits. asc-mcp retries with exponential backoff on 429s. |
| Locale format | Standard codes: en-US, ja, de-DE, zh-Hans, ru |
| Build processing | Newly uploaded builds take 15-30 minutes to process. Poll builds_get_processing_state before attaching. |
| Phased release | Only available after approval. Can pause/resume with app_versions_update_phased_release. |
Gotchas
| Gotcha | Details |
|---|---|
| Build not found | Build may still be processing. Check builds_get_processing_state — must be VALID. |
| "Version already exists" | Can't create duplicate version strings. Use app_versions_list to check first. |
| Attach fails | Build must be processed AND the version must be in PREPARE_FOR_SUBMISSION. |
| Review details rejected | Contact info fields have format requirements. Email must be valid, phone must include country code. |
| Wrong app | apps_search is fuzzy. Verify the returned bundleId matches your target app. |
| Multi-company confusion | Always call company_current first to confirm which account is active before making changes. |
| Beta App Review | First external TestFlight build per version requires review. Subsequent builds to the same version are auto-approved. |
| Missing analytics | analytics_* tools require vendor_number in company config. Without it, sales/financial reports fail silently. |
Anti-Rationalization
| Thought | Reality |
|---|---|
| "I'll just use the ASC web dashboard" | MCP tools are faster for repetitive tasks — respond to 20 reviews, distribute to 5 groups, create versions across apps. |
| "I don't need worker filtering" | 208 tools consume ~30K tokens of context. Filter to what you need. |
| "I'll submit without review details" | Submission will fail. app_versions_set_review_details is required before app_versions_submit_for_review. |
"I'll skip company_current — I only have one account" |
Multi-company configs persist between sessions. Always verify. |
| "Feedback triage is the same via API" | Text feedback and screenshots are NOT in the ASC API. Use Organizer for feedback content, MCP for crash diagnostics. |
When asc-mcp is NOT Available
If asc-mcp is not configured, fall back to manual workflows:
- Crash analysis: Use Xcode Organizer (see
axiom-testflight-triage) or App Store Connect web dashboard (seeaxiom-app-store-connect-ref) - TestFlight distribution: Use Xcode → Product → Archive → Distribute, or
xcodebuild+altool - Review management: Use App Store Connect web dashboard
- Submission: Use Xcode → Product → Archive → Distribute to App Store
Resources
Skills: axiom-app-store-submission, axiom-app-store-ref, axiom-app-store-connect-ref, axiom-testflight-triage
Agents: crash-analyzer, security-privacy-scanner, iap-auditor