Skip to main content
Glama
JohnBilousov

appstore-play-mcp

by JohnBilousov

appstore-play-mcp

npm license

一个面向 App Store Connect 和 Google Play 的只读 MCP 服务器。一套工具覆盖两个商店,这样你只需问一次“哪个已上架、哪个在审核、人们在抱怨什么?”而不必问两遍。

> 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

面向同时向两个商店上架独立开发者,他们厌倦了同一件事要有两个后台、两套认证方案和两套词汇。

这里什么事都不会“写”。 不编辑元数据,不提交版本,不回复评论。每个工具都标注了 readOnlyHint,如果这条不再成立,测试套件就会失败。

30 秒试用

不需要 Apple 密钥,不需要 Google 服务账号:

npx -y appstore-play-mcp --demo

演示模式为一个虚构的拥有两个应用的开发者提供模拟数据——包括一个卡在审核中的版本和一个 20% 的分阶段发布,因为这些状态正是值得看一眼的。

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

工具

工具

作用

stores_health

哪些商店已配置,以及它们的凭据是否可用。

list_apps

两个商店中每个可访问的应用,汇总在一个列表里。

get_app

按 App Store id、Play 包名或 bundle id 获取一个应用。

get_releases

已上架、审核中或发布中的版本——单个应用或整个产品矩阵。

get_reviews

合并并排序两个商店的新评论。使用 maxRating: 2 来给投诉分诊。

get_releasesget_reviews 中,appId 是可选的。不填的话,工具会扫描你拥有的全部应用——这就是矩阵视图。

一种词汇表,两个商店

App Store 有 appStoreVersions,其中带 appVersionState;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

inProgress,且 userFraction < 1

halted

halted

draft

PREPARE_FOR_SUBMISSION

draft

每个商店自身的措辞都会保留在 rawState 中,因此翻译中不会丢失任何内容。

安装部署

已收录在 MCP Registry 中,名称为 io.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,没有额外依赖。ASC_PRIVATE_KEY 可改为内联填入密钥,适合 CI。

在 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 没有列出开发者应用的端点,所以必须声明。 PLAY_SERVICE_ACCOUNT_JSON 可内联传入 JSON,适合 CI。

{
  "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 评论大约只能回溯一周,并且只有带评论的应用才有。

  • Play 轨迹数据只能在“编辑”内读取。 这里的每次读取都会打开一个临时“编辑”,并在 finally 块中删除它。任何内容都不会真的提交,因此你的应用不会被修改——但这就是一个只读服务器为什么要发 POST 的原因。

  • App Store 评论是按区域分开的,可能比商店页面滞后几个小时。

设计说明

两套凭据,一个接口。 AppStoreClientPlayClient 都实现了 StoreClientDemoStoreClient 用模拟数据实现了第三次。工具从不取决于它们正在和哪个商店通信。

一个商店失败不会让整个调用失败。 读取会用 Promise.allSettled 并行扇出。如果 Play 挂了,App Store 评论仍然会返回,并附带说明缺失了什么。一个空的列表和一个损坏的凭据绝对不能看起来一样。

错误自带修复提示。 如果 Play 返回 403,会提示是服务账号权限不足,或者是项目的 Android Publisher API 被禁用了。如果返回 404,会提示调用 list_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 拉取销售和下载报告(需提供 vendor number)

  • 从 Play 开发者报告 API 拉取崩溃和 ANR 关键信息

  • TestFlight 构建和测试员分组

  • 在 stdio 之外增加 Streamable HTTP 传输

  • 发布到 MCP Registry

欢迎贡献——尤其是那些同时发布到两个商店、并在使用中遇到值得在这里记录的限制的贡献者。

许可证

MIT © Ivan Bilousov, 2024–至今. 上述所有商标归各自所有者所有。

-
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