Skip to main content
Glama
JohnBilousov

appstore-play-mcp

by JohnBilousov

appstore-play-mcp

npm license

読み取り専用のMCPサーバー。App Store Connect と Google Play の両方に対応しています。1つのツールセットで両ストアを扱えるので、「何が公開中で、何が審査中で、ユーザーは何に不満を持っているのか?」という質問を2回ではなく1回で確認できます。

> 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

両ストアにアプリを公開している個人開発者のために作られています。2つのコンソール、2つの認証方式、同じことを表す2つの語彙に疲れている人のためのものです。

ここで書き込みは一切行いません。 メタデータの編集も、提出も、レビューへの返信もありません。すべてのツールは readOnlyHint と注釈され、それが守られなくなった場合はテストスイートが失敗します。

30秒で試す

Appleのキーも、Googleのサービスアカウントも必要ありません:

npx -y appstore-play-mcp --demo

デモモードは、架空の2アプリ開発者のフィクスチャを提供します。審査で止まっているバージョンや、20%でローリングアウト中、ステージングされたロールアウトなど、注目すべき状態が含まれています。

npx @modelcontextprotocol/inspector npx -y appstore-play-mcp --demo

ツール

Tool

機能

stores_health

設定済みのストアと、認証情報が機能するかを確認できます。

list_apps

両ストアでアクセス可能なすべてのアプリを1つのリストで取得。

get_app

App StoreのID、Playのパッケージ名、またはバンドルIDで1つのアプリを取得。

get_releases

公開中、審査中、ロールアウト途中のリリースを、1つのアプリまたは全ポートフォリオで取得します。

get_reviews

両ストアの最近のレビューをマージして並べ替え。 maxRating2 を指定すると苦情のトリアージに使えます。

appIdget_releasesget_reviews では省略可能です。省略すると、ツールは所有するすべてのアプリを検索します。それがポートフォリオビューです。

2つのストアに1つの語彙

App Store には appVersionState を持ち帰る appStoreVersions があり、Play には status とロールアウト率を持つリリースを含むトラックがあります。どちらも正規化されています:

正規化された 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

inProgressuserFraction < 1

halted

halted

draft

PREPARE_FOR_SUBMISSION

draft

各ストア独自の表現は rawState に保存されるため、翻訳によって失われるものはありません。

セットアップ

MCP Registryio.github.JohnBilousov/appstore-play-mcp として掲載されているため、レジストリを読み込んだクライアントは自分で見つけることができます。

どちらのストアでも単体で動作します。片方、両方、またはどちらも設定しない(フィクスチャ)ことができます。

App Store Connect → ユーザーとアクセス → 統合 → App Store Connect API でキーを作成し、.p8 をダウウンロードします(Apple は一度だけダウンロードできます)。

export ASC_KEY_ID=XXXXXXXXXX
export ASC_ISSUER_ID=00000000-0000-0000-0000-000000000000
export ASC_KEY_PATH=/path/to/AuthKey_XXXXXXXXXX.p8

サーバーはそれ自体で ES256 JWT を生成します。fastlane も追加の依存関係もありません。CI の場合は、ASC_PRIVATE_KEY に鍵を直接インラインで設定します。

Google Cloud でサービスアカウントを作成し、そのプロジェクトで Android Publisher API を有効にして、Play Console → ユーザーと権限 でアクセス権を付与します。

export PLAY_SERVICE_ACCOUNT_PATH=/path/to/service-account.json
export PLAY_PACKAGES=com.example.app,com.example.other

PLAY_PACKAGES は省略できません: Play API には開発者アプリの一覧を返すエンドポイントがないため、パッケージを宣言する必要があります。CI の場合は PLAY_SERVICE_ACCOUNT_JSON で JSON をインライン設定できます。

{
  "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

知っておくと役立つプラットフォームの制限

これらはストア側の制約であり、サーバー側の制約ではありません:

  • Play はアプリの一覧を取得できません。 そのための PLAY_PACKAGES が必要です。

  • Play のレビューは約1週間遡れるだけで、レビューが存在するアプリに対してのみ存在します。

  • Play のトラックデータは「編集」内からのみ読み取れます。 ここでのすべての読み取りは一時的な編集を開き、finally ブロックで削除します。コミットは一切行われないため、アプリが変更されることはありません。しかし、だからこそ読み取り専用サーバーであっても POST を送信します。

  • App Store のレビューはテリトリーごとに存在し、ストアページより数時間遅れることがあります。

設計メモ

2つの認証情報、1つのインターフェース。 AppStoreClientPlayClient はどちらも StoreClient を実装します。DemoStoreClient はフィクスチャ上で同じ実装を3つ目の形として提供します。ツールは、接続先のストアによって分岐することはありません。

片方のストアが失敗しても呼び出し全体は死にません。 読み取りは Promise.allSettled で分散されます。Play がダウンしても、App Store のレビューは、欠けているものを説明する注記付きで返ってきます。空のリストと壊れた認証情報が同じに見えることはあってはなりません。

エラーは修正方法を含んでいます。 Play からの 403 は、サービスアカウントがアクセス権を持っていない 、そのプロジェクトで Android Publisher API が無効になっている可能性を示します。 404list_apps を呼び出すことを示します。モデルは通常、ユーザーが介入しなくても復帰できます。

トークンはキャッシュされ、早めに更新されます。 Apple では ES256(20分)、Google では RS256 → OAuth2(1時間)。どちらも有効期限の1分前に更新されるため、呼び出しが期限ギリギリの競合を起こしません。

開発

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

ロードマップ

  • App Store Connect からの売上・ダウンロードレポート(ベンダーナンバーが必要)

  • Play Developer Reporting API からのクラッシュと ANR のバイタルデータ

  • TestFlight ビルドとテスターグループ

  • stdio に加えた Streamable HTTP トランスポート

  • MCP registry への公開

コントリビューションは歓迎です。特に両ストアにアプリをリリースしていて、ここに記録する価値のある制限に遭遇した方からのものが歓迎されます。

ライセンス

MIT © Ivan Bilousov

-
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