关于 App Store and Google Play
App Store and Google Play MCP 服务面向应用开发者,用于读取和回复商店评论,并查看 TestFlight 测试反馈与崩溃日志。它通过 App Store Connect 和 Google Play Developer API 工作,公开回复由开发者批准后发布。
主要功能
- 01读取 App Store 和 Play 评论
- 02按条件筛选并查看回复状态
- 03查看 TestFlight 截图与崩溃反馈
- 04保存崩溃日志
- 05发布评论回复
适用场景
- 01汇总近期版本的用户评价
- 02筛选尚未回复的评论
- 03查看指定 TestFlight 构建的崩溃
- 04审核草拟回复后发布
MCP 相关
向 MCP 客户端提供商店评论、TestFlight 反馈和崩溃日志读取工具,以及发布评论回复的写入工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @foreverworks/mcp-app-storesASC_KEY_ID密钥For the App Store: the App Store Connect API key's id (10 characters).ASC_ISSUER_IDFor the App Store: the issuer id App Store Connect shows above your team keys.ASC_PRIVATE_KEY_FILE密钥For the App Store: path of the .p8 key file App Store Connect let you download.PLAY_SERVICE_ACCOUNT_FILEFor Google Play: path of the service account's JSON key.PLAY_PACKAGESFor Google Play: the package names to answer for, comma-separated, e.g. com.example.app.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
7收录的工具列表 · 更新于 2 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| submission | string | 是 | 崩溃反馈的 ID,取自 list_testflight_feedback。 |
详细介绍
App Store 和 Google Play MCP 服务
在 AI 助手中阅读并回复应用的 App Store 和 Google Play 评论,还能查看 TestFlight 测试人员发送的内容:截图反馈,以及附有日志的崩溃报告。它通过
App Store Connect 和
Google Play Developer API运行。
两个工具会发布回复:reply_app_store_review 和 reply_play_review 会以开发者的名义发布回复,所有人都能看到,因此只发送你已批准的内容。这里不会涉及资金交易。
你需要为所用的商店准备凭据,只使用一个商店也可以:对于
App Store,需要 App Store Connect API 密钥(其 .p8 文件、密钥 ID 和发行者
ID);对于 Google Play,需要一个拥有 JSON 密钥的 Google Cloud 服务账号,并在 Play Console 中获邀访问你的应用。Google 的 API 只会返回最近七天的评论。
你可以提出的问题
- “大家对上次发布的版本有什么评价?哪些 App Store 评论还没有回复?”
- “显示 com.example.app 本周的 Google Play 评论,翻译成英语,并按评分从低到高排列。”
- “TestFlight 测试人员在构建版本 42 中遇到了哪些崩溃?”
- “为来自德国且提到登录的 App Store 评论起草回复。”然后,在你读完之后:“发送这些回复。”
安装
使用 Claude Code:
claude mcp add app-stores -- npx -y @foreverworks/mcp-app-stores
Claude Desktop(Settings、Developer、Edit Config)和大多数其他客户端都以 JSON 格式读取相同的命令:
{
"mcpServers": {
"app-stores": {
"command": "npx",
"args": ["-y", "@foreverworks/mcp-app-stores"]
}
}
}
每种方式都会在 Node 22.19 或更高版本上运行已发布的包。添加服务时,VS Code 和 Claude Desktop bundle 会逐项询问设置;可选项可以留空。Cursor 则从环境变量读取各项设置(如 ${env:ASC_KEY_ID}),因此请在启动 Cursor 前设置好这些变量。所有设置都是可选的;配置说明了哪些工具需要哪些设置。
从克隆版本安装
git clone https://github.com/foreverworks/mcps.git && cd mcps
npm ci && npm run build
claude mcp add app-stores -- node "$PWD/servers/app-stores/dist/index.js"
在 JSON 配置中,命令为 node,其唯一参数是 servers/app-stores/dist/index.js 的完整路径。若要让多个客户端通过 HTTP 共用一个运行中的实例,请参阅 docs/deploying.md。
上面的命令未配置任何商店。请添加你所用商店对应的变量:
claude mcp add app-stores \
-e ASC_KEY_ID=ABCDE12345 -e ASC_ISSUER_ID="<issuer id>" -e ASC_PRIVATE_KEY_FILE="<path to AuthKey.p8>" \
-e PLAY_SERVICE_ACCOUNT_FILE="<path to service account JSON>" -e PLAY_PACKAGES=com.example.app \
-- npx -y @foreverworks/mcp-app-stores
配置
| 变量 | 必填 | 含义 |
|---|---|---|
ASC_KEY_ID | 适用于 App Store | App Store Connect API 密钥的 ID(10 个字母和数字)。 |
ASC_ISSUER_ID | 适用于 App Store | App Store Connect 显示在团队密钥上方的发行者 ID(UUID)。 |
ASC_PRIVATE_KEY_FILE | 适用于 App Store | App Store Connect 允许下载一次的 .p8 文件。 |
ASC_PRIVATE_KEY | 否 | 密钥文本本身,可在本地 stdio 运行时替代文件。 |
PLAY_SERVICE_ACCOUNT_FILE | 适用于 Google Play | Google Cloud 下载的服务账号 JSON 密钥。 |
PLAY_SERVICE_ACCOUNT | 否 | JSON 密钥文本本身,可在本地 stdio 运行时替代文件。 |
PLAY_PACKAGES | 否 | 此服务响应的逗号分隔包名,例如 com.example.app。Google 没有可列出服务账号所关联应用的调用,因此 health 会检查这些包名;未指定包名的调用则表示唯一的包名。 |
APP_STORES_OUTBOX_DIR | 否 | 保存崩溃日志的位置。默认值:状态文件夹中的 outbox/。 |
APP_STORES_STATE_DIR | 否 | 状态文件夹;默认位置见 docs/configuration.md。 |
未配置的商店会在 health 中显示为 configured: false,其工具会返回 config。凭据会在首次需要时读取,因此服务无需凭据也能启动。所有服务共用的变量(传输方式、限制、工具可执行的操作)见 docs/configuration.md。
获取 App Store Connect API 密钥
- 在 App Store Connect 中,打开 Users and Access,然后依次打开 Integrations、App Store Connect API、Team Keys。
- 创建权限恰到好处的密钥:Customer Support 可读取并回复评论,Developer 可读取 TestFlight 反馈。
- 下载
.p8文件。App Store Connect 只会提供一次下载:请将文件保存为仅自己可读(chmod 600),并将ASC_PRIVATE_KEY_FILE指向该文件。 - 将密钥所在行的 Key ID 复制到
ASC_KEY_ID,并将列表上方显示的 Issuer ID 复制到ASC_ISSUER_ID。
团队密钥不会过期;不再使用时,请在同一页面撤销。
获取 Google Play 服务账号
- 在 Google Cloud 控制台 中,打开任意项目的 IAM and Admin、Service accounts,然后点击 Create service account。该账号无需在项目中拥有任何角色。
- 打开新建账号的 Keys,依次点击 Add key、Create new key、
JSON。将文件保存为仅自己可读(
chmod 600),并将PLAY_SERVICE_ACCOUNT_FILE指向该文件。如果贵组织禁止创建服务账号密钥(iam.disableServiceAccountKeyCreation),请在创建密钥期间解除该项目的此项政策限制。 - 在 Play Console 中,打开 Users and
permissions,点击 Invite new users,然后输入服务账号的电子邮件地址(JSON 文件中的
client_email)。为其授予应用的两项权限:View app information(读取评论)和 Reply to reviews。 - 将
PLAY_PACKAGES设置为应用的包名(多个包名用逗号分隔)。
首次运行
- 请助手运行应用商店的
health检查。对于每个商店,检查结果会说明凭据是否有效,以及密钥可访问的应用(bundle ID 和 Apple ID);对每个 Play 包,也会读取一条评论。 - 先读再写:请助手起草回复,只发送你已批准的回复。
工具
read 不会更改任何一个商店中的内容(崩溃日志会保存到服务端的发件箱);write 会在评论下发布回复。
| 工具 | 访问权限 | 功能 |
|---|---|---|
health | 读取 | 检查各商店的凭据是否有效、App Store Connect 密钥可访问的应用,以及每个 Play 软件包中是否读到一条评论。 |
list_app_store_reviews | 读取 | 按星级、店面或回复状态筛选应用的 App Store 评论,并显示你的回复及其状态。 |
list_play_reviews | 读取 | 获取过去 7 天内某个软件包的 Play 评论(Google 的限制),并显示你的回复;可选择翻译。 |
list_testflight_feedback | 读取 | 获取测试人员通过 TestFlight 发送的屏幕截图和崩溃反馈,并显示设备、OS 和构建版本。 |
get_testflight_crash_log | 读取 | 获取一条崩溃反馈的日志,将其完整保存到发件箱,并显示前 40 行。 |
reply_app_store_review / reply_play_review | 写入 | 在评论下发布回复。除非明确要求,否则不会替换已有回复;相同文本只会发送一次。 |
故障排除
config:“App Store Connect is not configured”或“Google Play is not configured”。 消息会指出缺少哪些变量。其他任何 config 消息都会指出商店未提供的值:不是 10 个字母和数字的密钥 ID、不是 UUID 的发行者 ID、不是 EC P-256 密钥的 .p8 文件,或不是服务账号密钥的 JSON 文件。
auth。 商店拒绝了凭据:密钥已撤销,或服务账号已删除。请在 App Store Connect(Users and Access、Integrations)或服务账号的 Google Cloud 项目中检查,并替换该文件。
来自 App Store 的 forbidden。 密钥缺少相应角色:查看评论需要 Customer Support;查看 TestFlight 反馈需要 Developer。
来自 Google Play 的 forbidden。 服务账号无法对该应用执行操作:在 Play Console 的 Users and permissions 中,授予其该应用的 View app information 和 Reply to reviews 权限。新受邀的账号可能需要数小时才能获得 API 访问权限。如果消息指出 Google Play Android Developer API 已停用,请在服务账号的 Google Cloud 项目中启用它。
input:“... already has a public reply”。 该评论已有不同的回复,消息中会引用该回复。只有在你确实要替换它时,才使用 replace: true 再次调用。其他 input 消息会指出问题:回复超过商店限制,或存在多个应用或软件包,需要指定其中一个。
not_found。 这些凭据无法访问该 ID 或应用:health 会列出它们可访问的应用和软件包。
回复后出现 outcome_unknown。回复发出后连接中断,因此它可能已经公开。请先重新列出该评论(其中会显示回复),再决定是否重新发送。
rate_limited。 商店正在限制这些凭据的请求;请等待一分钟。状态码为 0 的 api 表示无法连接到商店;其他状态码表示请求失败:请稍后重试。drift 表示商店的响应格式发生变化:请连同消息一起报告。
工作原理
- Apple 没有令牌端点。 App Store Connect 直接将 JSON Web Token 用作 bearer:服务端使用
.p8密钥(ES256)为其签名,将有效期设为 Apple 允许的 20 分钟中的 19 分钟,并将其保存在内存中。Google 则会在oauth2.googleapis.com使用服务账号密钥签名的断言(RS256、RFC 7523)换取有效期为 1 小时的令牌。如果密钥文件指定了其他令牌端点,则会被拒绝,因此断言不会发送到其他地方。 - 回复会公开显示,因此处理时很谨慎。 两家商店都会静默替换已有回复,因此服务端会先读取评论:除非
replace为 true,否则如果已有回复不同,就会拒绝替换;如果文本相同,则不会发送任何内容。 Apple 会将新回复设为pending,直到 Apple 自行审核并发布,通常会在一天内完成。 - 限制由商店决定。 Apple 的回复最多为 5,970 个字符,Google 则约为 350 个字符;发送前会进行检查。Google 的 API 仅返回带有文本、且在过去 7 天内撰写或修改的评论;完整历史记录可在 Play Console 的月度评论报告中查看(下载报告、评论)。
- 使用模型,而非中继。 数据结构来自 Apple 的 OpenAPI 规范 4.5.1 和 Google 的
androidpublisherv3 参考文档;如果缺少文档中列出的字段,则会以drift错误失败,而不会将其作为空值继续传递。 - 崩溃日志会保存到发件箱,因为日志可能有数十到数百行。返回日志的前 40 行及文件路径和 SHA-256,其中包含异常信息和崩溃线程信息,且支持 Apple 的两种格式。
npx tsx scripts/smoke.ts 会使用你的凭据以只读方式调用已构建的服务:检查 health,获取每个已配置商店的 3 条评论,以及 3 条 TestFlight 反馈。它绝不会回复评论。
限制
- 评论仅限 API 窗口范围内的数据:App Store 返回完整历史记录,Google 返回过去 7 天的数据。
- 不支持 Play 崩溃报告(Android vitals 使用不同的 API,即 Play Developer Reporting API),不提供评论摘要,也不能删除回复。
- TestFlight 截图是会过期的链接(
expiresAt);服务端不会下载这些截图。 - TestFlight 反馈中的版本以构建编号标识;营销版本号可在 App Store Connect 中查看。
其他 App Store Connect 和 Google Play 服务
搜索日期:2026-10-22。Apple 和 Google 均未发布此类服务。
- Expo 托管的 MCP 服务涵盖了所有这些功能(App Store 和 Play 评论及回复、TestFlight 反馈和崩溃、Play 崩溃),但它运行在 Expo 一侧,需要通过个人浏览器登录;而且回复会直接替换已有回复,不会事先询问。
社区服务各自通过 stdio 涵盖部分功能:
asc-mcp(Swift,仅限 macOS):App Store 评论、回复,以及带崩溃日志的 TestFlight 反馈。- Heimdall(
erayendes/app-store-connect-mcp):完整的 App Store Connect API。 app-publish-mcp:两家商店的评论和回复,不支持 TestFlight 反馈。google-play-developer-mcp和google-play-console-cli:Play 评论和回复。antoniolg/play-store-mcp和shipstores用于发布,而非评论;JoshuaRileyDev/app-store-connect-mcp-server已归档。
这个服务实现了其他服务都未能集中实现的功能:通过一个运行在 Linux 上、将密钥保存在文件中的服务,同时支持两家商店和 TestFlight;如果回复会替换公开回复,则拒绝发送;重复提交时只发送一次;每条回复都会注明 Google 的 7 天窗口;保存带校验和的崩溃日志;并按商店类型返回错误,说明需要在相应控制台中更改什么。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。