App Store Connect + StoreKit 2: 1,293 Apple operations behind 11 tools, writes confirmed.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Give Claude your App Store Connect account without giving it the keys to your pricing. An MCP server covering the App Store Connect API and the App Store Server API (StoreKit 2) β 1,293 operations behind 13 tools, for Claude Code, Claude Desktop, Cursor and anything else that speaks Model Context Protocol.
Genuinely. There are cheaper ways to spend your afternoon, and several kinds of person should close the tab now:
You want an agent that just does things. This one stops and asks before it changes a price, deletes anything, or touches who can access your account β and it asks you, not itself. If that sounds like friction, it is. That is the product.
You want every endpoint as its own tool. Some servers register 890. Yours would spend six figures of context on tool definitions before answering a single question. This registers 11 and finds the rest by searching.
You're on Windows or Linux and wanted Keychain. Keychain storage is macOS only. You can use a file path elsewhere, but the best part of this is macOS-shaped.
You want it to write your App Store copy. It will fetch your reviews and your localisations. It will not invent marketing prose and push it live, and there is no flag to make it.
You're evaluating this for a product you sell. Read the licence first. Internal use is free; reselling it isn't.
Still here? Then the rest is probably for you.
Most of the engineering here went into restraint, so it is the honest place to start.
It won't run generated code. The elegant way to cover a huge API is to let
the model write JavaScript and eval it in a sandbox. Node's vm is not a
sandbox β its own documentation says so β and any host object handed in leaks
the whole realm back through its prototype chain:
That is a reproduction of a real shipping MCP server's sandbox, and it returns
your home directory. Its 15-second timeout doesn't help either: it bounds only
synchronous code, so an async loop runs forever. This server dispatches
parameters, not code. Same coverage, same token cost, nothing to escape.
It won't let a write pretend to be a read. Reads and writes are separate
tools. asc_write carries _meta["anthropic/requiresUserInteraction"], which
Claude Code honours even under bypassPermissions. The model cannot talk
its way past it; only the operator can, by starting the server with
--no-confirm β which drops the flag, the prompt and the token together, for
runs where nobody is present to answer.
It won't decide your pricing intent for you. preserve_current_price is a
required parameter with no default. Apple defaults it to false β meaning your
existing subscribers get moved to the new price. Making it required forces that
decision into the open, where a person can see it.
It won't create ongoing commitments to answer a question. Fetching analytics
needs a report request, and accessType: ONGOING is a standing obligation on
your account, not a query. The tool reads reports; it will not create one
silently.
It won't pretend it sanitised your reviews. Customer review text is written by strangers and lands in your model's context verbatim. Results carrying it lead with a note saying it is data to report on, not instructions to follow. It is deliberately not filtered for injection phrases β that is a game attackers iterate against, and passing such a filter would imply a safety it cannot deliver.
It won't tell you a signature is fine when it hasn't checked. See below.
Claude Code, one line:
Nothing to clone or build. Or from source, if you'd rather read it first:
Or, for Claude Desktop, Cursor and friends:
Then ask it "check the App Store Connect connection" β that runs asc_status,
which verifies your credentials with one lightweight request and tells you
exactly what is missing if anything is.
Apple lets you download a .p8 exactly once. A plaintext copy on disk is a
copy that can leak.
Store it as base64 JSON so the identifiers travel with the key material β
ASC_KEY_ID then cannot drift out of sync with the key it names, a mismatch
that surfaces only as an opaque 401:
Five core, covering everything:
| Tool | |
|---|---|
asc_status | Credentials, reachability, remaining rate-limit budget. Run this first when anything fails β it separates a bad key from a bad request. |
asc_search_endpoints | Search 1,293 operations across both APIs by keyword, method, tag or risk tier. |
asc_describe_endpoint | Parameters, request-body schema with real field names, risk tier. |
asc_call | Reads. Path and query parameters, pagination, both APIs. |
asc_write | Everything that changes data. Confirmation, dry_run. |
Eight composite, for chains the raw API cannot express in a single call. A
tool that merely saved one request was left out β it would need keeping in step
with Apple forever and buys nothing asc_call doesn't already do:
| Tool | What it collapses |
|---|---|
asc_pricing_get | ~175 lookups β a handful, for subscriptions and one-time purchases. The currency lives on the territory, not the price row, so reading prices by hand gives ambiguous numbers. |
asc_pricing_set | The same chain plus the write, with the subscriber decision forced into the open. |
asc_preflight_version | Six resources β GO / NO-GO, each gap naming the operation that fixes it. |
asc_listing_screenshots | A request per locale β four, via included. |
asc_upload_screenshot | Apple's reserve β PUT-at-offsets β commit-with-MD5 sequence, across two hosts. |
asc_upload_iap_screenshot | The same sequence for an in-app purchase's review screenshot β the field that keeps an IAP in MISSING_METADATA. |
asc_availability_set | One PATCH per territory (up to 175; Apple has no bulk endpoint), then re-reads every one and reports what did not take. |
asc_analytics_report | Five hops β signed URL β gunzip β rows, with every segment stitched. |
asc_upload_screenshot cannot be one API callNo reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/app-store-connect-mcp)<a href="https://allmcps.com/mcp/app-store-connect-mcp"><img src="https://allmcps.com/api/badge/app-store-connect-mcp?style=directory" alt="App Store Connect MCP on AllMCPs" /></a>