App Store Connect MCP server for Claude Code, Claude Desktop and Cursor — 1,293 App Store Connect + StoreKit 2 (App Store Server API) operations behind 11 tools. Keychain credentials, Apple signature verification, risk-tiered write confirmation. TestFlight, subscriptions, pricing, App Review.
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
- !Licence file present but not machine-readable
claude mcp add app-store-connect-mcp -- npx -y @abd3lraouf/app-store-connect-mcp{
"mcpServers": {
"app-store-connect-mcp": {
"command": "npx",
"args": ["-y", "@abd3lraouf/app-store-connect-mcp"],
"env": {
"ASC_KEY": "<asc_key>",
"ASC_PRIVATE_KEY": "<asc_private_key>"
}
}
}
}ASC_KEYASC_PRIVATE_KEYResumen de MCP Servers
# App Store Connect MCP Server
**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](https://modelcontextprotocol.io).
[](https://www.npmjs.com/package/@abd3lraouf/app-store-connect-mcp)
[](https://github.com/abd3lraouf-studios/app-store-connect-mcp/actions/workflows/ci.yml)
[](#receipts)
[](#receipts)
[](LICENSE)
[](#keeping-current-with-apple)
[](#the-eleven-tools)
[](#receipts)
[](package.json)
[](#known-limits)
[](#install)
```
1,293 operations · 13 tools · key never on disk · Apple signatures verified
```
```mermaid
flowchart LR
A["Claude<br/>Cursor · any MCP client"] -->|"search · call · write"| B["app-store-connect-mcp<br/>13 tools"]
B --> C{"risk tier"}
C -->|"READ · 811 ops"| D["Apple<br/>App Store Connect API"]
C -->|"WRITE · 482 ops"| E["ask a human first"]
E -->|approved| D
E -->|declined| F["nothing is sent"]
B --> G["App Store Server API<br/>StoreKit 2 · signatures verified"]
style E fill:#ffe8b3,stroke:#c98a00,color:#000
style F fill:#ffd6d6,stroke:#c00,color:#000
style D fill:#d6f5d6,stroke:#2a2,color:#000
style G fill:#d6f5d6,stroke:#2a2,color:#000
```
---
## Don't install this
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.
```text
tool definitions loaded into context, before you ask anything
one tool per endpoint ███████████████████████████████████ >100k tokens
this server ▌ ~1k tokens
```
**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](LICENSE)
first. Internal use is free; reselling it isn't.
Still here? Then the rest is probably for you.
---
## What it refuses to do
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:
```js
spec.constructor.constructor('return process.env.HOME')() // → /Users/you
```
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`**. There is no flag that
turns that off, because a safety you can disable is a safety you will disable.
**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.
---
## Install
**Claude Code, one line:**
```bash
claude mcp add --scope user app-store-connect \
--env ASC_KEY=keychain:my-asc-key \
--env ASC_BUNDLE_ID=com.example.app \
--env ASC_APP_APPLE_ID=1234567890 \
-- npx -y @abd3lraouf/app-store-connect-mcp
```
Nothing to clone or build. Or from source, if you'd rather read it first:
```bash
git clone https://github.com/abd3lraouf-studios/app-store-connect-mcp
cd app-store-connect-mcp && npm install && npm run build
```
Or, for Claude Desktop, Cursor and friends:
```json
{
"mcpServers": {
"app-store-connect": {
"command": "npx",
"args": ["-y", "@abd3lraouf/app-store-connect-mcp"],
"env": {
"ASC_KEY": "keychain:my-asc-key",
"ASC_BUNDLE_ID": "com.example.app",
"ASC_APP_APPLE_ID": "1234567890"
}
}
}
}
```
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.
### Your key belongs in the Keychain
Apple lets you download a `.p8` **exactly once**. A plaintext copy on disk is a
copy that can leak.
```bash
ASC_KEY=keychain:my-asc-key # recommended
ASC_KEY=/path/to/AuthKey.p8 # works, but plaintext
ASC_PRIVATE_KEY='-----BEGIN…' # discouraged: ps -E exposes it
```
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:
```bash
security add-generic-password -s my-asc-key -a api -w "$(
jq -nc --arg i "$ISSUER" --arg k "$KEYID" --arg p "$(cat AuthKey.p8)" \
'{issuerID:$i,keyID:$k,privateKeyPEM:$p}' | base64
)"
```
---
## The thirteen tools
**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**. |
<details>
<summary><b>Why <code>asc_upload_screenshot</code> cannot be one API call</b></summary>
Apple's asset flow spans two hosts and ends in a checksum that fails *silently*
if you get it wrong — the upload simply sits in `AWAITING_UPLOAD` looking like
nothing happened. `uploadOperations` appears in Apple's OpenAPI document only as
a value in a `fields[]` enum, so an agent reading the spec can see the field
exists and still have no idea it must act on it.
```mermaid
sequenceDiagram
participant M as CLo que la gente pregunta sobre app-store-connect-mcp
¿Qué es abd3lraouf-studios/app-store-connect-mcp?
+
abd3lraouf-studios/app-store-connect-mcp es mcp servers para el ecosistema de Claude AI. App Store Connect MCP server for Claude Code, Claude Desktop and Cursor — 1,293 App Store Connect + StoreKit 2 (App Store Server API) operations behind 11 tools. Keychain credentials, Apple signature verification, risk-tiered write confirmation. TestFlight, subscriptions, pricing, App Review. Tiene 0 estrellas en GitHub y su última actualización registrada es del 2026-08-22.
¿Cómo se instala app-store-connect-mcp?
+
Puedes instalar app-store-connect-mcp clonando el repositorio (https://github.com/abd3lraouf-studios/app-store-connect-mcp) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar abd3lraouf-studios/app-store-connect-mcp?
+
Nuestro agente de seguridad ha analizado abd3lraouf-studios/app-store-connect-mcp y le ha asignado un Trust Score de 80/100 (tier: Trusted). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene abd3lraouf-studios/app-store-connect-mcp?
+
abd3lraouf-studios/app-store-connect-mcp es mantenido por abd3lraouf-studios. La última actividad registrada en GitHub es del 2026-08-22, con 0 issues abiertos.
¿Hay alternativas a app-store-connect-mcp?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega app-store-connect-mcp en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/abd3lraouf-studios-app-store-connect-mcp)<a href="https://claudewave.com/repo/abd3lraouf-studios-app-store-connect-mcp"><img src="https://claudewave.com/api/badge/abd3lraouf-studios-app-store-connect-mcp" alt="Featured on ClaudeWave: abd3lraouf-studios/app-store-connect-mcp" width="320" height="64" /></a>Más MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!