play-console-mcp
An MCP server for safely managing Google Play Console app details, store listings, graphics, bundles, track releases, and review replies, mostly through staged Play edits.
Read app details, store listings, uploaded images, release tracks, and recent user reviews.
Stage listing text changes and upload or delete Play graphics such as icons, feature graphics, and screenshots.
Sync a local store folder from Markdown listings and image files, with dry-run by default.
Stage
.aabuploads and set or promote releases oninternal,alpha,beta, orproductiontracks.Inspect edits with
edit_summary/validate_edit, then commit or discard them.Publish developer replies to reviews immediately with
reply_to_review.Includes safeguards: production changes require
PLAY_ALLOW_PRODUCTION=1, package allowlisting, asset-root confinement, and warnings that review text is untrusted user content.
Integrates with the Google Play Console via the Google Play Android Developer API, enabling management of store listings, graphics such as icons, feature graphics, and screenshots, app bundle uploads and track releases, and user reviews including replies. Changes are staged as Play edits and can be summarized, validated, committed, or discarded.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@play-console-mcp Sync docs/store/play to Play Console and show me the edit summary"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
play-console-mcp
An MCP server for the Google Play Console: store listings, icon, feature graphic, screenshots, app bundle releases, and user reviews. It runs over stdio and works with Claude Code or any other MCP client.
It is built to be safe to hand to an AI agent:
Changes are staged, never published implicitly. Write tools put their changes in a Play edit and return its
editId. Nothing goes live untilcommit_editis called, so the agent can show youedit_summaryfirst and wait for your approval.A staged edit is never discarded by accident. Google Play keeps one open edit per app, and opening another deletes it. While an edit the server staged is open, a read or write without
edit_idis refused with that edit's id instead.commit_editchecks production tracks against a snapshot taken when the edit was created, so it never opens a second edit.Production is locked. Staging or committing a change to the
productiontrack, or to a form-factor production track such aswear:production, is refused unless the server runs withPLAY_ALLOW_PRODUCTION=1.Package allowlist. The server only touches the packages in
PLAY_PACKAGE_NAMES.Files stay inside the asset root. Graphics, bundles and listing files must resolve to files under
PLAY_ASSET_ROOT(symlinks are followed before the check), so a prompt cannot make it read or upload an arbitrary file from your machine. The server refuses an asset root that is your home directory or above it. Images are checked against Play's size rules before anything is sent.Reviews are marked untrusted. Review results carry a note telling the agent that review text is user content, not instructions.
reply_to_reviewpublishes immediately, so keep it behind a permission prompt.
Requirements
uv (installs Python 3.11+ and the dependencies on first run)
A Google Cloud service account with access to your app in Play Console
Related MCP server: play-console-mcp
Service account setup
In Google Cloud Console, pick or create a project, open APIs & Services → Library, and enable the Google Play Android Developer API.
Under IAM & Admin → Service Accounts, create a service account (no Cloud roles needed). In its Keys tab, choose Add key → JSON and download the key.
Store the key outside any repository:
mkdir -p ~/.config/play-console-mcp && mv ~/Downloads/<key>.json ~/.config/play-console-mcp/service-account.json && chmod 600 ~/.config/play-console-mcp/service-account.jsonIn Play Console → Users and permissions → Invite new users, add the service account's email. Under App permissions, add only your app and grant what you need:
View app information (read-only)
Manage store presence (listings and graphics)
Reply to reviews
Release apps to testing tracks
Leave out Release to production unless you really want the agent near production.
New permissions can take a few hours to apply; until then the API answers 403 The caller does not have permission.
The Play Developer API cannot create apps. Create the app and upload its first bundle in Play Console by hand.
Configuration
Variable | Default | Purpose |
| (required) | Comma-separated package names the server may manage; the first is the default |
|
| Path to the service account key |
| the server's working directory | Directory that uploaded and synced files must live under; refused if it is your home directory or a parent of it |
| unset | Set to |
Adding it to Claude Code
From your app's repository, so the asset root is that repository:
claude mcp add play-console --scope local -e PLAY_PACKAGE_NAMES=com.example.app -- uv run --quiet --project /path/to/play-console-mcp play-console-mcpuv run --project installs the exact dependency versions in uv.lock, so this is the most reproducible setup.
Or in the app repository's .mcp.json, pinned to a release tag:
{
"mcpServers": {
"play-console": {
"command": "uvx",
"args": ["--from", "git+https://github.com/denshinji/play-console-mcp@v0.1.1", "play-console-mcp"],
"env": { "PLAY_PACKAGE_NAMES": "com.example.app" }
}
}
}Keep the @v0.1.1 tag (or a commit hash). Without it, every start runs whatever is on main. uvx does not read uv.lock, so it resolves dependencies within the ranges in pyproject.toml; the upper bounds there stop a major release of a dependency from slipping in.
Leave commit_edit, reply_to_review, delete_edit and stage_store_dir out of your permission allowlist so each call asks you first.
What the guards do not cover
The checks above live inside this server. They stop an agent that talks to Play through these tools, and nothing else:
The key decides what is possible. Anything that can read the key file, including an agent with shell access on your machine, can call the Play API directly and skip every check here. The real limit is the permission set you grant the service account in Play Console, so leave out Release to production and admin rights, and use a separate service account from the one your CI uploads with.
Permission prompts depend on your client. In Claude Code's auto or bypass permission modes, a tool call may run without asking you. If you use those modes, add
askrules forcommit_edit,reply_to_reviewanddelete_edit(for examplemcp__play-console__commit_edit) so publishing still needs your confirmation.Data goes to your model provider. Review text, reviewer names and app contact details returned by the tools are sent to whichever model your client uses.
Syncing a store folder
stage_store_dir reads a folder (default docs/store/play) laid out like this:
docs/store/play/
listing-id.md one file per language: listing-<language>.md
listing-en-US.md
icon-512.png icon*.png → icon
feature-graphic-1024x500.png feature-graphic*.png → featureGraphic
screenshots/01-home.png screenshots/* → phoneScreenshots, in file-name orderEach listing file has one ## section per field. Headings may be English or Indonesian, and a character count in parentheses is ignored:
## App name (6/30)
Example
## Short description
One line that sells the app.
## Full description
Everything else.It runs as a dry run by default and only reports what it would change. With dry_run=false it patches every listing and replaces each graphic set in one edit, ready for commit_edit. A typical request:
Sync docs/store/play to Play Console, show me the edit summary, and wait for my go-ahead before committing.
Tools
Tool | Effect |
| Read; pass |
| Stage in an edit |
| Stage an |
| Inspect an edit before committing |
| Publish an edit ( |
| Discard an edit |
| Read reviews (Play only returns roughly the last week) |
| Publishes immediately, 350 characters max |
Development
uv run pytest -qTests use a mocked Play API and need no credentials.
License
Available Tools
17 toolscommit_editADestructive
Publishes an edit's staged changes to Google Play. Only call this after the user has seen edit_summary and approved.
send_for_review=False saves the changes without sending them for review.
Inputs: edit_id (required), package_name, send_for_review.
delete_editBDestructive
Discards an edit and everything staged in it.
Inputs: edit_id (required), package_name.
delete_imagesBDestructive
Stages deleting one image by id, or every image of the type when image_id is omitted.
Inputs: language (required), image_type (required), edit_id, image_id, +1 more.
edit_summaryCRead-only
What an edit would publish: listings, graphic counts per language, and tracks.
Inputs: edit_id (required), package_name.
get_app_detailsBRead-only
App details: default language and contact email, phone and website.
Pass edit_id to read the staged state of an edit instead of the live one.
Inputs: edit_id, package_name.
get_reviewBRead-only
One review by id, with the developer reply if there is one.
Inputs: review_id (required), package_name, translation_language.
list_imagesCRead-only
Uploaded graphics of one type (icon, featureGraphic, phoneScreenshots, ...) for a language.
Inputs: language (required), image_type (required), edit_id, package_name.
list_listingsCRead-only
Store listings (title, short and full description, video) for every language.
Inputs: edit_id, package_name.
list_reviewsBRead-only
Recent user reviews with text (Play only returns about the last week).
translation_language (e.g. "id") asks Play to translate reviews into it.
Inputs: page_token, max_results, package_name, translation_language.
list_tracksCRead-only
Release tracks with their releases, version codes, status and rollout fraction.
Inputs: edit_id, package_name.
reply_to_reviewADestructive
Publishes a public developer reply (max 350 characters), replacing any earlier reply. This is live at once; confirm the text with the user first.
Inputs: review_id (required), reply_text (required), package_name.
set_track_releaseB
Stages a release of already-uploaded version codes on a track, replacing the track's current releases. Use it to promote a build or change a rollout.
Inputs: track (required), version_codes (required), status, edit_id, +4 more.
stage_store_dirADestructive
Syncs a store folder: listing-.md files, icon*.png, feature-graphic*.png and screenshots/ (as phone screenshots, in file-name order).
dry_run=True (the default) only reports what would change. With dry_run=False the listings are patched and each graphic set is replaced in one edit. Graphics go to image_language, by default the first listing's.
Inputs: dry_run, edit_id, store_dir, package_name, +2 more.
update_listingA
Stages a change to one language's store listing; omitted fields are kept.
language is a Play code such as "id" or "en-US". Limits: title 30, short description 80, full description 4000 characters.
Inputs: language (required), title, video, edit_id, +3 more.
upload_bundleB
Stages an .aab upload and a release of it on a track (internal draft by default).
release_notes maps language to text, e.g. {"id": "...", "en-US": "..."}, 500 characters each. user_fraction (0-1) is required for inProgress.
Inputs: path (required), track, status, edit_id, +4 more.
upload_imagesADestructive
Stages uploads of local PNG/JPEG graphics, checked against Play's size rules first.
Screenshots upload in the order given (up to 8). replace=True removes the existing images of this type first; icon, featureGraphic and tvBanner always replace the current image.
Inputs: paths (required), language (required), image_type (required), edit_id, +2 more.
validate_editBRead-only
Asks Play to check an edit without committing it.
Inputs: edit_id (required), package_name.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 17 tools
Most tools target clearly distinct resources and actions, and the edit lifecycle tools are well separated. Minor overlap exists between stage_store_dir and the lower-level listing/image tools, and between upload_bundle and set_track_release, though the descriptions clarify the intended boundaries.
Almost all tools use consistent snake_case verb_noun naming. The main deviation is edit_summary, which is a noun phrase rather than a verb-led operation name.
The 17 tools cover several distinct Google Play Console areas and each appears to earn its place. The total is slightly above the typical well-scoped range but remains reasonable for publishing, graphics, tracks, reviews, and edit management.
The surface covers the core publishing workflow: app details, listings, images, tracks, edit validation/commit, and review replies. There are minor gaps such as no explicit create_edit or update_app_details tool, but these are workable within the described flow.
Maintenance
Related MCP Connectors
AI-agent operations for App Store Connect and Google Play, with approval before live publishing.
AI-agent operations for App Store Connect and Google Play, with approval before live publishing.
Ship a new Android app from chat. AI runs Google Play Console listings, screenshots, releases, uplo…
App Store Connect operator for AI agents: icons, TestFlight builds, listings, IAP, rejection fixes.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to automate Android release workflows via the Google Play Android Publisher API, including deploying builds, managing listings, and replying to reviews.40MIT
- AlicenseAqualityBmaintenanceEnables AI agents to manage Google Play Console reviews and Android app releases, including replying to reviews, promoting releases, managing staged rollouts, and checking crash/ANR vitals.4460 npm2MIT
- FlicenseBqualityCmaintenanceEnables AI agents to manage Google Play apps with scope-based permissions, including publishing internal releases, updating listings, replying to reviews, and promoting to production.118 npm-
- AlicenseNot gradedqualityCmaintenanceEnables autonomous AI agents and developers to programmatically manage Google Play apps via the Play Developer API v3, including uploading Android App Bundles, managing release tracks, updating store listings, and replying to user reviews.3MIT