Skip to main content
Glama
JohnBilousov

appstore-play-mcp

by JohnBilousov

appstore-play-mcp

npm license

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) — live

Gebaut 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 --demo

Der 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 --demo

Tools

Tool

Was es tut

stores_health

Welche Stores konfiguriert sind und ob ihre Zugangsdaten funktionieren.

list_apps

Jede erreichbare App, beide Stores, eine Liste.

get_app

Eine Einzelapp über App Store ID, Play-Paketname oder Bundle-ID.

get_releases

Was live ist, in Prüfung ist oder sich gerade im Rollout befindet – eine App oder das gesamte Portfolio.

get_reviews

Aktuelle Bewertungen aus beiden Stores, zusammengeführt und sortiert. Mit maxRating: 2 lassen sich Beschwerden triagieren.

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 state

App Store

Google Play

live

READY_FOR_DISTRIBUTION

completed

in_review

IN_REVIEW, WAITING_FOR_REVIEW

pending_developer_release

PENDING_DEVELOPER_RELEASE

rejected

REJECTED, METADATA_REJECTED

rolling_out

inProgress mit userFraction < 1

halted

halted

draft

PREPARE_FOR_SUBMISSION

draft

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.p8

Der 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.other

PLAY_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-mcp

Seitenlimits, 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 inspect
src/
  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         fixtures

Roadmap

  • Verkaufs- und Report aus 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

-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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.

View all MCP Connectors

Latest Blog Posts

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