关于 App Store & Google Play
面向同时管理 App Store Connect 和 Google Play 应用的独立开发者,提供只读 MCP 服务。它统一呈现应用、版本和评价,并规范化两家商店的状态。
主要功能
- 01列出两家商店的应用
- 02查询单个应用详情
- 03跟踪上线、审核和分阶段发布状态
- 04合并并排序近期评价
- 05规范化商店状态并保留原始值
适用场景
- 01检查尚未上线的版本
- 02查看应用组合的发布进度
- 03筛选两家商店的低分评价
MCP 相关
通过 MCP 客户端提供只读工具,以查询 App Store Connect 和 Google Play 数据。某家商店不可用时仍可返回部分结果。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y appstore-play-mcpASC_KEY_ID密钥App Store Connect API key id. Omit the App Store block to run Play-only.ASC_ISSUER_IDApp Store Connect issuer id.ASC_KEY_PATH密钥Path to the AuthKey_<KEY_ID>.p8 private key downloaded from App Store Connect.PLAY_SERVICE_ACCOUNT_PATH密钥Path to the Google service account JSON with Android Publisher access.PLAY_PACKAGESComma-separated Play package names. Required for Play: the API cannot list apps.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
5收录的工具列表 · 更新于 3 周前
此工具无需参数。
详细介绍
appstore-play-mcp
一个用于 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_releases 和 get_reviews 中的 appId 是可选的。省略它,工具就会遍历你拥有的所有应用,呈现整个应用组合的视图。
统一两个商店的术语
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 | — | inProgress,且 userFraction < 1 |
halted | — | halted |
draft | PREPARE_FOR_SUBMISSION | draft |
每个商店自己的表述都会保留在 rawState 中,因此不会丢失任何信息。
评价也会经过同样的处理,但有一个必须如实说明的例外:两个商店对于评价来源的信息报告方式不同,因此不会共用同一个字段。
| 字段 | App Store | Google Play |
|---|---|---|
territory | ISO 国家代码(DEU、USA) | — 不公开 |
language | — 不公开 | 评价者的语言(pl、en) |
device | — 不公开 | 设备型号 |
appVersion | — 不公开 | 被评价的版本 |
如果把语言合并到国家字段中,统一后的结构看起来会更整齐,却会报告错误信息。因此,每个商店只会填入自己实际掌握的信息。
设置
已在 MCP Registry 中登记为 io.github.JohnBilousov/appstore-play-mcp,因此读取该注册表的客户端可以自行发现它。
任一应用商店都可以独立使用——配置一个、两个,或都不配置(使用 fixtures)。
App Store Connect
在 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 Play
在 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。
MCP 客户端配置
{
"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 评论按地区划分,显示可能比商店页面晚几个小时。
设计说明
两种凭据,一个接口。 AppStoreClient 和 PlayClient 都实现了 StoreClient;DemoStoreClient 则在 fixtures 上实现了该接口。工具无需区分正在与哪个应用商店交互。
一个应用商店故障不会导致整个调用失败。 读取操作会并行访问各个应用商店和应用,任何一处故障都会被收集,而不会抛出异常。如果 Play 不可用,仍会返回 App Store 评论——文本中会注明 Play 故障,并在 unavailable 中列出,让模型可以告知用户结果不完整。空列表与凭据失效绝不能表现得一样;有测试专门验证这一点。
错误信息会提供解决方法。 Play 返回 403 时会提示服务账号可能缺少访问权限,或者其项目可能未启用 Android Publisher API。返回 404 时会提示调用 list_apps。模型通常可以在无需用户介入的情况下恢复。
令牌会缓存并提前刷新。 Apple 使用 ES256(20 分钟),Google 使用 RS256 → OAuth2(1 小时),两者都会在过期前一分钟刷新,避免调用恰好遇到过期时刻。Play 端还会缓存正在进行的令牌交换:listApps() 会为每个软件包并发创建一个编辑;如果没有这一机制,每个并发调用方都会发现尚无缓存令牌,并各自创建一个令牌。
开发
git clone https://github.com/JohnBilousov/appstore-play-mcp && cd appstore-play-mcp
npm install
npm run build
npm test # tool surface + both auth clients against a mocked fetch, real key material throughout
npm run lint # eslint
npm run format # prettier --write
npm run inspect
每次推送和拉取请求都会由 CI 运行 typecheck、lint、format:check、test 和 build。
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
test/
server.test.ts tool surface, state normalisation, portfolio sweeps — over a real MCP transport
stores/
appstore.test.ts ES256 signing verified against the public key, token caching, error mapping
play.test.ts RS256/OAuth2 exchange, the transient-edit cleanup, the concurrency fix above
发布
发布使用 npm 的可信发布(OIDC)——
无需 NPM_TOKEN 密钥,也没有任何可能泄露或过期的凭据。只需在 npmjs.com 上进行一次设置:进入软件包的 Settings → Trusted publishing → GitHub Actions,填写组织 JohnBilousov、此存储库以及工作流文件名 publish.yml。
要发布新版本:同时更新 package.json、server.json 和 src/server.ts 中的 VERSION(测试会确保它们始终一致),提交并推送,然后发布带有匹配 vX.Y.Z 标签的 GitHub Release。此操作会触发 .github/workflows/publish.yml,运行测试套件并通过来源证明发布到 npm——软件包页面会显示可追溯到此确切提交和工作流运行的已验证链接,而不只是注册表上的一个名称。
路线图
- 来自 App Store Connect 的销售和下载报告(需要供应商编号)
- 来自 Play Developer Reporting API 的崩溃和 ANR 指标
- TestFlight 构建和测试者群组
- 除 stdio 外,支持 Streamable HTTP 传输
欢迎贡献——尤其欢迎同时向两个应用商店发布应用,并遇到值得在此记录的限制的开发者。
许可证
MIT © Ivan Bilousov
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。