Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Run an app portfolio across Google Play and the App Store: vitals, reviews, earnings, releases.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
STOREPILOT_GOOGLE_CREDENTIALS, STOREPILOT_GOOGLE_REPORTS_BUCKET, STOREPILOT_ASC_KEY_PATH, STOREPILOT_ASC_KEY_ID, STOREPILOT_ASC_ISSUER_ID, STOREPILOT_ASC_VENDOR_NUMBER标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"storepilot": {
"command": "uvx",
"args": [
"storepilot"
],
"env": {
"STOREPILOT_GOOGLE_CREDENTIALS": "your-value",
"STOREPILOT_GOOGLE_REPORTS_BUCKET": "your-value",
"STOREPILOT_ASC_KEY_PATH": "your-value",
"STOREPILOT_ASC_KEY_ID": "your-value",
"STOREPILOT_ASC_ISSUER_ID": "your-value",
"STOREPILOT_ASC_VENDOR_NUMBER": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add storepilot --env STOREPILOT_GOOGLE_CREDENTIALS=your-value --env STOREPILOT_GOOGLE_REPORTS_BUCKET=your-value --env STOREPILOT_ASC_KEY_PATH=your-value --env STOREPILOT_ASC_KEY_ID=your-value --env STOREPILOT_ASC_ISSUER_ID=your-value --env STOREPILOT_ASC_VENDOR_NUMBER=your-value -- uvx storepilot运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"storepilot": {
"command": "uvx",
"args": [
"storepilot"
],
"env": {
"STOREPILOT_GOOGLE_CREDENTIALS": "your-value",
"STOREPILOT_GOOGLE_REPORTS_BUCKET": "your-value",
"STOREPILOT_ASC_KEY_PATH": "your-value",
"STOREPILOT_ASC_KEY_ID": "your-value",
"STOREPILOT_ASC_ISSUER_ID": "your-value",
"STOREPILOT_ASC_VENDOR_NUMBER": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"storepilot": {
"type": "stdio",
"command": "uvx",
"args": [
"storepilot"
],
"env": {
"STOREPILOT_GOOGLE_CREDENTIALS": "your-value",
"STOREPILOT_GOOGLE_REPORTS_BUCKET": "your-value",
"STOREPILOT_ASC_KEY_PATH": "your-value",
"STOREPILOT_ASC_KEY_ID": "your-value",
"STOREPILOT_ASC_ISSUER_ID": "your-value",
"STOREPILOT_ASC_VENDOR_NUMBER": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
STOREPILOT_GOOGLE_REPORTS_BUCKET envSTOREPILOT_ASC_KEY_ID envSTOREPILOT_ASC_ISSUER_ID envSTOREPILOT_ASC_VENDOR_NUMBER env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 sonlenef 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:STOREPILOT_GOOGLE_CREDENTIALS, STOREPILOT_ASC_KEY_PATH
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.1.1)于3个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv)。
同一分类中有:Spec Driven Development, Remote Desktop Commander, FlyDocs
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Spec-driven development workflow: your agent works issues, sessions and the status lifecycle.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
One MCP server for a whole app portfolio, across Google Play and the App Store.
Ask your assistant:
"Which of my apps has a crash rate above Google's threshold?"
"How much did the portfolio earn last month, per app?"
"Show me every app on both stores: version, rating, installs, revenue, crashes."
"The German description drifted between the two stores — what's different?"
"Ship 3.2.1 to the Play internal track and TestFlight."
Each question above is one tool call covering every app you own, because the tools are portfolio-shaped rather than endpoint-shaped. The last one is two, on purpose: writes preview first and wait for a human.
You need your own developer accounts — a Google Play service account, an App Store Connect API key, or both. StorePilot reads your accounts; it does not scrape public store listings.
Status: early. The read tools have run against real accounts on both
stores; the money and crash-threshold paths have not returned real data yet,
and no write has ever executed against a store. Read
Status and honest limits before trusting a number.
Both stores, one tool set. Google Play via the Android Publisher API, the Play Developer Reporting API and the private Cloud Storage reports bucket; the App Store via App Store Connect. 34 tools total, named consistently.
Installs and earnings, which most tooling cannot reach. Play installs, ratings and earnings have no REST API. They exist only as UTF-16 CSVs in a private Cloud Storage bucket, so most tooling skips them and "how much did this app earn?" simply cannot be answered. StorePilot reads that bucket, resolves CSV columns by name rather than position, and reports earnings per currency without ever summing across currencies. (This path is implemented and fixture-tested but has not yet read a real report — see Status.)
Portfolio-first. portfolio_overview renders every app on both stores in one table. play_portfolio_health scans an entire Play account. Neither takes a package name. Built for indie devs, app factories and agencies.
Cross-store tools. parity_check finds listing and version drift between the two stores. compare_reviews puts both stores' reviews side by side. release_both ships one version to both. metadata_pull / metadata_push use fastlane's own directory layout, so adopting StorePilot never means abandoning fastlane.
Writes are gated. Every write previews first and returns a confirmation token that is HMAC-keyed to the exact operation, single-use, and expires in 10 minutes. Production releases are forced into a staged rollout capped at 20%.
`setup_doctor`. Credential setup here is a multi-step Google Cloud + Play Console + App Store Connect maze with several silent failure modes. One tool checks every step and prints the exact fix.
Requires Python 3.11+.
uvx storepilot # no install; uv fetches it per run
or install it:
pipx install storepilot # or: pip install storepilot
Either way you get a storepilot binary. Every client config below wants its absolute path — which storepilot prints it.
claude mcp add storepilot -- storepilot
claude_desktop_config.json:
{
"mcpServers": { "storepilot": { "command": "/absolute/path/to/storepilot", "env": { "STOREPILOT_GOOGLE_CREDENTIALS": "/path/to/service-account.json", "STOREPILOT_GOOGLE_REPORTS_BUCKET": "pubsite_prod_rev_0123456789", "STOREPILOT_ASC_KEY_PATH": "/path/to/AuthKey_XXXXXXXXXX.p8", "STOREPILOT_ASC_KEY_ID": "XXXXXXXXXX", "STOREPILOT_ASC_ISSUER_ID": "00000000-0000-0000-0000-000000000000", "STOREPILOT_ASC_VENDOR_NUMBER": "80000000" } } } }
Settings → MCP → Add new MCP server, or add to ~/.cursor/mcp.json:
{
"mcpServers": { "storepilot": { "command": "/absolute/path/to/storepilot", "env": { "STOREPILOT_ASC_KEY_PATH": "/path/to/AuthKey_XXXXXXXXXX.p8" } } } }
Add to ~/.codex/config.toml:
[mcp_servers.storepilot]
command = "/absolute/path/to/storepilot" env = { STOREPILOT_ASC_KEY_PATH = "/path/to/AuthKey_XXXXXXXXXX.p8" }
Configure only the store you use. Each adapter registers its tools independently, and the cross-store tools register as soon as either store is configured. See .env.example for every variable the code reads.
A .env file also works, but it is read from the process working directory — which is whatever directory your MCP client happened to launch the server from, not the repo. Use it when you run storepilot yourself from the checkout; use the client's env block otherwise.
Credentials are read from the environment and never written anywhere by StorePilot. Keep the service account JSON and the .p8 outside the repo, and chmod 600 both — they are private keys.
Do not start by calling a data tool and guessing why it returned nothing. Ask your assistant to run setup_doctor first. It checks each credential step independently, so one failure never hides the rest, and every failure carries its own fix.
With nothing configured yet:
StorePilot setup check
============================================================
-- Google Play ---------------------------------------------- [skip] Google Play: not configured Fix: Set STOREPILOT_GOOGLE_CREDENTIALS to the path of a service account JSON key. Full setup: create a Google Cloud project, enable the Android Publisher and Play Developer Reporting APIs, create a service account, download its JSON key, then invite the service account email in Play Console -> Users and permissions. Docs: https://developers.google.com/android-publisher/getting_started
-- App Store Connect ---------------------------------------- [fail] ASC credentials: App Store Connect is not configured: STOREPILOT_ASC_KEY_PATH, STOREPILOT_ASC_KEY_ID, STOREPILOT_ASC_ISSUER_ID unset. Fix: In App Store Connect go to Users and Access -> Integrations -> App Store Connect API, create a team key with the Admin or App Manager role, and download the .p8 file (Apple lets you download it exactly once). Then set STOREPILOT_ASC_KEY_PATH to that file, STOREPILOT_ASC_KEY_ID to the Key ID column, and STOREPILOT_ASC_ISSUER_ID to the Issuer ID shown above the key table. Sales reports additionally need STOREPILOT_ASC_VENDOR_NUMBER from Payments and Financial Reports. Docs: https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api [skip] ASC token: cannot test until the credentials load Fix: Fix the step above, then re-run setup_doctor. [skip] ASC API reachable: cannot test until the credentials load Fix: Fix the step above, then re-run setup_doctor. [skip] ASC sales access: cannot test until the credentials load Fix: Fix the step above, then re-run setup_doctor.
============================================================ Summary: 1 fail, 4 skip Resolve the [fail] items above, then run setup_doctor again.
It also catches the failure that looks like success: without the Reply to reviews permission, Play's reviews API returns HTTP 200 and an empty list rather than an error, so "this app has no reviews" and "you lack a permission" are the same response. setup_doctor reports that ambiguity as its own diagnosis instead of guessing.
Full walkthrough for both stores: [docs/SETUP.md](docs/SETUP.md).
34 tools. Full arguments, return shapes and per-tool limitations in [docs/TOOLS.md](docs/TOOLS.md).
| Tool | What it answers |
|---|---|
play_list_apps | Which packages can this install reach? |
play_get_vitals | Crash and ANR (Application Not Responding) rates vs Google's 1.09% / 0.47% thresholds |
play_get_anomalies | What did Google's own anomaly detection flag? |
play_get_stats | Installs and ratings for a month (GCS bucket) |
play_get_earnings | Earnings for a month, per currency (GCS bucket) |
play_list_reviews | Recent production reviews, filterable by star rating |
play_portfolio_health | Vitals + rating + installs for every app, one table |
| Tool | What it does |
|---|---|
play_upload_bundle | Upload an .aab and release it on a track |
play_create_release | Release already-uploaded version codes |
play_promote_release | Move a build between tracks (beta → production) |
play_expand_rollout | Widen a staged rollout — the only path to 100% |
play_halt_rollout | Stop a rollout immediately, no confirmation step |
play_reply_review | Publish a public developer reply |
play_update_listing | Overwrite listing copy for one locale |
| Tool | What it does |
|---|---|
asc_list_apps | Apps visible to the key, with Apple IDs |
asc_list_builds | TestFlight builds and their three review states |
asc_list_reviews | Customer reviews, filterable, full history |
asc_list_versions | Versions, review state, phased-release day |
asc_get_sales | Sales and proceeds, cached hard |
asc_get_analytics | App Analytics via Apple's async reports chain |
asc_upload_build | Returns Transporter instructions — no API can upload |
asc_reply_review | Public developer response (gated) |
asc_update_metadata | Listing copy on the editable version (gated) |
asc_submit_for_review | Submit to App Review after a precheck (gated) |
| Tool | What it does |
|---|---|
portfolio_overview | Every app on both stores in one table |
compare_reviews | Both stores' reviews for one app, side by side |
parity_check | Version and listing drift between the stores |
release_both | One version to Play and TestFlight, one token (gated) |
metadata_pull | Store copy → fastlane-layout local tree |
metadata_push | Local tree → both stores (gated) |
list_app_pairs | Show the pairing registry |
suggest_app_pairs | Propose pairings from bundle-id and name evidence |
pair_apps | Write one pairing into the registry |
Plus setup_doctor.
Nothing in either API says a Play package and an Apple ID are the same product, so the pairing lives in ~/.storepilot/apps.toml. Run suggest_app_pairs, then pair_apps for the proposals you agree with. A proposal is inert until written — a wrong pair would attribute one app's revenue, reviews and crash rate to another, and nothing downstream would look wrong.
Every write is two calls. The first returns a preview and a token; the second carries that token back.
The preview is the actual safety mechanism: it renders into the chat, where a human can read "that is the wrong app" or "that is the production track". Play previews are not estimates — the operation runs for real inside a throwaway Play edit that is validated and then deleted, so the preview reports the version code Google actually assigned and any error Google would actually raise.
The token exists only to prevent drift between the preview and the confirmation. It is an HMAC over a canonical fingerprint of the operation, keyed with a per-install secret kept out of tool output, single-use, and valid for 10 minutes. A plain content hash would be computable by the model itself, letting it self-confirm without ever rendering the
只显示了开头部分;其余内容请在仓库中阅读