Play Store MCP
Provides tools for managing Google Play app releases, tracks, bundles, store listings, listing images, testers, and reviews through the official Google Play Developer API, including staging, validating, and committing publishing edits and replying to reviews.
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 Store MCPList the reviews for com.example.app and summarize the recurring issues."
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 Store MCP
Manage Google Play releases, store listings, testers, and reviews from your AI agent.
Quick start · What it can do · Google credentials · MCP clients · Tool reference · License
Play Store MCP is a Model Context Protocol server for the official Google Play Developer API. MCP clients launch it from the npm registry with npx; no repository checkout or global installation is needed. The server runs over stdio and uses Application Default Credentials. App bundles and listing images are read from the machine running the MCP client when you choose to upload them.
Quick start
Install Node.js 20 or newer, then configure Google credentials and grant the service account access to your app in Play Console.
Register the npm package with your MCP client. For example, with Codex:
codex mcp add play-store \ --env GOOGLE_APPLICATION_CREDENTIALS=/absolute/path/to/service-account.json \ -- npx -y play-store-developer-mcp codex mcp listnpxdownloads the package from npm and starts its MCP server. The credential value is an absolute path to a private JSON file, not the JSON contents. See Claude Code, Claude Desktop, and Codex instructions for other setups.Start with a read-only request to your agent:
List the reviews for com.example.app and summarize the recurring issues.To inspect releases, ask for
list_track_releaseson a named track. Edit-backed tools need an existingeditId.
Related MCP server: play-console-mcp
What it can do
Area | Capabilities |
Reviews | Read reviews with pagination and translation; publish developer replies. |
Releases | Inspect tracks and bundles; upload an AAB; stage, validate, and commit a track release. |
Testing | Read and replace Google Groups assigned to a testing track. |
Store presence | Read and patch localized listing text; list and upload listing images. |
Internal sharing | Upload an AAB for a shareable internal app artifact without a track release. |
Publishing uses Google's transactional app edits:
create_edit → upload_bundle → update_track → validate_edit → commit_edit
│ │
└─ list_bundles └─ get_track / list_tracksFor AAB releases, upload_bundle reads an absolute .aab path on the machine running the server. update_track replaces the track's entire release list, so include releases you want to keep. commit_edit applies every staged change in the edit, including listing and tester changes, and requires confirmPublish: true. Read tools do not create or commit edits.
Tool reference
Tool | Action |
| List app reviews with page tokens and optional translation. |
| Read one review. |
| Read up to 20 non-obsolete releases and lifecycle states for a track. |
| Read all localized store listings from an existing app edit. |
| Read one localized store listing from an edit. |
| Changes draft state: patch supplied text or video fields in one localized listing. |
| Read images for a language and image type in an edit. |
| Changes draft state: add a local PNG or JPEG to a listing in an edit. |
| Read track configuration and active releases from an existing app edit. |
| Read every track, including tracks without releases, from an edit. |
| Read app bundles and version codes from an edit. |
| Read an edit's ID and expiration time. |
| Read Google Groups assigned to a testing track in an edit. |
| Changes draft state: replace the Google Groups assigned to a testing track. |
| Publish or replace the public developer reply to a review. |
| Changes draft state: create an app edit and return its ID; can invalidate another open edit. |
| Changes draft state: upload a local |
| Changes draft state: replace a track's full release list in an edit. |
| Check an edit for publishing errors without committing it. |
| Publishes: commit all staged changes in an edit. |
| Deletes draft state: discard an edit and its uncommitted changes. |
| Uploads for sharing: upload a local |
Every tool requires an Android packageName such as com.example.app; the server does not discover apps. Track tools also require a name such as production, qa (internal testing), or wear:production (track names). Edit-backed tools require an editId returned by create_edit or an existing publishing workflow. Read tools never create or commit edits. reply_to_review publishes a public reply, so check the review and reply text before calling it.
update_testers replaces the full googleGroups array; pass [] to remove all groups. The testers API does not manage individual email lists. patch_store_listing accepts at least one of title, shortDescription, fullDescription, or a YouTube video URL. For images, choose one of phoneScreenshots, sevenInchScreenshots, tenInchScreenshots, tvScreenshots, wearScreenshots, icon, featureGraphic, or tvBanner (image types). upload_listing_image reads an absolute local PNG or JPEG path and adds an image; it does not replace existing images. A store listing must exist for the selected language when listing its images. All draft changes take effect only after commit_edit; committing also applies any other staged changes in that edit.
Configure Google credentials
You need a Play Console developer account with the target app, a Google Cloud project, and Node.js 20 or newer. The server uses Application Default Credentials (ADC) with the https://www.googleapis.com/auth/androidpublisher OAuth scope. Google no longer requires linking the Play developer account to the Cloud project. Follow these steps to configure a service account for your MCP client. Google Play API setup
Select or create a Google Cloud project. In that project, open Google Play Developer API and select Enable. If you cannot enable it, ask a project administrator for Service Usage Admin (
roles/serviceusage.serviceUsageAdmin) or an equivalent custom role. This role is for the person enabling the API, not for the MCP service account. Cloud role requirementsCreate a service account. In the same project, open IAM & Admin → Service Accounts, select Create service account, and save its email address (for example,
play-mcp@example-project.iam.gserviceaccount.com). You can leave Grant this service account access to project empty for this MCP: app access is granted in Play Console in the next step. If you cannot create the account, the setup operator needs Create Service Accounts (roles/iam.serviceAccountCreator) or equivalent permission. Cloud service account setupInvite that email to Play Console. In Play Console → Users and permissions, select Invite new users, enter the service account email, choose App permissions, and grant access only to the app this MCP will manage. Select the permissions below, then select Invite user. These are Play Console permissions, not Cloud IAM roles. Google's Play permission definitions
Tools
Play Console app permission
list_reviews,get_review,list_store_listings,get_store_listing,list_listing_images,get_track,list_tracks,list_bundles,get_edit,get_testersView app information (read-only); test read access with the selected app.
list_track_releasesView app quality information (read-only) covers basic track and release information; View app information (read-only) is also appropriate if you use the other read tools.
reply_to_reviewView app information (read-only) plus Reply to reviews.
create_edit,upload_bundle,update_track,validate_edit,commit_edit,discard_editRelease apps to testing tracks for test-track releases; Release to production, exclude devices, and use Play App Signing for production releases.
upload_internal_sharing_bundleRelease apps to testing tracks, which includes internal app sharing upload access.
update_testersManage testing tracks and edit tester lists.
patch_store_listing,upload_listing_imageManage store presence.
These are the Play Console categories that match the actions each tool performs. Google does not publish a per-method permission matrix for these endpoints, so verify your selected permissions against a test app. Grant production release permission only if this service account will publish to production. Play Console permission definitions
Provide local ADC. For a desktop MCP client, the straightforward option is a service account JSON key: open the service account's Keys tab, select Add key → Create new key → JSON, and store the downloaded file outside this repository in a private location. If key creation is blocked by organization policy, use an approved ADC method instead. The setup operator may need Service Account Key Admin (
roles/iam.serviceAccountKeyAdmin) to create the key; that role should not be granted to the service account itself. Key creation and restrictionsOn macOS or Linux, restrict access to the downloaded file:
chmod 600 /absolute/path/to/service-account.jsonSet
GOOGLE_APPLICATION_CREDENTIALSin the MCP client configuration to that absolute file path, as shown below. The variable contains a path, never the JSON contents. ADC can also use credentials supplied by the host environment without this variable. ADC credential lookup
Connect your MCP client
Replace /absolute/path/to/service-account.json below with the path on your machine. The JSON file stays private; only its path belongs in the MCP configuration. The examples use npx -y play-store-developer-mcp, which runs the package from npm. If a desktop app cannot find npx, use the absolute path shown by command -v npx. Keep GOOGLE_APPLICATION_CREDENTIALS in the process that launches the MCP server; setting it in an unrelated terminal will not configure a desktop client.
Claude Code
claude mcp add play-store \
--env GOOGLE_APPLICATION_CREDENTIALS=/absolute/path/to/service-account.json \
-- npx -y play-store-developer-mcp
claude mcp listRun /mcp inside Claude Code to check the connection. Claude Code stores this server for the current project by default. Add --scope user before play-store if you want it in all Claude Code projects. See Claude Code MCP setup.
Claude Desktop
Add the play-store entry to the existing mcpServers object in ~/Library/Application Support/Claude/claude_desktop_config.json on macOS:
{
"mcpServers": {
"play-store": {
"command": "npx",
"args": ["-y", "play-store-developer-mcp"],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "/absolute/path/to/service-account.json"
}
}
}
}Preserve any other servers already in the file, then fully quit and reopen Claude Desktop. Check the server and its tools under Connectors or Extensions. See Claude Desktop local MCP setup.
Codex CLI or app
codex mcp add play-store \
--env GOOGLE_APPLICATION_CREDENTIALS=/absolute/path/to/service-account.json \
-- npx -y play-store-developer-mcp
codex mcp listCodex shares MCP configuration between its CLI and IDE extension. In the Codex terminal UI, use /mcp to inspect the server. See the official OpenAI Docs for Codex MCP.
License
Play Store MCP is licensed under the MIT License. Third-party dependencies retain their own licenses and copyright notices.
Available Tools
22 toolscommit_editCommit and publish a Google Play app editADestructive
MUTATES live Play Console state: commits every staged change in the edit, potentially publishing a release. Requires confirmPublish=true. Fails if changes are already in review instead of cancelling that review.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| packageName | Yes | ||
| confirmPublish | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the description is not the only safety signal. It still adds genuine context beyond them: the action affects live Play Console state, may publish a release, and fails when changes are already in review. It omits what a successful response contains, but no output schema exists to cover that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the destructive nature front-loaded in the first clause so an agent cannot miss it. No filler or repetition of annotation text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema destructive mutation, the description covers danger, precondition, and the main failure mode. The remaining gap — meaning of editId/packageName — is real but minor for an agent already working within an edit lifecycle.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning and only partly does. It explains confirmPublish as an affirmative publish confirmation, but editId and packageName carry no explanation in either the schema or the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource — commits every staged change in an edit, which can publish a release. That distinguishes it from read-only siblings like get_edit or validate_edit, though it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a hard precondition (confirmPublish=true) and a failure condition (changes already in review rather than cancelled), which is real usage guidance. It does not say when an agent should prefer validate_edit or discard_edit, so routing to siblings is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_editCreate a Google Play app editADestructive
MUTATES Play Console draft state: creates a new app edit and returns its id. Creating an edit can invalidate another open edit for this app; it does not publish changes.
| Name | Required | Description | Default |
|---|---|---|---|
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, and the description still adds real value by spelling out the consequence (invalidating another open edit for this app) and by clarifying that nothing is published. It does not cover edit lifetime/expiry or required auth scopes, which matter for a draft-state mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, mutation warning front-loaded in caps, return value and non-effect both stated. Nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states it returns the edit id, and it covers the safety and concurrency implications of a destructiveHint tool. Only the edit lifecycle (expiry, one-open-edit-per-app rules beyond the warning) is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter at 0% schema description coverage, and the description says nothing about packageName beyond implying it identifies the app. The name plus the schema regex make the value inferable, so this is a passable but uncompensated gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (creates) and resource (a new app edit) and adds the return value (its id), which separates it from get_edit. It never names the sibling alternatives (commit_edit, discard_edit) explicitly, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"it does not publish changes" scopes the tool away from commit_edit and the draft-state framing tells the agent this is the entry point for an editing session. The warning that creating an edit can invalidate another open edit is genuine when-to-be-careful guidance, though no alternative is named for reading or finishing an edit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discard_editDiscard a Google Play app editADestructive
MUTATES Play Console draft state: deletes the edit and all its uncommitted changes. Requires confirmDiscard=true.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| packageName | Yes | ||
| confirmDiscard | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the description's bar for disclosure is lower. It still adds real value by naming what is destroyed (the edit plus all uncommitted changes) and the operational prerequisite confirmDiscard=true. It does not say whether the editId becomes unusable afterward or what a caller gains from the confirmation beyond the schema const, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the mutation warning and the loss of uncommitted changes, followed by the required confirmation. Nothing extraneous and no burying of the destructive consequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive three-parameter tool with no output schema, the description covers the core hazard and the confirmation gate, and annotations carry the safety profile. Minor gaps remain on post-condition state (does the edit ID survive) and on the other two parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters, so the description carries the burden. It reinforces confirmDiscard=true as a required gate, which is meaningful, but packageName and editId are left to self-evident naming and their regex patterns, so the gap is only partly compensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: deletes the edit and all its uncommitted changes in Play Console draft state. That implicitly separates it from get_edit, validate_edit and commit_edit, which deal with the same edit but do not destroy it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Deletes the edit and all its uncommitted changes" implies this is the abandon-work path rather than the commit path, but there is no explicit when-to-use or when-not-to-use statement and no sibling is named as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_editGet a Google Play app editBRead-only
Read an existing edit ID and expiry time.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered and the description's job is to add context. It adds that the response includes the edit ID and expiry time, which is useful, but says nothing about expiry behavior, authentication requirements, or whether an expired/invalid edit produces an error. Some added value, but not rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted wording, and the noun phrase 'an existing edit ID and expiry time' carries the key scope. It is arguably over-terse given the parameter documentation gap, but as a structural matter it is clean and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers the resource and hints at the return shape (ID and expiry). It is not complete enough to call correctly without guessing at packageName semantics and the edit lifecycle, which are the main gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%: neither packageName nor editId has any description, and the description mentions only 'edit ID' in passing while never clarifying the package name parameter, its format expectations, or where the editId comes from. With two required params and no schema documentation, the description should compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Read an existing edit') and even names what comes back (edit ID and expiry time), which clearly separates it from the mutating siblings create_edit, commit_edit, discard_edit, and validate_edit. It does not explicitly name those siblings as alternatives, but the read/list-style purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Existing' weakly implies an edit must already have been created via create_edit, but there is no explicit when-to-use guidance, no statement of which sibling to call instead for related tasks, and no mention of what to do if the edit has expired. An agent must infer the workflow from the tool name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reviewGet a Google Play reviewC
Get one review by its Google Play review ID.
| Name | Required | Description | Default |
|---|---|---|---|
| reviewId | Yes | ||
| packageName | Yes | ||
| translationLanguage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden, yet it only implies a read via the verb 'Get'. It says nothing about error behavior for an unknown reviewId, whether the call requires packageName scoping, or how translationLanguage affects the returned content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded with the verb and resource, with no filler. It is efficient but borders on under-specification rather than being genuinely concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tool with zero schema description coverage, no annotations, and no output schema, one sentence is not enough. The agent is not told what packageName does, what translationLanguage does, or what the response contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters, and the description only references reviewId. packageName (required, with a regex pattern) and translationLanguage (optional locale format) get no explanation whatsoever, so an agent must guess their purpose from the names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (one review), and the phrase 'one review' implicitly narrows scope versus the sibling list_reviews. It does not name or explicitly contrast with list_reviews, so differentiation is inference-based rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'by its Google Play review ID' implies a precondition: the caller must already hold a review ID, which points away from list_reviews for discovery. However, no when-to-use statement, no exclusion, and no mention of the sibling alternative is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_store_listingGet a localized Google Play store listingARead-only
Read one localized listing from an existing app edit.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| language | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish a read-only, open-world operation, and the description adds the prerequisite that the app edit must already exist. It does not explain behavior for a missing edit or localization, edit-state constraints, or the returned representation; "Read" itself largely repeats readOnlyHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is front-loaded and contains no filler. It efficiently communicates the operation, cardinality, localization, and edit scope, although other dimensions require additional detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The core operation is clear, but the absence of both parameter descriptions and an output schema leaves important invocation and result details undocumented. The definition omits how to acquire a valid editId, language-tag semantics, missing-listing behavior, and explicit selection guidance versus list_store_listings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description needed to compensate more for the three required parameters. It indirectly clarifies that language selects the localization and editId identifies an existing edit, but does not explain packageName, how to obtain an editId, or the language-tag convention beyond the schema's pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and identifies the resource and scope: reading one localized listing within an existing app edit. Its singular read scope distinguishes it from list_store_listings and patch_store_listing, while the title supplies the Google Play context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"One localized listing" and "existing app edit" imply that this tool is for a known language and an already-created edit. It does not explicitly direct agents to list_store_listings for multiple or unknown languages, or mention create_edit when no edit exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_testersGet Google Play track testersARead-only
Read Google Groups assigned to a testing track in an existing edit. Individual email lists are not supported by this API.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | ||
| editId | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds a genuinely non-obvious behavioral constraint — that only Google Groups are returned and individual email lists are not supported — which prevents an agent from expecting email addresses in the result. It stops short of describing auth requirements or the exact returned shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the core action comes first and the limitation follows. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and zero schema description coverage, the description would need to explain the return value and parameter formats to be complete. It covers the key limitation but leaves the response shape and the meaning of packageName/editId to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across all three required parameters, so the description carries the burden. It adds partial meaning by tying 'track' to a testing track and 'editId' to an existing edit, but says nothing about package name format, whether track is a name or ID, or edit lifecycle prerequisites.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read Google Groups assigned to a testing track in an existing edit.' The scope ('in an existing edit', 'Google Groups' rather than testers generally) makes it distinguishable from update_testers, though the sibling is never named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Read' framing implicitly positions it against update_testers as the write counterpart, and 'in an existing edit' hints at a prerequisite (an edit must already exist). However, no explicit when-to-use/when-not guidance or named alternative is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trackGet a Google Play trackARead-only
Read track configuration and active releases from an existing app edit. Requires an editId; this tool does not create, change, or commit an edit.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | ||
| editId | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares the safety profile, and the description correctly reinforces it by specifying that no create/change/commit occurs against the edit. Beyond that, it says nothing about permissions, what the read costs, whether reading is idempotent across edit sessions, or how large the release payload is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the read scope front-loaded and the lifecycle constraint immediately after. No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only getter with no output schema, the description does the important work of summarizing the return payload (configuration plus active releases). The gap is the unexplained 'track' value domain, which matters for a required parameter with no schema description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so all three parameters rely entirely on the description. Only editId gets any meaning ('from an existing app edit'); 'track' is never explained (e.g., production vs. beta vs. a custom track name) and packageName is never mentioned at all, leaving the agent to infer its format from the regex.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Read') and a specific resource ('track configuration and active releases'), scoped to 'an existing app edit'. That is enough to separate it from the mutation sibling update_track and from the broader list_tracks, even though neither sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The prerequisite ('Requires an editId') and the negative scope ('does not create, change, or commit an edit') tell an agent what state it must already be in and what this call will not do. It stops short of naming update_track or create_edit as the alternatives, so the routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bundlesList Google Play app bundlesCRead-only
Read app bundles and version codes from an existing app edit.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that reading is scoped to an existing edit, but says nothing about pagination, ordering, behavior on an empty or invalidated edit, or what the returned bundle/version-code structure looks like — a real gap given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the resource and scope come first. It is efficient but so terse that brevity comes at the cost of the missing guidance noted elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two fully undocumented required parameters and no output schema, the definition leaves the agent guessing at the shape of packageName/editId and at what the returned bundles and version codes contain. The annotations cover safety but not the operational detail the description should supply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so neither packageName nor editId is documented anywhere. The description hints that editId refers to an 'existing app edit' but adds no meaning for packageName, no format rules, and no indication that both are required, so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('app bundles and version codes') scoped to 'an existing app edit', which distinguishes it from mutating siblings such as upload_bundle and upload_internal_sharing_bundle. It does not explicitly name a sibling, but the read/list nature is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'existing app edit' implies a prerequisite edit must already exist (created via create_edit), but the description never says so, never mentions what to do when no edit exists, and names no alternative tool. An agent must infer the workflow from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_listing_imagesList Google Play store listing imagesBRead-only
Read images for one language and image type from an existing app edit.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| language | Yes | ||
| imageType | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the useful constraint that reads are scoped to an existing edit, implying edit-lifecycle dependency and single-language/single-type filtering, but says nothing about the returned image payload, ordering, or limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and scope, with no filler. It is arguably too terse for a four-required-parameter tool, but every word present earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four required parameters, zero schema descriptions, and no output schema, the description should explain what comes back (image references, URLs, metadata) and confirm the edit-lifecycle prerequisite. Neither is addressed, leaving a meaningful gap for a read tool whose only value is its return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries real weight, and it does clarify that language and imageType are single-value selectors and that editId must reference an existing edit ('app' loosely implying packageName). It adds no format, pattern, or enum guidance, so an agent still relies entirely on the schema for syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') plus resource ('images') and narrows scope to one language and one image type within an app edit. It is clearly distinguishable from the write-side sibling upload_listing_image and from get_store_listing, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from an existing app edit' implies the prerequisite that an edit must already exist (create_edit / get_edit) and that listing happens inside the edit lifecycle. Beyond that implicit hint there is no explicit when-to-use guidance, no statement about when to prefer get_store_listing, and no mention of edit-state constraints such as committed or discarded edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reviewsList Google Play reviewsB
List reviews for an Android app. Returns Google Play pagination data; pass nextPageToken as pageToken for the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| pageToken | No | ||
| maxResults | No | ||
| packageName | Yes | ||
| translationLanguage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose the pagination contract (returns Google Play pagination data, nextPageToken feeds pageToken), which is the key behavioral trait for a paged endpoint. It omits ordering, rate limits, default/maximum result count, and whether replies are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose and followed immediately by the pagination mechanic — no filler. Slightly terse for the amount of undocumented surface, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description is the only behavioral source; it covers pagination but not defaults, result size, or translation behavior. Adequate to make a first call, insufficient to call it optimally.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four parameters, so the description must compensate. It only explains pageToken (via the nextPageToken wording); packageName format, maxResults limits/default, and translationLanguage behavior are left entirely to bare JSON-Schema types and patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List reviews for an Android app"), which cleanly separates it from the singular sibling get_review. It does not explicitly name the siblings, but the plural-list framing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The pagination instruction ("pass nextPageToken as pageToken for the next page") gives operational guidance on continuation. However, there is no explicit statement of when to use this versus get_review for a single review or reply_to_review, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_store_listingsList Google Play store listingsARead-only
Read all localized store listings from an existing app edit. Requires an editId; this tool does not create, change, or commit an edit.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces this with an explicit statement that it creates, changes, and commits nothing. It also adds the prerequisite that an edit must already exist, which is real context beyond the annotations. It omits return shape or pagination details, but the read-only profile is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the scope statement front-loaded and the negative capability claim second. Nothing is redundant or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers what it returns (all localized listings) and the safety profile. The one meaningful gap is that packageName is undocumented in both the schema and the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the meaning of both parameters. It explains editId only indirectly by tying it to "an existing app edit," and never mentions packageName at all, leaving the identifier's purpose and format entirely to the pattern in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ("Read all localized store listings") and scopes it to "an existing app edit". The phrase "all localized" implicitly distinguishes it from get_store_listing, which returns a single listing, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the precondition ("Requires an editId") and rules out mutation ("does not create, change, or commit an edit"), which is genuine usage context. It never names an alternative such as get_store_listing or list_listing_images, or says when to choose this over them, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_track_releasesList Google Play track releasesARead-only
Read up to 20 non-obsolete releases for a track, including their lifecycle states. This endpoint does not require an app edit.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds meaningful context beyond that: a hard cap of 20 results, exclusion of obsolete releases, inclusion of lifecycle states, and the fact that no edit transaction is needed. It stops short of describing ordering or whether more than 20 releases can ever be retrieved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler; the result-shape information is front-loaded and the no-edit-required note follows as supporting context. Nothing is repeated from the annotations or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description should describe what comes back, and it does so only partially: release count cap and lifecycle states are mentioned, but the fields of a release, the ordering, and the meaning/format of both required parameters are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, but it only weakly implies the 'track' parameter ('for a track') and says nothing about 'packageName'. It gives no hint of expected track formats such as 'production', 'beta', or form-factor-qualified names, and the regex-constrained packageName is entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Read ... releases for a track') and adds scope detail: up to 20, non-obsolete only, lifecycle states included. It does not explicitly differentiate itself from siblings like get_track or list_tracks, so an agent must infer that this returns release-level rather than track-level data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'This endpoint does not require an app edit' is a genuine usage signal, implying the agent can call it without create_edit/commit_edit, which most sibling mutation tools require. However, there is no explicit guidance on when to prefer this over get_track or list_tracks, and no stated prerequisites for the track value.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tracksList Google Play tracksARead-only
Read all tracks, including empty tracks, from an existing app edit.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, open-world operation. The description adds useful behavioral context by stating that all tracks are returned and that empty tracks are included, which is not obvious from annotations alone. It does not discuss authentication, rate limits, or return shape, so it is not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with the scope and key inclusion behavior front-loaded. Every phrase contributes information and there is no unnecessary wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple two-parameter read operation and no output schema exists, so the description need not explain return values in detail. However, with 0% schema coverage it remains incomplete because packageName is never described, and the edit context is only loosely implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both required parameters. It implies editId through 'existing app edit' but does not explain packageName at all, leaving the meaning of one of two required parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: read all tracks from an existing app edit. It also clarifies that empty tracks are included, which helps distinguish it from a simple track lookup. It does not explicitly differentiate itself from siblings such as get_track or list_track_releases, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from an existing app edit' implies the prerequisite context, but the description does not say when to use this tool instead of get_track, list_track_releases, or update_track. Usage is inferable but not explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_store_listingPatch a localized Google Play store listingADestructive
MUTATES an app edit: changes only supplied listing text or video fields for a language. Changes take effect after commit_edit.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | ||
| editId | Yes | ||
| language | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the mutation risk is known. The description adds real value beyond that: it clarifies patch semantics (only supplied fields change, others are left untouched) and that the mutation is staged and only lands on commit_edit. It does not mention permission/scope requirements or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, mutation warning front-loaded, workflow consequence second. No filler or restated boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent, nested-object mutation with no output schema and zero schema descriptions, the definition covers the essentials of what changes and when it lands. It leaves notable gaps: no edit-lifecycle prerequisite, no note on how to clear/remove a field, and no permission or error context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four required parameters, including a nested patch object with four constrained fields, so the description carries the full explanatory burden. It only loosely gestures at 'listing text or video fields for a language' and never explains packageName, editId, or the individual patch fields and their length/URI constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('MUTATES an app edit') and resource ('listing text or video fields for a language'), which is far more precise than the title alone. It does not differentiate itself from a full-replacement listing update or from get_store_listing/list_store_listings siblings, so an agent must infer the patch-vs-replace distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Changes take effect after commit_edit' gives useful workflow sequencing, and 'changes only supplied ... fields' implies partial-update usage. However, there is no explicit when-to-use vs when-not, no mention that an edit must already exist (create_edit), and no guidance on choosing this over other listing-mutation paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_reviewReply to a Google Play reviewBDestructiveIdempotent
Publish or replace the developer reply to a review. This changes the public Play Store listing.
| Name | Required | Description | Default |
|---|---|---|---|
| reviewId | Yes | ||
| replyText | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, but they cannot express that the effect is a public-facing change; the description's 'changes the public Play Store listing' is a genuinely additive disclosure. It still omits permission requirements, rate limits, and what happens to an existing reply's history when replaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the consequence; there is no padding or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and annotations covering the safety profile, the minimum is met, but for a public-facing mutation the description should say something about the 350-character reply limit, the edit/publish workflow implied by sibling tools, and what is returned on success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three required parameters, and the description never mentions any of them. It does not even surface the schema's 350-character cap on replyText, which is a realistic failure mode for an agent, so it fails to compensate for the coverage gap despite the parameters being largely self-describing by name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Publish or replace') on a specific resource ('the developer reply to a review'), making the create-or-update semantics unambiguous. It clearly differs from read-oriented siblings like get_review and list_reviews, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no preconditions (e.g. whether an edit must be created/committed first, as several siblings like create_edit/commit_edit suggest), and no alternatives mentioned. The reader must infer context entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_testersReplace Google Play track tester groupsADestructive
MUTATES an app edit: replaces all Google Groups for a testing track. Include groups to retain. Individual email lists are unsupported. Changes take effect after commit_edit.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | ||
| editId | Yes | ||
| packageName | Yes | ||
| googleGroups | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true generically; the description explains the actual mechanism — replace-all semantics rather than append, the need to re-list retained groups, and the deferred effect via commit_edit. It also discloses an input restriction (individual email lists unsupported) that no structured field conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences with the mutation warning front-loaded, then semantics, then the commit requirement. No filler, though the phrases are terse to the point of being slightly clipped rather than structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema mutation tool this covers the essentials: replacement semantics, required retention behavior, and the commit workflow. It omits edge cases such as passing an empty array to clear all testers, which would matter to an agent operating on this track.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden. It adds real meaning for googleGroups (replace-all, must include retained groups, Google Groups only), but says nothing about editId lifecycle, track naming, or packageName. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'MUTATES an app edit: replaces all Google Groups for a testing track.' The word 'replaces' plus 'testing track' distinguishes it from siblings like get_testers (read) and update_track (track config). An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: it is a full replacement, so groups to retain must be included, and results only land after commit_edit. It does not explicitly name alternatives (e.g., use get_testers to read current groups first) or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_trackReplace releases on a Google Play track in an editADestructive
MUTATES an app edit: replaces the full release list for a track with the supplied releases. Include any existing releases you want to retain. Changes do not go live until commit_edit.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | ||
| editId | Yes | ||
| releases | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, and the description earns credit by explaining the exact destruction pattern: the entire release list is overwritten, so unlisted releases are silently dropped. It also discloses the deferred-effect model (nothing is live until commit_edit), which is behavior an agent cannot infer from the annotations or the bare schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The mutation warning and replacement semantics are correctly front-loaded in the first sentence, and there is no filler. However, the middle sentence about retaining releases reads as a usage note fragment, and the description stops short of a compact, well-structured hint about the parameters it leaves undocumented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, four-parameter mutation with no output schema and zero schema description coverage, the description covers the two highest-stakes facts (full replacement and deferred commit). It is still incomplete for correctly populating the nested release objects an agent must construct, leaving a real risk of malformed or over-permissive release payloads.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four required parameters, so the description must carry the burden, and it does so only for the releases array by implying it must be a complete list. Nothing explains packageName, editId provenance, what a track identifier looks like, or the meaning of nested fields like status, userFraction, and countryTargeting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"MUTATES an app edit: replaces the full release list for a track with the supplied releases" gives a specific verb (replaces), a specific resource (release list for a track), and the containing scope (an edit). The word "replaces" also distinguishes it from an incremental add/attach operation, so an agent can tell what class of operation this is without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Include any existing releases you want to retain" is concrete when-to-use guidance for a full-replacement call, and "Changes do not go live until commit_edit" names the required follow-up step in the workflow. What is missing is any explicit "do not use this if..." routing against siblings such as list_track_releases or get_track when the agent only wants to inspect state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_bundleUpload an AAB to a Google Play editADestructive
MUTATES an app edit: reads a local .aab file and uploads its bytes. Returns the bundle versionCode. Does not assign a track or publish the edit.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| filePath | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds real value beyond them by disclosing the post-conditions (no track assignment, no publishing) and the return value (bundle versionCode). It does not explain what makes the call destructive or what permissions/size limits apply, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, mutation warning front-loaded, then mechanics, then scope limits. Every clause carries information an agent needs and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the essential workflow position and the return value in the absence of an output schema, which is the most important gap filled. However, for a destructive, non-idempotent upload it omits prerequisites (an open edit), file constraints, and what state is affected on failure — gaps an agent would want before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, and it largely does not: none of packageName, editId, or filePath are named. "Reads a local .aab file" only indirectly conveys that filePath is a local path, and packageName is never addressed at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("reads a local .aab file and uploads its bytes" into an app edit) and explicitly scopes it apart from publishing or track assignment. An agent can distinguish it from upload_internal_sharing_bundle, update_track, and commit_edit without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Does not assign a track or publish the edit" tells the agent this is a mid-workflow step and that update_track/commit_edit must follow, giving clear usage context. It stops short of naming those sibling tools or stating preconditions (e.g. that the edit must be open), so it is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_internal_sharing_bundleUpload an AAB for internal app sharingADestructive
MUTATES Play Console state: uploads a local .aab file to internal app sharing and returns a shareable download URL. It does not create a track release.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description still adds real value by leading with "MUTATES Play Console state" and disclosing the return value (a shareable download URL) and the boundary of the mutation (no track release), which the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the mutation warning, zero filler. The negative clause about track releases is short and earns its place by preventing misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter upload with no output schema, the description covers the essential unknowns: it is a state mutation, it returns a download URL, and it does not affect releases. Minor gaps remain around prerequisites (auth scope, upload size limits) and the fact that the returned URL is publicly shareable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — neither packageName nor filePath carries any prose, only a regex and length bounds. The description only hints that filePath is a "local .aab file"; it says nothing about what packageName must be (the app's application ID), nor about path format, size limits, or whether the file must exist locally on the server host. With low coverage the description should compensate and largely does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("uploads a local .aab file to internal app sharing") and immediately scopes it against the sibling upload_bundle by declaring "It does not create a track release." An agent can distinguish this from upload_bundle/list_bundles without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear negative condition — this does not create a track release — which implicitly routes the agent to the edit/release flow (upload_bundle + update_track) for that purpose. It never names the alternative tool explicitly, so the routing is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_listing_imageUpload a Google Play store listing imageADestructive
MUTATES an app edit: uploads a local PNG or JPEG and adds it to the selected language and image type. Existing images remain. Changes take effect after commit_edit.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| filePath | Yes | ||
| language | Yes | ||
| imageType | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=false, openWorldHint=true), the description adds real context: the operation is additive ('Existing images remain'), it is staged rather than immediate ('Changes take effect after commit_edit'), and the source must be a local PNG or JPEG. There is mild tension with destructiveHint=true, but 'existing images remain' reads as scoping the side effect rather than contradicting it; size/format limits and permission requirements are still unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, with the mutation signal front-loaded in capitals and the commit dependency placed last where it belongs. No wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation with no output schema and no schema descriptions, the staging model and additive behavior are well covered. Gaps remain around the edit lifecycle parameters, image constraints (dimensions/size), and what happens if an image of the same type already exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the burden, and it does add meaning for filePath (local file, PNG or JPEG only) and for language/imageType as the target selectors. It says nothing about editId (which edit session) or packageName, leaving two of five required parameters undifferentiated from the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('uploads a local PNG or JPEG and adds it to the selected language and image type'), which is enough to tell it apart from the read-side sibling list_listing_images. It does not name any sibling explicitly, so an agent must infer that this is the only listing-image upload tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the workflow requirement clearly: the upload is staged inside an app edit and only takes effect after commit_edit, which implies create_edit must precede it. It stops short of naming alternatives or stating when not to use it (e.g., re-uploading to replace an image).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_editValidate a Google Play app editBRead-only
Checks an app edit for publishing errors without committing it.
| Name | Required | Description | Default |
|---|---|---|---|
| editId | Yes | ||
| packageName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered, and the description usefully reinforces that the edit is not committed. However, it says nothing about what a failed validation produces (thrown error vs. list of errors), whether the edit remains open afterwards, or any quota/latency behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the non-committing constraint is stated last where it most usefully qualifies the action. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-required-parameter tool with no output schema and no parameter descriptions, the definition is too thin. An agent still has to guess where editId comes from and what the validation result looks like, which are the two things it needs to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden and it does not: neither packageName nor editId is mentioned. It omits the crucial fact that editId is the transient ID returned by create_edit and must belong to the same packageName.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ("checks") and resource ("an app edit") plus the scope of the check ("for publishing errors"). The phrase "without committing it" implicitly separates it from commit_edit, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this is a pre-commit sanity check on an open edit. There is no explicit when-to-use/when-not guidance, no mention that create_edit must precede it, and no routing to commit_edit or discard_edit after validation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
22 tool updates
v0.1.0- First observed
commit_edit - First observed
create_edit - First observed
discard_edit - First observed
get_edit - First observed
get_review - First observed
get_store_listing - First observed
get_testers - First observed
get_track - First observed
list_bundles - First observed
list_listing_images - First observed
list_reviews - First observed
list_store_listings - First observed
list_track_releases - First observed
list_tracks - First observed
patch_store_listing - First observed
reply_to_review - First observed
update_testers - First observed
update_track - First observed
upload_bundle - First observed
upload_internal_sharing_bundle - First observed
upload_listing_image - First observed
validate_edit
TDQS
Scored across 22 tools
The tools split cleanly along resource lines (edits, tracks, listings, bundles, reviews, testers) and read vs. mutate operations are mostly self-evident from names. The only real overlaps are upload_bundle vs upload_internal_sharing_bundle and list_track_releases vs get_track, though the descriptions distinguish them by edit requirements and sharing destination.
Every tool follows a consistent snake_case verb_noun pattern (list_reviews, get_review, create_edit, patch_store_listing, commit_edit, reply_to_review). The one-word suffix forms like create_edit/discard_edit are still verb_noun and highly predictable.
22 tools is at the heavy end for a single server, and the surface spans several sub-domains (edits, tracks, listings, images, testers, reviews, bundles). Each tool arguably earns its place, but the count makes discovery and selection more burdensome than a tighter core set would.
The edit lifecycle is fully covered (create/get/validate/commit/discard), and tracks, listings, testers, bundles, and reviews each have read/write operations. Gaps remain: there is no way to delete listing images or listings, and no tool for app-level metadata or halting/rolling back a rollout.
Maintenance
Related MCP Connectors
Ship a new Android app from chat. AI runs Google Play Console listings, screenshots, releases, uplo…
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.
App Store Connect operator for AI agents: icons, TestFlight builds, listings, IAP, rejection fixes.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to automate Android release workflows via the Google Play Android Publisher API, including deploying builds, managing listings, and replying to reviews.40MIT
- AlicenseAqualityAmaintenanceEnables 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.4484 npm2MIT
- FlicenseBqualityBmaintenanceEnables AI agents to manage Google Play apps with scope-based permissions, including publishing internal releases, updating listings, replying to reviews, and promoting to production.1112 npm-
- AlicenseBqualityCmaintenanceGives AI assistants hands-on control over Google Play Console and Google Cloud Console using an authorized Google identity. Exposes 95 tools for shipping app builds and release tracks, managing store listings, reviews, in-app products, GCP projects and IAM, Firebase projects and App Distribution, and Cloud Storage or Artifact Registry resources.95MIT