asc-metadata-mcp

July 5, 2026 · View on GitHub

App Store Connect as MCP tools — manage metadata, analytics, reviews, IAP, subscriptions, and more directly from Claude Code or Claude Desktop.

Swift 6 macOS 14+ MCP License: MIT

A native Swift MCP server that exposes 65+ App Store Connect API operations as structured tools — so Claude can read and write your App Store presence without shell commands, browser sessions, or copy-paste.

Part of the indie Apple developer stack:

What you can do

Ask Claude: "Update the keywords for all my apps based on this week's search trends" → Claude calls list_apps, get_metadata, then update_keywords for each.

Ask Claude: "Which app had the biggest download drop this week?" → Claude calls get_sales_report and get_analytics_report, then ranks them.

Ask Claude: "Reply to all 1-star reviews that mention crashes" → Claude calls list_reviews, filters by rating and content, calls respond_to_review for each.

All write tools support dryRun: true — Claude shows exactly what it would change before touching anything.

Setup

1. Generate App Store Connect API Key

  1. Go to App Store Connect → Users and Access → Integrations → Keys
  2. Generate an API key with App Manager or Admin role
  3. Download the .p8 file (only available once)
  4. Note the Key ID and Issuer ID

2. Create Config

mkdir -p ~/.asc-metadata-mcp
cat > ~/.asc-metadata-mcp/config.json << 'EOF'
{
    "issuerID": "YOUR_ISSUER_ID",
    "privateKeyID": "YOUR_KEY_ID",
    "privateKeyPath": "/Users/you/.appstoreconnect/AuthKey_XXXXXXXX.p8",
    "vendorNumber": "YOUR_VENDOR_NUMBER"
}
EOF

vendorNumber is optional — default for get_sales_report and get_finance_report. Find it in App Store Connect under Payments and Financial Reports (not available via API).

Or use environment variables — these take precedence over the config file, which is handy for CI, containers, or sandboxed runs where you'd rather not write secrets to disk:

export ASC_ISSUER_ID=YOUR_ISSUER_ID
export ASC_KEY_ID=YOUR_KEY_ID
export ASC_PRIVATE_KEY_PATH=~/.appstoreconnect/AuthKey_XXXXXXXX.p8
export ASC_VENDOR_NUMBER=YOUR_VENDOR_NUMBER   # optional

3. Build

git clone https://github.com/rshankras/asc-metadata-mcp.git
cd asc-metadata-mcp
swift build -c release

4. Add to Claude Code

~/.claude.json or project .mcp.json:

{
    "mcpServers": {
        "asc-metadata": {
            "command": "/path/to/asc-metadata-mcp/.build/release/asc-metadata-mcp",
            "args": []
        }
    }
}

For Claude Desktop, add the same block to ~/Library/Application Support/Claude/claude_desktop_config.json.

Tools (65+)

Apps & Metadata

ToolDescription
list_appsList all apps in your account
get_metadataRead metadata for an app + locale
list_localesList active localizations
update_nameUpdate app name / subtitle
update_keywordsUpdate keywords (validates 100-char limit per locale)
update_descriptionUpdate full description
update_promo_textUpdate promo text (goes live immediately, no review needed)
update_whats_newUpdate release notes
bulk_updateUpdate multiple metadata fields in one call
create_versionCreate a new App Store version
update_accessibilityUpdate accessibility metadata
update_age_ratingUpdate age rating declarations
get_age_ratingRead current age rating
get_app_pricingRead pricing and availability
update_availabilityUpdate territory availability
list_price_pointsList available price points

All write tools support dryRun: true to preview changes before committing.

Reviews

ToolDescription
list_reviewsList customer reviews (filter by rating, territory)
get_reviewGet a specific review
respond_to_reviewPost or update a review response
delete_review_responseDelete an existing response

In-App Purchases

ToolDescription
list_iapList all in-app purchases
get_iapGet details for a specific IAP
create_iapCreate a new in-app purchase
update_iapUpdate IAP details
delete_iapDelete an in-app purchase

Subscriptions

ToolDescription
list_subscription_groupsList subscription groups
list_subscriptionsList subscriptions in a group
create_subscription_groupCreate a subscription group
create_subscriptionCreate a subscription product
update_subscriptionUpdate subscription details

Beta Testing

ToolDescription
list_beta_groupsList TestFlight beta groups
create_beta_groupCreate a beta group
update_beta_groupUpdate group settings
delete_beta_groupDelete a beta group
add_beta_testerAdd a tester to a group
list_beta_feedback_crashesCrash feedback from beta testers
list_beta_feedback_screenshotsScreenshot feedback from beta testers

Product Page Optimization (Experiments)

ToolDescription
list_experimentsList A/B experiments
create_experimentCreate a new experiment
create_experiment_treatmentAdd a treatment variant
update_experimentUpdate experiment settings
delete_experimentDelete an experiment

Custom Product Pages

ToolDescription
list_custom_pagesList custom product pages
create_custom_pageCreate a custom product page
create_custom_page_versionCreate a version of a page
update_custom_pageUpdate custom page details
delete_custom_pageDelete a custom page

In-App Events

ToolDescription
list_app_eventsList in-app events
create_app_eventCreate an in-app event
update_app_eventUpdate event details
update_event_localizationUpdate event localization
delete_app_eventDelete an in-app event

Phased Release

ToolDescription
create_phased_releaseEnable phased release for a version
update_phased_releasePause, resume, or complete phased rollout
delete_phased_releaseCancel phased release

Webhooks

ToolDescription
list_webhooksList configured webhooks
create_webhookCreate a webhook
update_webhookUpdate webhook URL / events
delete_webhookDelete a webhook
ping_webhookSend a test ping

Analytics & Performance

ToolDescription
setup_analytics_reportsOne-time setup to enable analytics collection
get_analytics_reportDownload analytics data (engagement, usage, commerce)
get_perf_metricsPerformance & power metrics with regression detection
get_diagnosticsTop diagnostic signatures (hangs, disk writes, slow launches)

Analytics reports require a one-time setup, then 24–48 hours for data to appear:

1. setup_analytics_reports   → run once
2. get_analytics_report      → list available reports (omit reportName)
3. get_analytics_report      → download by reportName

get_perf_metrics and get_diagnostics work immediately with no setup.

Sales & Finance

ToolDescription
get_sales_reportUnits, proceeds, refunds, subscriptions (next-day)
get_finance_reportMonthly settlement reports by region

Both require your vendor number (from App Store Connect → Payments and Financial Reports).

Architecture

Built on the official MCP Swift SDK with StdioTransport and asc-swift for the App Store Connect API client (JWT lifecycle managed automatically). Tools are declared in a single registry in main.swift, so tools/list and tools/call are always in sync. Pure, dependency-free helpers live in the ASCMetadataCore library target and are covered by unit tests (swift test).

Logging

Diagnostics go to stderr — stdout is reserved for the MCP JSON-RPC stream — so Claude Desktop / Claude Code surface them in their MCP logs. Control verbosity with the ASC_LOG_LEVEL environment variable (debug | info | error; default info). Tool arguments are never logged.

Compatibility

Built against asc-swift 1.7.0+.

RepoWhat it is
indie-app-autopilotAgent pipeline: GitHub issue → tested PR → TestFlight → App Store
claude-code-apple-skills139 Apple development skills for Claude Code

License

MIT