play-console-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PLAY_MCP_KEY | No | The service-account key JSON inline (for secret managers). | |
| PLAY_MCP_PACKAGE | No | Default package name; every tool also accepts package_name. | |
| PLAY_MCP_KEY_PATH | No | Path to the service-account JSON key (preferred). | |
| PLAY_MCP_FILE_ROOT | No | If set, upload tools only read files under this directory. Symlinks are resolved first, so they can't escape it. | |
| PLAY_MCP_READ_ONLY | No | Set to 1 to register only read tools. The client never sees a write tool. | |
| PLAY_MCP_IMPERSONATE | No | Service-account email for keyless mode. When set, it wins over the key variables. | |
| PLAY_MCP_ALLOW_DESTRUCTIVE | No | Set to 1 to register the destructive tools (delete images or listings) and allow replacing a whole tester list. | |
| GOOGLE_APPLICATION_CREDENTIALS | No | Fallback key path. In keyless mode, the path of the gcloud ADC file (default: gcloud's own location). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_tracksB | Lists the app's tracks and how many releases each has. |
| get_trackA | Returns one track with its full release objects, as Google reports them. |
| list_releasesA | Lists releases on one track, or on every track when no track is given. |
| release_statusA | One call, every track: each release's version codes, status, rollout percentage and halted flag, plus the highest version code per track. |
| create_releaseA | Creates a release of already-uploaded version codes on a track. Keeps the track's other releases that must stay (e.g. the completed release during a staged rollout). Production requires confirm_production: true, otherwise this is a dry run. |
| deployA | Uploads an .aab, optionally its mapping.txt, and creates the release with notes — all in ONE edit, so a failure at any step leaves nothing half-done. With validate_only (or on production without confirm_production) the bundle is uploaded into a throwaway edit, validated and discarded. |
| promote_releaseA | Copies a release from one track to another (e.g. internal → production). The destination's other releases that must stay are kept, not replaced. Promoting into production requires confirm_production: true, otherwise this is a dry run. |
| update_rolloutA | Changes the percentage of a staged (inProgress) rollout, or completes it to 100% with complete: true. On production this requires confirm_production: true, otherwise it is a dry run. |
| halt_rolloutA | Halts a staged rollout: no new users get the release (existing installs keep it). On production this requires confirm_production: true, otherwise it is a dry run. |
| resume_rolloutA | Resumes a halted rollout at the percentage you give (required — the previous percentage is not assumed). On production this requires confirm_production: true, otherwise it is a dry run. |
| list_bundlesB | Lists the app bundles (AABs) uploaded for the app, with version codes and hashes. |
| upload_bundleA | Uploads an Android App Bundle (.aab) to the app's bundle library without assigning it to a track. Files over 10 MB use a resumable upload. Use |
| upload_deobfuscation_fileA | Uploads a ProGuard/R8 mapping.txt for a version code, so crash stack traces are readable. |
| upload_internal_sharingA | Uploads an .aab or .apk to internal app sharing and returns a download link for testers. Bypasses tracks and review; links are for testing only. |
| crash_rateA | Daily crash rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%). |
| anr_rateA | Daily anr rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%). |
| slow_start_rateA | Daily slow start rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%). |
| slow_rendering_rateA | Daily slow rendering rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%). |
| excessive_wakeup_rateA | Daily excessive wakeup rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%). |
| stuck_wakelock_rateA | Daily stuck background wakelock rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%). |
| vitals_summaryA | All six vitals at once: the latest 28-day user-weighted value of each, flagged against Google's bad-behaviour thresholds (user-perceived crash rate 1.09%, user-perceived ANR rate 0.47%). |
| vitals_by_versionA | Compares vitals across version codes over a window (weighted by daily users), newest first, with the change versus the previous version — to see whether the last release made things worse. |
| search_error_issuesC | Searches grouped crash/ANR issues (Reporting API errorIssues:search). |
| search_error_reportsB | Searches individual crash/ANR reports with stack traces (Reporting API errorReports:search). |
| list_anomaliesC | Lists anomalies Google detected in the app's vitals metrics. |
| vitals_freshnessB | For each vitals metric set, the latest date (and hour) for which data is available. |
| list_reviewsA | Lists recent reviews, filterable by star rating, language and unanswered-only. The Play API only returns reviews created or edited in about the last week; older reviews are visible only in Play Console. |
| get_reviewB | Returns one review with any developer reply. |
| reply_to_reviewA | Posts a PUBLIC developer reply to a review (replacing any earlier reply). Max 350 characters. Use dry_run to preview without posting. |
| list_listingsA | Lists the store listing (title, descriptions) for every language. |
| get_listingB | Returns the store listing for one language. |
| get_app_detailsB | Returns the app's default language and contact email, phone and website. |
| list_imagesC | Lists the images of one type (screenshots, icon, feature graphic…) for a language. |
| update_listingA | Updates the store listing for one language. Only the fields you pass change. Limits: title 30, short description 80, full description 4000 characters. |
| update_app_detailsB | Updates the app's default language and/or contact email, phone and website. |
| upload_imageB | Uploads one listing image (PNG or JPEG, max 15 MB) of the given type for a language. |
| get_testersB | Returns the Google Groups of testers for a testing track. |
| update_testersA | Adds and/or removes tester Google Groups on a testing track and shows the before/after difference. Replacing the whole list (replace) is destructive and needs PLAY_MCP_ALLOW_DESTRUCTIVE=1. |
| list_appsA | Lists the apps this service account can see, according to its Play permissions (Play Developer Reporting API apps:search). |
| app_overviewA | "How is my app doing" in one call: release status on every track, the vitals summary against Google's thresholds, and the number of unanswered recent reviews. Each part reports its own error without failing the others. |
| check_asset_linksA | For a Trusted Web Activity: fetches https:///.well-known/assetlinks.json and compares its SHA-256 fingerprints for this package with the app-signing certificate Play reports (generatedApks). A mismatch is the classic reason a TWA shows the browser URL bar. Sends no credentials to the domain. If Play reports no signing certificate, pass |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 41 tools
Most tools have clearly distinct purposes: upload_internal_sharing, upload_bundle and deploy are cleanly separated by intent, and the six vitals metrics are individually identifiable. The main overlap cluster is list_tracks/get_track/list_releases/release_status, four tools that all describe track-and-release state with subtly different scopes, which could cause misselection.
The action family consistently uses verb_noun snake_case (list_releases, create_release, promote_release, update_rollout, halt_rollout, reply_to_review), and the vitals family consistently uses metric-noun names (crash_rate, anr_rate, vitals_summary). A few noun-only names like release_status and app_overview deviate from the verb_noun convention, but the pattern stays predictable overall.
41 tools is well above the well-scoped range and sits in the heavy category, even accounting for the fact that Play Console spans releases, vitals, reviews, listings, images and testers. Some consolidation is plausible (e.g. merging track/release listing tools, or wrapping per-metric vitals tools behind a parameterised call).
Coverage is unusually thorough across release/rollout lifecycle, bundle uploads, vitals and error reporting, reviews, listings, images, testers and app details, with sensible dry-run/confirm semantics. Remaining gaps are adjacent domains rather than dead ends: no monetization (in-app products/subscriptions), no release deletion or rollback, and no way to create or manage tracks themselves.