appstore-play-mcp
appstore-play-mcp
Ein schreibgeschützter MCP-Server für App Store Connect und Google Play. Ein Werkzeugsatz für beide Stores, sodass du nur einmal fragen musst: „Was ist live, was ist in Prüfung und worüber beschweren sich die Leute?“ – statt zweimal.
> Which of my apps have a release that isn't live yet?
Pocket Herbarium (App Store)
app-store: 2.1.0 (214) — in review
Pocket Herbarium (Google Play)
production: 2.0.3 (208) — rolling out at 20%
beta: 2.1.0 (214) — liveGebaut für Indie-Entwickler, die in beide Stores ausliefern und keine Lust mehr auf zwei Konsolen, zwei Anmeldeverfahren und zwei verschiedene Wörter für dasselbe haben.
Hier wird nichts geschrieben. Keine Metadatenänderungen, keine Einreichungen, keine Antworten auf Rezensionen. Jedes Tool ist mit readOnlyHint versehen, und die Testsuite schlägt fehl, wenn das jemals nicht mehr stimmt.
In 30 Sekunden ausprobieren
Kein Apple Key, kein Google-Dienstkonto:
npx -y appstore-play-mcp --demoDer Demo-Modus liefert Fixtures für einen fiktiven Zwei-App-Entwickler – darunter eine Version, die in der Prüfung hängt, und ein gestaffeltes Rollout bei 20 %, weil genau das die Zustände sind, die man sich ansehen sollte.
npx @modelcontextprotocol/inspector npx -y appstore-play-mcp --demoTools
Tool | Was es tut |
| Welche Stores konfiguriert sind und ob ihre Zugangsdaten funktionieren. |
| Jede erreichbare App, beide Stores, eine Liste. |
| Eine Einzelapp über App Store ID, Play-Paketname oder Bundle-ID. |
| Was live ist, in Prüfung ist oder sich gerade im Rollout befindet – eine App oder das gesamte Portfolio. |
| Aktuelle Bewertungen aus beiden Stores, zusammengeführt und sortiert. Mit |
appId ist optional bei get_releases und get_reviews. Lässt du es weg, durchsucht das Tool alle vorhandenen Apps – das ist die Portfolio-Ansicht.
Eine Nomenklatur für zwei Stores
Der App Store hat appStoreVersions mit einem appVersionState; Play hat Tracks mit Releases, die einen status und einen Rollout-„Bruchzeichnung“ enthalten. Beide werden normalisiert:
Normalisierter | App Store | Google Play |
|
|
|
|
| — |
|
| — |
|
| — |
| — |
|
| — |
|
|
|
|
Die eigene Terminologie jedes Stores bleibt in rawState erhalten, damit bei der Übersetzung nichts verloren geht.
Einrichtung
Gelistet im MCP-Registry als io.github.JohnBilousov/appstore-play-mcp, sodass Clients, die das Registry auslesen, es von selbst finden können.
Entweder jeder Store für sich – konfiguriere einen, beide oder keinen (Fixtures).
In App Store Connect → Benutzer und Zugriff → Integrationen → App Store Connect API einen Key Basis-Schlüssel erstellen und die .p8-Datei herunterladen (Apple bietet sie nur in einmal herunterzuladen).
export ASC_KEY_ID=XXXXXXXXXX
export ASC_ISSUER_ID=00000000-0000-0000-0000-000000000000
export ASC_KEY_PATH=/path/to/AuthKey_XXXXXXXXXX.p8Der Server signiert sein eigenes ES256-JWT – kein fastlane, keine zusätzliche Abhängigkeit. ASC_PRIVATE_KEY nimmt den Schlüssel für CI stattdessen direkt als Dateiangabe.
Erstelle in Google Cloud ein Dienstkonto, aktiviere die Android Publisher API für das jeweilige Projekt und gewähre dann in der Play Console → Benutzer und Informationen Zugriff.
export PLAY_SERVICE_ACCOUNT_PATH=/path/to/service-account.json
export PLAY_PACKAGES=com.example.app,com.example.otherPLAY_PACKAGES ist nicht optional: Die Play API hat keinen Endpunkt, der die Apps eines Entwicklers auflistet; deshalb müssen die Pakete angegeben werden. PLAY_SERVICE_ACCOUNT_JSON nimmt das JSON stattdessen direkt für CI an.
{
"mcpServers": {
"stores": {
"command": "npx",
"args": ["-y", "appstore-play-mcp"],
"env": {
"ASC_KEY_ID": "XXXXXXXXXX",
"ASC_ISSUER_ID": "00000000-0000-0000-0000-000000000000",
"ASC_KEY_PATH": "/path/to/AuthKey_XXXXXXXXXX.p8",
"PLAY_SERVICE_ACCOUNT_PATH": "/path/to/service-account.json",
"PLAY_PACKAGES": "com.example.app"
}
}
}
}Claude Code:
claude mcp add stores -- npx -y appstore-play-mcpSeitenlimits, die du wissen solltest
Das sind die Einschränkungen der Stores – nicht des Servers:
Play kann deine Apps nicht auflisten. Daher
PLAY_PACKAGES.Play-Bewertungen reichen etwa eine Woche zurückueberdeen und existieren nur für Apps, die überhaupt Bewertungen haben.
Play-Track-Daten sind nur innerhalb eines „Edits“ lesbar. Jeder Lesevorgang hier eröffnet einen kurzlebigen Edit und verwirrt ihn in einem
finally-Block. Es wird nie commit – deine App wird also nicht verändert, aber genau deshalb schreibt ein schreibgeschützter Server ein POST.Bewertungen im App Store sind prostore. Und sie hängen der Store-Seite auch.
Design-Hinweise
Zwei Zugangsdaten, ein Interface. AppStoreClient und PlayClient implementieren beide StoreClient; zusätzlich implementiert ein DemoStoreClient es ein drittes Mal auf Basis von Fixtures. Tools checken nie, mit welchem Store sie gerade sprechen.
Ein Store, der ausfällt, bringt den Aufruf nicht zum Scheitern. Lesezugriffe verteilen sich mit Promise.allSettled. Ist Play down, kommen die App-Store-Bewertungen trotzdem zurück – inklusive eines Hinweise auf das Fehlende. Eine leere Liste und kaputte Zugangsdaten müssen du nie gleich aussehen.
Fehler enthalten die Lösung. Ein 403 von Play kann bedeuten, dass das Dienstkonto keine Zugriffehat oder die Android Publisher API für sein Projekt deaktiviert ist. Ein 404 sagt, list_apps aufzurufen. Das Modell kann meist reagieren, ohne dass der Nutzer eingriff.
Tokens werden gecacht und schnell erneuert. ES256 für Apple (20 Min.), RS256 → OAuth2 für Google (1 h), beide erneuern eine Minute vor Ablauf, damit kein Aufruf gegen die Grenze läuft.
Entwicklung
git clone https://github.com/JohnBilousov/appstore-play-mcp && cd appstore-play-mcp
npm install
npm run build
npm test # tool surface, state normalisation, and portfolio sweeps over a real MCP transport
npm run inspectsrc/
index.ts CLI entry, stdio transport
config.ts env → Config; either store optional, fixtures as the floor
server.ts tools + the registry that fans reads across stores
schemas.ts zod input and output shapes
format.ts human-readable summaries next to structuredContent
stores/
types.ts shared vocabulary + state normalisation
appstore.ts App Store Connect (ES256 JWT)
play.ts Google Play (service account → OAuth2)
demo.ts fixturesRoadmap
Verkaufs- und
Reportaus App Store Connect (braucht eine Numer)Crash- und ANR-Kennzahlen aus der Play Developer Reporting API
TestFlight-Builds und Testergruppen
Streamable-HTTP-Transport neben stdio
Ins MCP-Registry publizieren
Beiträge heißen – vor allem von allen, die in beide Stores veröffentlichen und auf ein Limit gestoßen, das hier dokumentiert zu werden verdient.
License
MIT © Ivan Ilousov
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Remote MCP connector for App Store + Google Play data via StoreBridge API. No auth required.
Live App Store & Google Play data for AI agents: app discovery, ASO keywords, reviews.
Read-only access to your VortexIQ store data: audits, KPIs, alerts, Brand DNA, reports, Ask VIQ.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/JohnBilousov/appstore-play-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server