play-console-mcp
An MCP server for inspecting and safely managing a Google Play Console app through Google Play APIs.
Read release state: tracks, releases, rollout status, bundles, and app overviews.
Manage releases: create releases, deploy AABs with mapping files and notes, promote releases, and update/halt/resume staged rollouts.
Upload artifacts: app bundles, deobfuscation files, internal-sharing builds, and listing images.
Inspect Android vitals: crash/ANR/slow-start/rendering/wakeup/wakelock rates, summaries, version comparisons, anomalies, error issues/reports, and data freshness.
Work with reviews: list, filter, get, and publicly reply with dry-run preview.
Manage store presence: list/update listings, app details, and images.
Manage testers: view and update tester Google Groups, with destructive replace gated off by default.
List visible apps and get a combined app overview.
Read install/rating statistics when
PLAY_MCP_REPORTS_BUCKETis configured.Check Digital Asset Links for Trusted Web Activities.
Use guarded writes with dry runs, explicit production confirmation, read-only mode, and destructive tools disabled by default.
Provides tools for interacting with the Google Play Console API, enabling management of app releases and staged rollouts, bundles, Android vitals, reviews, store listings, testers, app overviews, and Trusted Web Activity asset-link checks.
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-mcppromote the latest bundle to production with a 10% staged rollout"
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: releases and staged rollouts, Android vitals, reviews, store listing, testers, install and ratings statistics, and a Digital Asset Links check for Trusted Web Activities. Write tools are on by default but guarded, so a careless call gives you a preview, not a release.
stdio only (no network listener), Node ≥ 20
three runtime dependencies:
@modelcontextprotocol/sdk,zod,josesigns in with a service-account key or keylessly by impersonating the account from your gcloud login
talks straight to the Google REST APIs over
fetch; the bearer token can only go to a hard-coded list of Google hostspublished from CI with npm provenance, so you can check that the tarball was built from this repository
Install
Pin an exact version. Don't use a floating latest:
claude mcp add -s user play-console \
-e PLAY_MCP_KEY_PATH=/path/to/service-account.json \
-e PLAY_MCP_PACKAGE=com.example.app \
-- npx -y @ilativity/play-console-mcp@1.0.0Or in any MCP client's JSON config:
{
"mcpServers": {
"play-console": {
"command": "npx",
"args": ["-y", "@ilativity/play-console-mcp@1.0.0"],
"env": { "PLAY_MCP_KEY_PATH": "/path/to/service-account.json", "PLAY_MCP_READ_ONLY": "1" }
}
}
}Check the published build: npm view @ilativity/play-console-mcp@1.0.0 and the provenance
panel on npmjs.com.
Related MCP server: playstore-release-mcp
Service account: grant the narrowest role
The real security boundary is the service account's role in Play Console. This server's gates are a second layer on top of it.
In Google Cloud, create a service account and a JSON key, then enable the Google Play Android Developer API and the Google Play Developer Reporting API.
In Play Console → Users and permissions, invite the service account's email. Give it access to only the apps it needs, with only the permissions you want an agent to have. For a read-only setup that means View app information and View app quality information. Add the release permissions only if you'll use the release tools.
Keep the key file outside any repository.
Install and ratings statistics (optional)
Neither Play API serves install counts. Play writes them as monthly CSV files into a Cloud Storage bucket that belongs to your developer account, and the four stats tools read those files.
In Play Console → Users and permissions → the service account → Account permissions, turn on View app information and download bulk reports. It must be an account permission, not an app permission. A new grant can take hours, sometimes up to a day, to reach the bucket.
In Play Console → Manage account → Play apps reports → Statistics, press Copy Cloud Storage URI.
Set
PLAY_MCP_REPORTS_BUCKETto what you copied (for examplegs://pubsite_prod_1234567890/stats/installs/).
Only then does the server register the stats tools and ask Google for the extra
devstorage.read_only scope. Without the variable it requests exactly the scopes it always did.
Play posts the files with a 3–7 day delay, so the current month is always partial.
Keyless mode (no key file)
If your organisation discourages downloading service-account keys, let your own Google login impersonate the service account instead:
gcloud iam service-accounts add-iam-policy-binding <sa-email> \
--member=user:<you> --role=roles/iam.serviceAccountTokenCreator
gcloud auth application-default loginThen set PLAY_MCP_IMPERSONATE=<sa-email> and leave out the key variables. The server refreshes
your gcloud user token and exchanges it for a short-lived service-account token through the IAM
Credentials API. Every Play call is still made as the service account.
What this improves, and nothing more: no long-lived private key exists on disk. The gcloud file still holds a user refresh token, which is a secret too. You can revoke it from your Google account, and it can only mint tokens for service accounts you're allowed to impersonate.
Configuration
Variable | Meaning |
| Path to the service-account JSON key (preferred). |
| The key JSON inline (for secret managers). |
| Fallback key path. In keyless mode, the path of the gcloud ADC file (default: gcloud's own location). |
| Service-account email for keyless mode. When set, it wins over the key variables. |
| Default package name; every tool also accepts |
| Register only read tools. The client never sees a write tool. |
| Register the destructive tools (delete images or listings) and allow replacing a whole tester list. |
| If set, upload tools only read files under this directory. Symlinks are resolved first, so they can't escape it. |
| The reports bucket from Copy Cloud Storage URI ( |
The token is cached in memory only. The key and the token never appear in tool output or logs.
Safety model
Writes are on, but guarded. Use
PLAY_MCP_READ_ONLY=1to turn them off completely.There is no default rollout. A release with status
inProgressneedsrollout_percentage. Leaving it out is an error. It never becomes a silent 100%.Production needs explicit confirmation. Any write that touches
production(or a form-factor production track such aswear:production) needsconfirm_production: true. That covers creating, deploying, promoting into it, and changing, halting, resuming or completing its rollout. Without the flag the call runs as a dry run: the edit is validated, then discarded, and you get back what would have happened.Dry runs everywhere. Edit-based writes accept
validate_only.reply_to_reviewacceptsdry_run.Destructive tools are off unless you set
PLAY_MCP_ALLOW_DESTRUCTIVE=1.Every tool has MCP annotations (
readOnlyHint,destructiveHint,idempotentHint,openWorldHint), so your client can ask you before a write.Edits never leak. Every edit that isn't committed is deleted, whether the call fails or was a dry run. For apps with managed publishing, a commit that Google won't send for review is committed without sending, and the result tells you to send it from Play Console.
Releases keep what must stay. When a staged rollout starts, the completed release that still serves everyone else stays on the track.
promote_releasekeeps the destination's other releases instead of replacing them.
Tools
R = read, W = write, D = destructive (off by default).
Area | Tools |
Releases |
|
Bundles |
|
Vitals |
|
Reviews |
|
Store listing |
|
Testers |
|
Apps |
|
Statistics (needs |
|
TWA |
|
What the Play APIs don't offer
Google provides no API for these, so this server can't do them: the Data safety form, content rating, the production access questionnaire, and tester opt-in counts.
Two other limits are worth knowing:
Reviews: the API returns only reviews from about the last week. Older ones are in Play Console only.
Vitals: values lag a day or two. Use
vitals_freshnessto see the latest date available.
Out of scope on purpose: purchases, subscriptions, refunds and in-app products; managing Play Console users and permissions; app recovery; HTTP transport.
Development
npm ci
npm run lint && npm run typecheck && npm test
npm run build # → dist/Tests use vitest with fetch mocked: a stateful fake of the edits API, driven through a real
MCP client over an in-memory transport.
License
MIT, see LICENSE. Credits for design ideas are in NOTICE.md.
Available Tools
41 toolsanr_rateANR rateARead-onlyIdempotent
Daily anr rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days back from the latest available data (default 28). | |
| filter | No | Reporting API filter, e.g. "versionCode = 123". | |
| dimensions | No | Break down by dimensions, e.g. versionCode, apiLevel, deviceModel, countryCode. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive behavior, so the bar is lower. The description adds meaningful context beyond them: the data is daily, aggregates are user-weighted, and rates are expressed as fractions (0.01 = 1%), which prevents a serious misreading of the output. It does not cover latency, data freshness, or rate 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?
Two tightly written sentences; the source and returned shape come first, with the unit clarification front-loaded enough that no line 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?
For a read-only metric tool with full schema coverage and annotations covering safety, the description supplies purpose, units, and aggregation windows. With no output schema, a brief note on the returned structure or how dimensions affect the result would close the remaining gap, but the essentials are present.
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 100%, so days, filter, dimensions, and package_name are already documented. The description adds no syntax or semantic detail about these parameters, so the baseline 3 applies.
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 metric (ANR rate), its source (Android vitals / Play Developer Reporting API), and the exact returned shape (daily plus 7- and 28-day user-weighted values). This clearly differentiates it from siblings like crash_rate, slow_start_rate, and slow_rendering_rate 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?
The definition implies this is the tool for ANR metrics, but gives no explicit when-to-use guidance, no mention of the sibling vitals tools, and no statement about prerequisites such as package setup. Usage is inferable only from the distinctive metric name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_overviewApp overviewARead-onlyIdempotent
"How is my app doing" in one call: release status on every track, the vitals summary against Google's thresholds, and the number of unanswered recent reviews. Each part reports its own error without failing the others.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: 'Each part reports its own error without failing the others,' which tells the agent partial-failure semantics it could not infer from annotations. Return format details remain thin, but the partial-failure disclosure is substantive.
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 with no redundancy, and the payload (what is returned) is front-loaded right after the framing phrase. The quoted 'How is my app doing' is a slight flourish but effectively sets the use case in a few words.
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 carries the burden of conveying returns, and it does so at a useful level: three named components, one covering every track. It also discloses partial-failure behavior. Minor gaps remain (per-track shape, freshness of vitals data), but nothing an agent needs to invoke it correctly is missing.
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?
There is a single parameter with 100% schema description coverage, including its default (PLAY_MCP_PACKAGE). The description never mentions the package_name parameter, so it adds nothing beyond the schema. Baseline 3 applies when the schema fully documents the parameters.
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 names a specific composite resource and enumerates its three constituents: release status on every track, vitals against Google's thresholds, and count of unanswered recent reviews. This lets an agent distinguish it immediately from the single-purpose siblings (release_status, vitals_summary, list_reviews) 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?
The framing 'in one call' clearly signals the intended use case: a broad, one-shot health check rather than per-area drilling. It does not, however, explicitly say when to prefer the granular siblings (e.g., 'use get_track for per-track detail'), so the routing guidance is contextual rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_asset_linksCheck Digital Asset LinksARead-onlyIdempotent
For a Trusted Web Activity: fetches https:///.well-known/assetlinks.json and compares its SHA-256 fingerprints for this package with the app-signing certificate Play reports (generatedApks). A mismatch is the classic reason a TWA shows the browser URL bar. Sends no credentials to the domain. If Play reports no signing certificate, pass fingerprint instead.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Site hostname only, e.g. example.com (no scheme, port or path). | |
| fingerprint | No | App-signing SHA-256 fingerprint to compare against, instead of asking Play. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| version_code | No | Version code to read the signing certificate from. Default: the highest on any track. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, openWorld and non-destructive. The description goes beyond them by disclosing that it performs a network fetch of a specific well-known URL and 'Sends no credentials to the domain' — a meaningful security/behavior detail the annotations cannot express. It stops short of describing the result 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?
Three dense sentences, front-loaded with the primary action, then the diagnostic rationale, then the parameter fallback. Every sentence carries information an agent needs; nothing is redundant with the title 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?
With no output schema, the description implies the outcome (match vs mismatch and its consequence) but does not state the actual return structure or how many entries are compared. For a low-complexity diagnostic call this is nearly complete, leaving only a minor gap around the response format.
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 100%, so baseline is 3, but the description adds real meaning: it explains why `fingerprint` exists as a substitute path when Play reports no signing certificate, and it ties the comparison target to 'generatedApks' from Play. This clarifies parameter interplay beyond the schema's per-field text.
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 precise verb and resource flow: fetches https://<domain>/.well-known/assetlinks.json and compares SHA-256 fingerprints against Play's app-signing certificate. This is unmistakably distinct from every sibling (all Play tracks/bundles/vitals/reviews tools), so an agent can route to it without ambiguity.
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?
Scopes the tool to Trusted Web Activity diagnostics and gives the payoff condition ('A mismatch is the classic reason a TWA shows the browser URL bar'), plus a fallback rule ('If Play reports no signing certificate, pass `fingerprint` instead'). No named alternatives because none exist among siblings, but there is no explicit when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crash_rateCrash rateARead-onlyIdempotent
Daily crash rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days back from the latest available data (default 28). | |
| filter | No | Reporting API filter, e.g. "versionCode = 123". | |
| dimensions | No | Break down by dimensions, e.g. versionCode, apiLevel, deviceModel, countryCode. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-structured context: that values are returned as fractions (0.01 = 1%) and that 7- and 28-day user-weighted aggregates are included, which prevents a units misreading. It omits auth requirements and data-freshness caveats, keeping 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 what is returned before the units caveat. Nothing is padded; each clause (source, granularity, aggregate windows, unit convention) carries distinct information.
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 usefully sketches the return shape (daily values plus 7- and 28-day aggregates) and the unit convention. Full 100% parameter coverage plus rich annotations fill the remaining gaps; only freshness/latency of vitals data is left unstated.
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 100%, so every parameter (days, filter, dimensions, package_name) is already documented in the schema with examples. The description adds no parameter-level detail at all, so the baseline 3 applies.
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 resource and its source clearly: daily crash rate from Android vitals via the Play Developer Reporting API. It distinguishes itself from non-vitals siblings by naming the exact metric, but gives no explicit contrast with near-neighbours like anr_rate or vitals_summary, which an agent must infer from names alone.
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 prerequisites, and no named alternative among the many vitals siblings (anr_rate, slow_start_rate, vitals_summary, vitals_by_version). Usage is only implied by the metric name; an agent gets no routing help between this and the aggregation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_releaseCreate releaseA
Creates a release of already-uploaded version codes on a track. Keeps the track's other releases that must stay (e.g. the completed release during a staged rollout). Production requires confirm_production: true, otherwise this is a dry run.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| status | Yes | draft = not live; inProgress = staged rollout (needs rollout_percentage); completed = 100%. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| release_name | No | Release name shown in Play Console. | |
| release_notes | No | Release notes per language (max 500 characters each). | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. | |
| version_codes | Yes | Version codes to release. | |
| confirm_production | No | Must be true to change a production track. Without it the call runs as a dry run and returns a preview. | |
| rollout_percentage | No | Percentage of users for a staged (inProgress) rollout, e.g. 10. Required for inProgress — there is no default. | |
| changes_not_sent_for_review | No | Managed publishing: commit without sending for review. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), so the bar is lower. The description adds real context beyond that: it discloses that other releases are retained during staged rollouts and that production calls silently degrade to a dry run without confirm_production.
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, no filler, and the two highest-risk facts (preservation of existing releases, production dry-run gate) are front-loaded. Nothing here is 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 10-parameter mutation with no output schema, the description covers the main hazards: what is preserved, and the dry-run fallback for production. It stops short of explaining the dry-run preview return or interactions with the surrounding edit/commit flow, which would have made it fully self-sufficient.
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 100%, so the schema already documents all 10 parameters including confirm_production, validate_only, and rollout_percentage. The description's mentions of confirm_production and staged-rollout retention restate or lightly extend schema content rather than adding new syntax or constraints, so baseline 3 applies.
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 ('Creates a release') and narrows the scope to 'already-uploaded version codes on a track', which cleanly separates it from upload_bundle/upload_internal_sharing. It also distinguishes itself from a plain track edit by noting that existing releases are preserved.
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 one concrete usage rule (production requires confirm_production: true, otherwise dry run), which is genuinely useful. However, it never routes the agent between this tool and close siblings such as promote_release, update_rollout, or deploy, so the when-to-use-vs-alternative question is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deployDeployA
Uploads an .aab, optionally its mapping.txt, and creates the release with notes — all in ONE edit, so a failure at any step leaves nothing half-done. With validate_only (or on production without confirm_production) the bundle is uploaded into a throwaway edit, validated and discarded.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| status | Yes | draft = not live; inProgress = staged rollout (needs rollout_percentage); completed = 100%. | |
| file_path | Yes | Path to the .aab file. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| release_name | No | ||
| release_notes | No | Release notes per language (max 500 characters each). | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. | |
| mapping_file_path | No | Optional path to mapping.txt for the new version code. | |
| confirm_production | No | Must be true to change a production track. Without it the call runs as a dry run and returns a preview. | |
| rollout_percentage | No | Percentage of users for a staged (inProgress) rollout, e.g. 10. Required for inProgress — there is no default. | |
| changes_not_sent_for_review | No | Managed publishing: commit without sending for review. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish it is a mutating, non-idempotent, open-world operation, and the description adds genuinely new transactional context: the edit is atomic so a failure at any step leaves nothing half-done, and dry runs are uploaded into a throwaway edit and discarded. This is disclosure beyond the annotation set.
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 primary action and follow-up behavioral note, with no filler. Dense but every clause earns its place; slightly terse on the success path.
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 an 11-parameter mutation with 91% schema coverage and no output schema, the description covers the critical atomicity and dry-run semantics an agent needs. It does not spell out the success/return shape, but the lack of an output schema and rich param docs keep this mostly adequate.
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 91%, so the schema already carries parameter meaning. The description's mentions of validate_only and confirm_production largely restate what the schema descriptions already say, adding little new semantics; baseline 3 is appropriate.
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 specific verbs and resources: uploads an .aab plus optional mapping.txt and creates the release with notes. The 'all in ONE edit' framing distinguishes it behaviorally from doing upload_bundle and create_release separately, 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?
It explains the two operational modes (validate_only dry run, throwaway edit on production without confirm_production), which is useful context. However, it gives no explicit when-to-use-this-instead-of-siblings guidance (e.g. versus upload_bundle + create_release), leaving the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
excessive_wakeup_rateExcessive wakeup rateARead-onlyIdempotent
Daily excessive wakeup rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days back from the latest available data (default 28). | |
| filter | No | Reporting API filter, e.g. "versionCode = 123". | |
| dimensions | No | Break down by dimensions, e.g. versionCode, apiLevel, deviceModel, countryCode. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond that: it discloses that rates are fractions (0.01 = 1%) and that the tool includes 7- and 28-day user-weighted values, which is important 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?
Two tightly written sentences front-load the metric and source, then immediately clarify the output format. There is no redundant or wasted phrasing.
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 description covers the metric, its source, aggregation windows, and rate format, which is sufficient for a data-retrieval tool with full parameter schema coverage and safety annotations. It does not explain pagination or time-series return shape, but those gaps are minor given the available structured data.
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 100%, so all four parameters are fully documented in the schema. The description adds no parameter-specific details (e.g., days, filter, dimensions, package_name), so the baseline of 3 applies.
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 names a specific metric (excessive wakeup rate) and its source (Android vitals), which distinguishes it from sibling vitals tools like crash_rate and anr_rate. However, it lacks an explicit retrieval verb, so it is clear but not maximally sharp.
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 guidance on when to use this tool versus alternatives, nor any mention of prerequisites or contexts. The description only states what the metric is, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_app_detailsGet app detailsBRead-onlyIdempotent
Returns the app's default language and contact email, phone and website.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety and idempotency profile is fully covered structurally. The description adds only the returned field set, with no mention of auth, rate limits, or whether the app defaults to a configured package.
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 efficient sentence that front-loads the return payload. It is appropriately sized for a simple getter, though it omits any scoping context that could have been added without bloat.
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 full schema coverage, complete annotations, and no output schema, enumerating the returned fields is sufficient. The main gap is the absence of any routing context relative to sibling read tools, but nothing critical is missing for correct invocation.
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 100% and the single package_name parameter is documented in the schema including its default (PLAY_MCP_PACKAGE). The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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?
Uses a specific verb ('Returns') and resource ('app's default language and contact email, phone and website'), so the agent knows exactly what data comes back. It does not explicitly differentiate itself from siblings like app_overview or update_app_details, but the name and field listing make the scope clear.
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 guidance on when to use this tool versus alternatives such as app_overview or list_apps, nor any prerequisites or exclusions. The description only states the returned fields, leaving selection entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listingGet store listingBRead-onlyIdempotent
Returns the store listing for one language.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | BCP-47 language code, e.g. en-US | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds only the cardinality note (one language rather than all), and says nothing about how missing languages are handled or what the returned listing contains. Given the lowered bar with annotations present, this is minimally adequate added 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 short sentence with the resource and scope front-loaded and zero filler. It is efficient, though its brevity leans toward under-specification rather than fully earned conciseness.
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 read tool with no output schema and rich annotations, the essentials are present via the schema. However, the description never clarifies the distinction from list_listings, does not note the default package behavior, and gives no notion of the returned listing shape or failure mode when a language lacks a listing.
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 100%, with `language` documented as a BCP-47 code and `package_name` documented as defaulting to PLAY_MCP_PACKAGE. The description adds nothing beyond this, so the schema-baseline of 3 applies.
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 ("Returns the store listing") plus a scope qualifier ("for one language"), which lets an agent distinguish it from list_listings (enumerate all listings) reasonably well. It does not, however, explicitly name or contrast with siblings, and the fields returned are unspecified.
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 prerequisites, and no mention of alternatives such as list_listings or update_listing. The agent must infer that this tool is for fetching a single language's listing rather than enumerating them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reviewGet reviewBRead-onlyIdempotent
Returns one review with any developer reply.
| Name | Required | Description | Default |
|---|---|---|---|
| review_id | Yes | ||
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| translation_language | No | BCP-47 language code, e.g. en-US |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is fully covered. The description adds one genuinely useful behavioral detail, that the developer reply is bundled into the return payload, but nothing about failure behavior for a missing/invalid review_id.
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 with no padding and the key information (single review, includes developer reply) front-loaded. It is appropriately sized, though it is arguably too terse for the parameter ambiguity it leaves behind.
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 must carry the return-shape burden, and it only sketches it ("one review with any developer reply") without field-level detail. Combined with the undocumented review_id, an agent has enough to attempt a call but not enough to be confident about results or parameter semantics.
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 67%, and the one required parameter, review_id, has no description anywhere. The description adds zero information about any of the three parameters, so it fails to compensate for the gap and adds nothing beyond 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 states a specific verb and resource ("Returns one review") and the scope is singular, which implicitly distinguishes it from the sibling list_reviews. However, it never names that sibling or otherwise makes the distinction explicit, so it stops 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?
There is no guidance on when to use this tool versus list_reviews or reply_to_review, the two obvious siblings it overlaps with. The agent must infer that a single-review fetch is appropriate when a review_id is already known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_testersGet testersBRead-onlyIdempotent
Returns the Google Groups of testers for a testing track.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds that the output is Google Groups of testers, but says nothing about auth requirements or the shape/count of returned groups.
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 words. It is efficient, though it is arguably too sparse to earn a top score.
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 read-only getter with a 100% covered schema and annotations conveying the safety profile, the description is minimally adequate. Since no output schema exists, a slightly fuller statement of what is returned would have improved completeness.
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 100%, so the schema already fully documents the 'track' and 'package_name' parameters, including the enum-like values and the PLAY_MCP_PACKAGE default. The description only echoes 'testing track' and adds no syntax or format detail beyond 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?
States a specific verb ('Returns') and resource ('Google Groups of testers for a testing track'), making the read-only nature clear. It does not explicitly name the sibling update_testers, but the get/update distinction is inferable from the verb.
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 guidance on when to use this tool versus alternatives such as get_track, list_tracks, or update_testers. It only describes what is returned, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trackGet trackARead-onlyIdempotent
Returns one track with its full release objects, as Google reports them.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered structurally. The description adds that the track is returned with its full release objects as Google reports them, which is useful but thin—no note on error behavior for unknown tracks or missing packages.
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 filler; every phrase (one track, full release objects, as Google reports them) 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?
For a simple read-only getter with full annotation coverage and complete parameter documentation, the description is sufficient; stating what the return contains compensates for the absent output schema. A little more on the calling context would make it complete.
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 100%; the track pattern and package_name default are fully documented in the schema. The description adds no parameter meaning beyond that, so baseline 3 applies.
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 ("Returns one track") and adds scope ("with its full release objects"), which distinguishes it from the sibling list_tracks without naming it. Clear, though it does not explicitly route against list_releases or list_tracks.
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 singular "one track" implies fetching a single track's detail versus listing, which is usable guidance. But it never states when to prefer this over list_tracks or release_status, and gives no conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
halt_rolloutHalt rolloutAIdempotent
Halts a staged rollout: no new users get the release (existing installs keep it). On production this requires confirm_production: true, otherwise it is a dry run.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. | |
| confirm_production | No | Must be true to change a production track. Without it the call runs as a dry run and returns a preview. | |
| changes_not_sent_for_review | No | Managed publishing: commit without sending for review. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the bar is lower, yet the description still adds two behaviors not in the structured data: the effect boundary (existing installs keep the release) and the silent dry-run fallback on production without confirm_production. It does not describe review/commit side effects, which is a minor residual gap.
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, zero filler, and the effect statement is front-loaded before the production caveat. Every clause carries information an agent needs to invoke the tool correctly.
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 5-parameter mutation tool with no output schema, the description covers the two things that could cause a wrong call: the scope of the halt and the production confirmation/dry-run behavior; the remaining parameters are fully documented in the schema. It could say more about managed-publishing/review consequences, but nothing critical is missing.
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 100%, so the baseline is 3. The description nonetheless adds cross-parameter meaning by tying confirm_production to the production track specifically, clarifying which value of `track` triggers the confirmation requirement rather than restating the schema's generic wording.
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 ("Halts a staged rollout") and immediately scopes the effect: no new users receive the release while existing installs keep it. That scoping also implicitly distinguishes halt from a rollback or unpublish, so an agent can tell it apart from resume_rollout/update_rollout 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 concrete precondition for the production case: confirm_production: true is required, otherwise the call degrades to a dry run. That is real when-to-use guidance. It stops short of naming alternatives (e.g. resume_rollout to undo the halt, update_rollout for partial changes), so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_anomaliesList anomaliesCRead-onlyIdempotent
Lists anomalies Google detected in the app's vitals metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Reporting API filter expression. | |
| page_size | No | ||
| page_token | No | ||
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds one useful behavioral detail — the anomalies are Google-detected rather than user-defined — but says nothing about pagination, result limits, or time-range semantics.
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 filler or repetition of the title. It is efficient, though its brevity reflects under-specification as much as conciseness.
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?
There is no output schema and no annotations gap, but for a paginated list tool the description omits the pagination model (page_token/page_size behavior), the meaning of 'anomaly', and any scoping by time or version. Too little for a four-parameter, zero-required-parameter listing 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 only 50%: page_size and page_token have no descriptions at all, and filter is described only as 'Reporting API filter expression'. The description supplies no parameter meaning whatsoever (no filter syntax, no default page size, no pagination contract), so it fails to 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?
States a specific verb (Lists) and a specific resource (anomalies Google detected in the app's vitals metrics), which distinguishes it from raw-metric siblings like crash_rate or vitals_summary. However, it never names or contrasts with those adjacent vitals tools, so the agent still has to infer which tool to pick among the vitals cluster.
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 description gives no when-to-use context, no prerequisites, and no routing away from alternatives such as vitals_summary, crash_rate, or search_error_issues. The agent learns what the tool returns but not the situation that should trigger it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_appsList appsARead-onlyIdempotent
Lists the apps this service account can see, according to its Play permissions (Play Developer Reporting API apps:search).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful permission scoping and names the underlying API, but does not describe return shape, pagination, or ordering behavior for a list operation.
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 filler; the permission scope and API reference are compact and relevant.
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 zero-parameter list tool with strong annotations, the description is nearly complete. The main minor gap is that it does not mention whether the result is paginated or what fields each app entry contains, though no output schema exists to cover that.
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?
The tool has zero parameters, so the baseline is 4. The description introduces no parameter confusion and correctly frames the tool as taking no inputs.
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 ('Lists the apps') and adds scope ('this service account can see') plus the underlying API source. It is clear what the tool does, though it does not explicitly differentiate itself from the sibling list/get tools.
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 by the permission-scoped description, but there is no explicit guidance on when to choose this tool versus siblings like get_app_details or app_overview, nor any exclusions or prerequisites beyond Play permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bundlesList bundlesBRead-onlyIdempotent
Lists the app bundles (AABs) uploaded for the app, with version codes and hashes.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered structurally. The description adds only that version codes and hashes come back; it says nothing about ordering, pagination, or behavior when no bundles exist.
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 tight sentence with the resource and returned data front-loaded and zero filler. Nothing can be trimmed without losing information.
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 read-only lister with one fully documented optional parameter and no output schema, the description covers what the tool returns well enough to call correctly. Only missing pieces are ordering/pagination and empty-result behavior, which are minor here.
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?
Only one parameter and schema description coverage is 100%, including the PLAY_MCP_PACKAGE default note, so the schema does the work. The description adds no parameter-level meaning, which is the expected baseline when coverage is complete.
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?
Specific verb+resource ('Lists the app bundles (AABs)') plus a preview of returned fields (version codes and hashes), and it expands the AAB acronym so the agent knows the artifact type. It is clearly distinguishable from upload_bundle or list_tracks, though it doesn't explicitly contrast itself with a sibling.
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, when-not-to-use, or alternative reference at all. The agent must infer from the name alone that this is the read-side counterpart to upload_bundle, and nothing states preconditions or scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_imagesList imagesCRead-onlyIdempotent
Lists the images of one type (screenshots, icon, feature graphic…) for a language.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | BCP-47 language code, e.g. en-US | |
| image_type | Yes | ||
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds nothing beyond that - no mention of pagination, ordering, or what happens when no images exist for the type/language.
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 padding; the verb and both filters come first. The trailing ellipsis in the example list is slightly loose but harmless.
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 read-only list tool with annotations carrying the safety profile and no output schema, the description is adequate but thin. It does not describe the returned shape or whether results are paginated, which an agent would want given there is no output schema.
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 67% and the enum for image_type plus the BCP-47 hint for language are already in the schema. The description restates 'one type' and 'for a language' but adds no format or default details (e.g., package_name default is only 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?
States a specific verb (Lists) and resource (images) with the two filtering dimensions: image type and language. It is clear what the tool does, though it does not distinguish itself from siblings like upload_image or list_listings.
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?
No guidance on when to use this versus alternatives (e.g., upload_image for the write side, or how it relates to listing tools). The only usage hint is implicit in the 'for a language' scoping; there are no exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_listingsList store listingsARead-onlyIdempotent
Lists the store listing (title, descriptions) for every language.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered structurally. The description's only added behavioral value is disclosing the returned fields (title, descriptions) and the every-language scope; it says nothing about pagination, volume of results, or error 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 resource and the every-language scope are both stated immediately, and every word 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?
For a simple read-only list tool with one optional parameter, annotations covering the safety profile, and no output schema, the description is nearly complete; it names the returned content (title, descriptions). Slight gap: no mention of whether results are paginated or how many languages could come back.
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?
There is one optional parameter with 100% schema description coverage, including the PLAY_MCP_PACKAGE default, so the schema carries the full semantic load. The description adds nothing about the package_name parameter, which is acceptable given the coverage but earns only the baseline.
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 ('Lists') and resource ('store listing') plus a scope qualifier ('for every language'), which distinguishes it functionally from the singular get_listing sibling. However, it never names get_listing or update_listing 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?
The phrase 'for every language' implies the usage context (broad enumeration vs a targeted lookup), but there is no explicit when-to-use guidance, no prerequisites, and no mention of the get_listing alternative for a single language. Usage must be inferred from scope wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_releasesList releasesARead-onlyIdempotent
Lists releases on one track, or on every track when no track is given.
| Name | Required | Description | Default |
|---|---|---|---|
| track | No | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the all-tracks fallback behavior, which is real added context, but says nothing about pagination, ordering, or result volume for an open-world list call.
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 filler; the default behavior is stated immediately and nothing needs trimming or reordering.
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 exists, so the description could reasonably say what a 'release' entry contains or how results are ordered/limited; instead it stops at scoping. For a read-only two-parameter list tool this is adequate but leaves the return shape entirely 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 100% and both parameters are documented in the schema, including track values and the PLAY_MCP_PACKAGE default. The description's only added meaning is the implicit 'no track = every track' behavior, so the baseline 3 applies.
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 ("Lists releases") and clarifies scope: one track, or all tracks when no track is supplied. That scope statement distinguishes it from the track-oriented siblings, but it never names or contrasts with relatives like release_status or list_tracks, so sibling differentiation is only implicit.
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 conveys the key calling condition: pass a track to scope to one track, omit it to get everything. That is useful implied guidance, but there is no statement of when to prefer this over alternatives such as release_status, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reviewsList reviewsARead-onlyIdempotent
Lists recent reviews, filterable by star rating, language and unanswered-only. The Play API only returns reviews created or edited in about the last week; older reviews are visible only in Play Console.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum reviews returned (default 100). | |
| language | No | Only reviews in this language (prefix match, e.g. en or en-US). | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| star_ratings | No | Only these star ratings, e.g. [1, 2]. | |
| unanswered_only | No | Only reviews without a developer reply. | |
| translation_language | No | Ask Google to translate review text into this language. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds a genuinely non-obvious behavioral constraint the annotations cannot express: the Play API only returns reviews created or edited in roughly the last week, with older ones visible only in Play Console. Pagination/return shape is 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?
Two sentences, no filler, with the core action front-loaded and the critical API limitation placed immediately after it. Every clause 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, the description arguably should say what a returned review contains, but the safety annotations and the freshness caveat cover the operationally important gaps for a read-only listing tool with fully documented parameters. Reasonably complete, with return-shape information the main omission.
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 100% and all six parameters are documented there, including prefix matching for language and the PLAY_MCP_PACKAGE default. The description's mention of star rating, language and unanswered-only restates schema content without adding syntax or format detail, so the baseline 3 applies.
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+resource ("Lists recent reviews") plus the supported filter dimensions, which cleanly separates it from get_review and reply_to_review. It stops short of naming those siblings explicitly, so an agent must infer the list-vs-single 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?
Usage is implied through the enumerated filters (star rating, language, unanswered-only) and the note about the Play API's one-week window, which tells the agent not to expect historical data. There is no explicit when-to-use/when-not statement or pointer to get_review for a specific review.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tracksList tracksBRead-onlyIdempotent
Lists the app's tracks and how many releases each has.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds that the listing includes a release count per track, which is useful return-content context but does not disclose pagination, ordering, or other behavioral details.
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 front-loaded sentence with no filler. Every word contributes to stating what the tool returns.
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 read-only listing with one optional parameter and rich annotations, the description covers the resource and the notable return detail (release counts). It omits pagination or ordering behavior, but no output schema exists and the annotations carry the safety profile, so the definition is largely complete.
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?
The single optional parameter package_name is fully documented in the schema, including its default. With 100% schema description coverage, the description need not repeat that information, and it adds no extra parameter semantics beyond 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 states a specific verb and resource: 'Lists the app's tracks and how many releases each has.' It is clear enough to distinguish a plural listing with release counts from a single-track retrieval like get_track, but it never explicitly names or contrasts the sibling tools.
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 statement of when to use this tool versus alternatives such as get_track or list_releases. The context of listing tracks is implied by the name and description, but no usage guidance or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_releasePromote releaseA
Copies a release from one track to another (e.g. internal → production). The destination's other releases that must stay are kept, not replaced. Promoting into production requires confirm_production: true, otherwise this is a dry run.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | draft = not live; inProgress = staged rollout (needs rollout_percentage); completed = 100%. | |
| to_track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| from_track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| release_name | No | ||
| release_notes | No | Release notes for the destination. Default: copied from the source release. | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. | |
| version_codes | No | Which release to promote, by version codes. Default: the source track's in-progress release, else its completed one. | |
| confirm_production | No | Must be true to change a production track. Without it the call runs as a dry run and returns a preview. | |
| rollout_percentage | No | Percentage of users for a staged (inProgress) rollout, e.g. 10. Required for inProgress — there is no default. | |
| changes_not_sent_for_review | No | Managed publishing: commit without sending for review. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing merge semantics ('the destination's other releases that must stay are kept, not replaced') and the dry-run fallback when confirm_production is absent. These are meaningful behavioral details consistent with destructiveHint=false. Gaps remain on idempotency and what the preview returns.
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 tight sentences, front-loaded with the core action, then merge behavior, then the production gate. Every sentence earns its place with no redundancy.
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 an 11-parameter, openWorld mutation with no output schema, the description covers the essential call semantics: merge vs replace, production gating, and dry-run behavior. It stops short of explaining return content or idempotency, but the missing detail is largely covered by the rich schema.
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 91%, so the schema already documents confirm_production, validate_only, and rollout constraints. The description reinforces the confirm_production/dry-run coupling but adds no new parameter detail beyond the schema, so the baseline 3 applies.
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 ('Copies a release from one track to another') with a concrete example (internal → production). The action is clearly distinguishable from create_release or deploy, though no sibling is named explicitly to sharpen the boundary.
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 real precondition ('Promoting into production requires confirm_production: true, otherwise this is a dry run'), which implies when the tool applies. However it offers no explicit guidance on when to choose promote_release over create_release, deploy, or update_rollout, leaving alternative selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_statusRelease statusARead-onlyIdempotent
One call, every track: each release's version codes, status, rollout percentage and halted flag, plus the highest version code per track.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds real value beyond that by disclosing the payload: version codes, status, rollout percentage, halted flag, and the highest version code per track — behavior that would otherwise require opening an output schema, which does not exist here.
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 dense sentence, front-loaded with the scoping promise ('One call, every track') followed by the returned fields. Every clause carries information and 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?
For a one-parameter read tool with no output schema, the description supplies the return shape an agent needs. Minor gaps remain: no mention of ordering, empty-track handling, or how the highest-version-code aggregate relates to the per-track entries.
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 one parameter at 100% schema coverage, the schema already documents package_name and its PLAY_MCP_PACKAGE default. The description adds no syntax or scope detail about the package input, so the baseline 3 is appropriate.
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 names a specific resource (release status per track) and a clear scope ('every track', 'one call'), which distinguishes it from per-track siblings like get_track and list_releases. It does not explicitly name those alternatives, but the aggregate framing makes the difference inferable.
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 call, every track' hints at a shortcut over iterating get_track across tracks, which is implied usage guidance. There is no explicit when-to-use statement, no exclusions, and no named alternative, so it stays at the minimum viable level.
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 reviewAIdempotent
Posts a PUBLIC developer reply to a review (replacing any earlier reply). Max 350 characters. Use dry_run to preview without posting.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview only: check the reply and show the review, post nothing. | |
| review_id | Yes | ||
| reply_text | Yes | Reply text, at most 350 characters. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds genuinely new behavioral context: the reply is publicly visible, it replaces any earlier reply, and it is capped at 350 characters. It does not disclose rate limits, auth/permission requirements, or how failures surface, so it stops 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?
Three short clauses, zero filler, and the most important constraint (public, replacing an earlier reply) is front-loaded before the character limit and the dry_run hint.
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 mutation tool with no output schema and 4 parameters, the description covers the essentials an agent needs: public visibility, replacement semantics, the length limit, and a preview path. Remaining gaps (auth requirements, error behavior, package_name fallback) are minor and partly covered by the schema.
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 75% and both the 350-character cap and dry_run behavior are already documented in the schema descriptions, so the description largely repeats structured data. It adds no meaning for review_id or package_name; baseline 3 is appropriate.
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 ('Posts a PUBLIC developer reply to a review') with the scope qualifier PUBLIC, which distinguishes it from the read-only siblings list_reviews and get_review. An agent can identify the operation and its write nature 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?
The description gives one actionable usage hint ('Use dry_run to preview without posting') but offers no when-to-use/when-not guidance relative to alternatives, nor any precondition such as needing an existing review. Usage is implied rather than explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_rolloutResume rolloutAIdempotent
Resumes a halted rollout at the percentage you give (required — the previous percentage is not assumed). On production this requires confirm_production: true, otherwise it is a dry run.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. | |
| confirm_production | No | Must be true to change a production track. Without it the call runs as a dry run and returns a preview. | |
| rollout_percentage | Yes | Percentage to resume at, e.g. 20. | |
| changes_not_sent_for_review | No | Managed publishing: commit without sending for review. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the mutation profile is known. The description adds genuinely new behavioral context: an explicit production-confirmation gate and the fact that omitting it silently degrades the call to a dry run, which is a non-obvious safety 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 sentences with no filler; the core action is front-loaded and the production constraint follows immediately. The parenthetical about the required percentage is tightly worded and 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?
For a 6-parameter mutation tool with no output schema, the description covers the essential action, the required percentage, and the production safety gate. It leaves the relationship between the implicit dry run and the explicit validate_only parameter unaddressed, a minor ambiguity.
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 100%, so the baseline is 3. The description adds real value beyond the schema by flagging rollout_percentage as required and warning that the previous percentage is not carried over, and by restating the production/confirm_production coupling in behavioral terms rather than mechanical ones.
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 ('Resumes a halted rollout') and names the key required input. It implicitly contrasts with halt_rollout, but never distinguishes itself from update_rollout, which likely also sets a rollout percentage, so sibling differentiation is incomplete.
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 precondition for use (the rollout must be halted) and a clear production gating rule (confirm_production: true, otherwise dry run). It does not name alternatives such as update_rollout or promote_release, so the routing guidance stops short of explicit when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_error_issuesSearch error issuesCRead-onlyIdempotent
Searches grouped crash/ANR issues (Reporting API errorIssues:search).
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Reporting API filter expression. | |
| order_by | No | ||
| page_size | No | ||
| page_token | No | ||
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already define this as a read-only, idempotent, non-destructive operation. The description adds helpful context by specifying the target resource as 'grouped crash/ANR issues.' This is adequate given the safety profile is covered by hints, but it doesn't detail complex behaviors like pagination logic or rate limiting.
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 definition is extremely concise, delivering the core function in a single, focused sentence without any wasted words.
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 tool lacks sufficient context because it does not provide usage guidelines or offer semantic depth for the parameters. For a 5-parameter search API, the description is too minimal to allow for confident, comprehensive invocation.
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?
The schema description coverage is only 40%, meaning the description must compensate for undocumented parameters. However, the description is purely functional and does not elaborate on the semantics of the input fields like `filter` or `order_by`, making it insufficient to compensate for the low schema coverage.
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 clearly identifies the action (Searches) and the resource (grouped crash/ANR issues). While it uses a parenthetical API reference, it does not explicitly distinguish itself from the closely related sibling tool, `search_error_reports`.
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 description provides no guidance on when or why this tool should be used over other potential search or reporting tools (e.g., `search_error_reports`). The agent has no context for selecting this tool among its many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_error_reportsSearch error reportsBRead-onlyIdempotent
Searches individual crash/ANR reports with stack traces (Reporting API errorReports:search).
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Reporting API filter expression. | |
| page_size | No | ||
| page_token | No | ||
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds the meaningful granularity cue that results are individual reports containing stack traces, but says nothing about result volume, pagination, or filter semantics that matter for a search endpoint.
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 filler; it names the action, the data, and the source API method compactly. It is efficient, though it could spend one more clause on the sibling distinction or paging.
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 carries the burden of describing return shape, and it partially does so (individual reports with stack traces). However, for a paginated search tool with two undocumented paging parameters and no guidance against the sibling search endpoint, the definition is only minimally complete.
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 only 50%: filter and package_name are documented in the schema, while page_size and page_token are not. The description adds no parameter meaning at all, so it fails to compensate for the undocumented paging parameters.
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 (Searches) and resource (individual crash/ANR reports with stack traces), plus the underlying Reporting API method. This implicitly separates it from the sibling search_error_issues (reports vs issues), but the differentiation is left for the agent to infer 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?
No guidance on when to use this tool versus the closely named sibling search_error_issues, nor any prerequisites (e.g., package scope, filter syntax). The agent must guess which of the two search endpoints fits a given question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slow_rendering_rateSlow rendering rateARead-onlyIdempotent
Daily slow rendering rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days back from the latest available data (default 28). | |
| filter | No | Reporting API filter, e.g. "versionCode = 123". | |
| dimensions | No | Break down by dimensions, e.g. versionCode, apiLevel, deviceModel, countryCode. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered. The description adds genuinely useful behavioral context beyond that: the shape of the output (daily values), the inclusion of 7- and 28-day user-weighted aggregates, and the unit convention (fractions, 0.01 = 1%), which prevents a real misinterpretation of returned data.
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, front-loaded with the metric and source, with the second delivering the unit caveat. Nothing is wasted and no filler is present.
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 does part of the return-value work by stating the daily granularity, the 7/28-day aggregates, and the fractional unit. Missing only deeper return details (pagination, dimension output shape), which keeps it at 4 rather than 5.
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 100%, with days, filter, dimensions, and package_name each documented in the schema. The description adds no parameter-level detail (e.g. dimension syntax or filter semantics), so it sits at the baseline of 3.
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 metric ('Daily slow rendering rate from Android vitals') with named API source, which inherently separates it from metric siblings like crash_rate and anr_rate. However, it never explicitly names those siblings or explains how this differs from vitals_summary/vitals_by_version.
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 or mention of alternatives. The agent must infer that this is the tool for slow-rendering specifically, and cannot tell from the description when to prefer vitals_summary or vitals_by_version instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slow_start_rateSlow start rateARead-onlyIdempotent
Daily slow start rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days back from the latest available data (default 28). | |
| filter | No | Reporting API filter, e.g. "versionCode = 123". | |
| dimensions | No | Break down by dimensions, e.g. versionCode, apiLevel, deviceModel, countryCode. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds genuine behavioral context by disclosing the return shape ('7- and 28-day user-weighted values') and the value encoding ('0.01 = 1%'), which is not available in any structured field. It stops short of describing pagination or how the 7-/28-day values are keyed.
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 tight sentence that front-loads the metric identity and data source before the return-value and unit details. Every clause earns its place, with only minor compression possible.
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 carries the burden of explaining return values, and it does so adequately by naming the 7- and 28-day user-weighted values and the fraction encoding. For a read-only metric tool with fully documented parameters, this is nearly complete, missing only response structuring details.
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 100%, so all four parameters (days, filter, dimensions, package_name) are already documented in the schema, including defaults and examples. The description adds no parameter-level syntax or constraint details beyond the schema, so the baseline of 3 applies.
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 ('Daily slow start rate from Android vitals'), names the data source (Play Developer Reporting API), and clarifies the metric's composition (7- and 28-day user-weighted values) plus its unit ('fractions (0.01 = 1%)'). This clearly distinguishes it from sibling metrics like crash_rate, anr_rate, and slow_rendering_rate.
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 description explains what the tool returns but never says when to call it versus sibling vitals tools (crash_rate, anr_rate, vitals_summary), nor any prerequisites or exclusions. Usage is only implied by the metric name, leaving the agent to infer selection from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stuck_wakelock_rateStuck background wakelock rateARead-onlyIdempotent
Daily stuck background wakelock rate from Android vitals (Play Developer Reporting API), including 7- and 28-day user-weighted values. Rates are fractions (0.01 = 1%).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days back from the latest available data (default 28). | |
| filter | No | Reporting API filter, e.g. "versionCode = 123". | |
| dimensions | No | Break down by dimensions, e.g. versionCode, apiLevel, deviceModel, countryCode. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: rates are fractions (0.01 = 1%) and output includes 7- and 28-day user-weighted values.
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 two tightly written sentences. It front-loads the metric identity and source, then adds the essential unit clarification, with no redundant or filler content.
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 metric retrieval tool with full annotation coverage and complete parameter schema descriptions, the description covers the key contextual details: API source, rate units, and aggregation windows. Since no output schema exists, it could say a bit more about the returned data shape, but the essentials are present.
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 100%, so all four optional parameters (days, filter, dimensions, package_name) are already fully documented in the schema. The description adds no parameter-level meaning beyond what the schema provides, making the baseline 3 appropriate.
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 metric (stuck background wakelock rate) and its source (Android vitals via Play Developer Reporting API), and it clarifies the units (fractions where 0.01 = 1%). It does not explicitly differentiate from sibling rate tools such as excessive_wakeup_rate, but the metric name itself is sufficiently distinct.
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 description explains what the tool returns but gives no guidance on when to use it versus alternative vitals tools like vitals_summary, vitals_by_version, or other rate tools. There are no exclusions, prerequisites, or routing conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_app_detailsUpdate app detailsBIdempotent
Updates the app's default language and/or contact email, phone and website.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| contact_email | No | ||
| contact_phone | No | ||
| validate_only | No | Dry run: validate the change in an edit, then discard it. | |
| contact_website | No | ||
| default_language | No | BCP-47 language code, e.g. en-US |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered structurally. The description adds the set of mutable fields and the 'and/or' hint that updates may be partial, but it says nothing about permission requirements, the edit/commit transaction model typical of Play APIs, or what happens when no field is supplied.
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 filler, and the mutable-field list is stated immediately. It is efficient, though arguably under-specified rather than truly 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 6-parameter mutation tool with no output schema and only 50% parameter coverage, the description covers the core purpose and partial-update semantics but omits dry-run behavior, permission/auth context, and the transactional edit model an agent would need to call this correctly.
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 only 50% schema description coverage, the description compensates somewhat by enumerating the updatable fields (default_language, contact_email, contact_phone, contact_website). It does not, however, explain validate_only, package_name defaulting, or the format constraints on email/phone/website beyond what the schema already encodes, so it adds only marginal meaning.
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 names a specific verb and resource ('Updates the app's default language and/or contact email, phone and website'), so the agent knows exactly what is being changed. It does not, however, differentiate itself from the sibling get_app_details or clarify how it relates to other listing/app mutation tools.
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 mention of the sibling get_app_details as the read counterpart, and no explanation of the dry-run workflow that the schema's validate_only parameter enables. The agent must infer context entirely from the name and annotations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_listingUpdate store listingAIdempotent
Updates the store listing for one language. Only the fields you pass change. Limits: title 30, short description 80, full description 4000 characters.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| video | No | YouTube URL for the promo video. | |
| language | Yes | BCP-47 language code, e.g. en-US | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. | |
| full_description | No | ||
| short_description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds genuinely non-obvious mutation semantics — that unspecified fields are preserved rather than cleared — which is not derivable from the annotations. It does not mention permissions or whether the edit must be committed/published afterward.
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, front-loaded sentences with no filler; the core mutation semantics come first. The limits sentence slightly restates schema maxLength constraints, so it is mildly redundant rather than wasteful.
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 7-parameter partial-update tool with annotations present and no output schema, the description covers the essential behavior (patch semantics) and field bounds. It leaves out permission requirements and any post-update publishing step, but nothing critical to invoking it correctly is missing.
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 57%, and the schema already documents language (BCP-47), package_name (default), validate_only (dry run), and video. The description's character limits duplicate the maxLength constraints already in the schema for title, short_description, and full_description, so it adds little new parameter meaning.
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 (updates), resource (store listing), and scope qualifier (for one language), which cleanly separates it from siblings like list_listings, get_listing, and update_app_details. An agent can pick this tool 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?
"Only the fields you pass change" implies this is a partial/patch update and therefore the right tool when changing a subset of listing fields, which is useful implicit guidance. However, no explicit when-to-use vs. alternatives (e.g., update_app_details, get_listing, list_listings) or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_rolloutUpdate rolloutAIdempotent
Changes the percentage of a staged (inProgress) rollout, or completes it to 100% with complete: true. On production this requires confirm_production: true, otherwise it is a dry run.
| Name | Required | Description | Default |
|---|---|---|---|
| track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| complete | No | Roll out to 100% and mark the release completed. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. | |
| confirm_production | No | Must be true to change a production track. Without it the call runs as a dry run and returns a preview. | |
| rollout_percentage | No | New percentage (0 < x < 100). Omit when complete is true. | |
| changes_not_sent_for_review | No | Managed publishing: commit without sending for review. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is partly covered. The description adds genuinely useful behavior beyond the annotations: the production dry-run fallback and the fact that complete:true finalizes the release to 100%.
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 tightly written sentences with no filler. The primary operation is front-loaded and the production precondition follows immediately, so nothing can be skimmed past.
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 7-parameter mutation tool with no output schema, the description covers the two behaviorally risky parameters (complete, confirm_production) and the dry-run outcome. It omits return-value expectations and the managed-publishing/validate_only interactions, but the 100% schema coverage limits how much more is required.
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 100%, so all seven parameters are already documented in the schema, including complete, confirm_production, and rollout_percentage. The description restates the complete and confirm_production semantics without adding format or interaction detail beyond the schema, which is the expected baseline when the schema does the heavy lifting.
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 (changes/completes) and resource (staged inProgress rollout) with an explicit scope constraint ('staged (inProgress)'), which separates it from sibling tools like halt_rollout, resume_rollout, and promote_release. An agent can identify the operation 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 a clear precondition for use ('On production this requires confirm_production: true, otherwise it is a dry run') and implies the tool only applies to staged rollouts. It does not explicitly name alternatives (e.g., halt_rollout/resume_rollout) 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_testersUpdate testersAIdempotent
Adds and/or removes tester Google Groups on a testing track and shows the before/after difference. Replacing the whole list (replace) is destructive and needs PLAY_MCP_ALLOW_DESTRUCTIVE=1.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | ||
| track | Yes | Track: internal, alpha, beta, production, or a custom/form-factor track (e.g. wear:production). | |
| remove | No | ||
| replace | No | DESTRUCTIVE: the complete new list. Cannot be combined with add/remove. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description supplies real behavioral context (destructive replace, env-var guard, before/after diff), but it conflicts with the tool-level annotation destructiveHint=false by labeling the replace mode as DESTRUCTIVE. An agent reading the annotations could wrongly believe no operation here destroys data.
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 dense sentences, front-loaded with the core action and the diff behavior, followed by the destructive gating condition. 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?
For a 6-param mutation tool with no output schema, the description usefully notes the before/after diff return and the env-var prerequisite. It omits any mention of validate_only/package_name, though those are covered in the schema.
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 67%, and the schema already documents add/remove/replace semantics, mutual exclusivity, and the destructive flag. The description echoes the replace-is-destructive point but adds nothing about validate_only, package_name, or track formats, so it stays at the baseline.
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 specific verbs (adds/removes), a concrete resource (tester Google Groups on a testing track), and an extra behavior (before/after difference). This clearly distinguishes it from the read-only sibling get_testers and from the release/rollout tools.
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 explicit conditional guidance: use add/remove to mutate incrementally, and note that the replace mode is destructive and gated behind PLAY_MCP_ALLOW_DESTRUCTIVE=1. It does not explicitly contrast with siblings like get_testers or state when-not-to-use, 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.
upload_bundleUpload bundleA
Uploads an Android App Bundle (.aab) to the app's bundle library without assigning it to a track. Files over 10 MB use a resumable upload. Use deploy to upload and release in one step.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Path to the .aab file. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, non-idempotent, non-destructive, open-world, so the safety profile is already covered. The description adds genuinely new behavioral context: the staged outcome (file lands in the bundle library, not on a track) and the resumable-upload behavior for files over 10 MB, which the agent cannot learn from the annotations. It does not mention auth/permission requirements or failure modes, keeping 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?
Three short sentences, each carrying a distinct payload: what it does and where it lands, a size-based behavior, and the routing hint to the alternative. The primary purpose and scope are front-loaded with zero 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?
No output schema exists, but the description communicates the essential outcome (bundle uploaded, unassigned to any track) and the resumable-upload path. Since it is a non-idempotent mutation, extra detail on permissions or duplicate-upload behavior would help, but nothing critical for correct invocation is missing.
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 100% and all three parameters (file_path, package_name, validate_only) are documented in the schema itself, including the PLAY_MCP_PACKAGE default and the dry-run semantics of validate_only. The description adds only the implied file type (.aab) already present in the schema text, so the baseline 3 is appropriate.
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 (Uploads), resource (Android App Bundle .aab), and destination scope (the app's bundle library), plus the key limitation 'without assigning it to a track'. It explicitly contrasts with the sibling 'deploy', so an agent can distinguish the two 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?
Names the alternative tool ('Use `deploy` to upload and release in one step') and the condition that selects it, which directly answers when to pick this tool versus its closest sibling. The remaining implied condition (staging-only, no track assignment) is stated explicitly in the first sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_deobfuscation_fileUpload deobfuscation fileAIdempotent
Uploads a ProGuard/R8 mapping.txt for a version code, so crash stack traces are readable.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Path to mapping.txt. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| version_code | Yes | Version code the mapping belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive, idempotent write operation, so the safety profile is covered. The description usefully adds the semantic effect of the upload, but says nothing about permissions, whether re-uploads replace prior mappings, or rate 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?
A single, front-loaded sentence with zero waste: the action, the artifact, the key parameter, and the benefit are all packed in without redundancy.
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 file-upload tool with full schema coverage, annotations, and no output schema, the description is nearly sufficient. It could note prerequisites (e.g., existing version/release) to be fully complete.
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 100%, so all three parameters are documented in the schema itself (including the PLAY_MCP_PACKAGE default). The description adds no syntax, format, or constraint detail beyond what the schema provides, so baseline 3 applies.
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 (uploads) and resource (ProGuard/R8 mapping.txt) tied to a version code, plus the downstream effect (readable crash stack traces). No sibling tool does deobfuscation upload, so it is unambiguously distinguishable.
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 clause 'so crash stack traces are readable' implies the motivation for use, but there is no explicit when-to-use, when-not, or prerequisite guidance (e.g., whether the version code must already exist or be released). 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.
upload_imageUpload imageB
Uploads one listing image (PNG or JPEG, max 15 MB) of the given type for a language.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | BCP-47 language code, e.g. en-US | |
| file_path | Yes | Path to a .png, .jpg or .jpeg file. | |
| image_type | Yes | ||
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. | |
| validate_only | No | Dry run: validate the change in an edit, then discard it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the mutation/safety profile is covered. The description adds the genuinely useful 15 MB size cap (format is already in the schema's file_path description), but says nothing about whether the upload persists immediately or requires a subsequent commit, which matters for a non-idempotent write.
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 filler; the format and size constraints are packed in efficiently. It is appropriately sized for the tool, though one clause about persistence behavior would not hurt.
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 should carry more of the behavioral story. It covers format, size, and scope, but omits what happens after upload (persistence/commit model) and any permission requirements, which are material for a non-idempotent write 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 coverage is 80%, so the schema already documents language, file_path, package_name, and validate_only. The description only gestures at 'the given type for a language' with no additional semantics for image_type's enum or the dry-run flag, so it does not exceed the schema baseline.
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 ('Uploads one listing image') plus key constraints (PNG/JPEG, max 15 MB) and the scoping dimensions (type, language). It is clearly distinguishable from upload_bundle or upload_deobfuscation_file by the 'listing image' resource, though it never names a sibling 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 prerequisites (e.g. whether an edit/draft must exist first), and no routing to alternatives such as list_images or update_listing. Usage is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_internal_sharingUpload for internal app sharingA
Uploads an .aab or .apk to internal app sharing and returns a download link for testers. Bypasses tracks and review; links are for testing only.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Path to an .aab or .apk file. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the mutation profile is covered. The description adds genuine context beyond that: the operation bypasses tracks and review, and the produced link is testing-only, which tells an agent this is a side-channel rather than a production release path. Auth needs and rate limits are unaddressed, keeping it from 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 tight sentences with no filler; the core action and the return value are front-loaded, and the caveat about bypassing tracks/review follows. Every clause 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, the description usefully states the return value (a download link) and the testing-only nature of the artifact, which is what an agent most needs. Minor gaps remain around link persistence/expiry and whether the upload is scoped to the configured package, but the essentials are covered alongside rich annotations.
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 100%, so both parameters (file_path, package_name) are already documented in the schema down to accepted file types and the PLAY_MCP_PACKAGE default. The description restates the file-type detail but adds no new parameter meaning, so the baseline 3 applies.
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?
Specific verb (Uploads) + resource (.aab/.apk to internal app sharing) plus the outcome (returns a download link for testers). The phrase 'Bypasses tracks and review' distinguishes it from sibling publishing tools like upload_bundle and create_release without opening their schemas.
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 clearly frames the intended context ('for testers', 'links are for testing only') and contrasts with the normal track/review flow. It stops short of naming an explicit alternative tool or stating a hard when-not-to-use rule, so it is strong context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vitals_by_versionVitals by versionARead-onlyIdempotent
Compares vitals across version codes over a window (weighted by daily users), newest first, with the change versus the previous version — to see whether the last release made things worse.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Window in days (default 28). | |
| metric_sets | No | Default: crash and anr. | |
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: results are weighted by daily users, ordered newest first, and include the delta versus the previous version — all things an annotations-only view would not reveal.
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 dense sentence with no filler, front-loading the comparison and ordering before the motivation. It is slightly clause-heavy but every clause carries information, so no trimming is obviously warranted.
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 must convey the shape of results, and it does: per-version metrics, user-weighted, newest first, with change vs previous version. All parameters have defaults and no required inputs, so an agent has everything needed to call it correctly.
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 100%, with defaults documented for days, metric_sets, and package_name. The description's mention of a 'window' and user weighting adds context but no syntax or format detail beyond the schema, so the baseline 3 applies.
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 (compares) and resource (vitals across version codes) and specifies the grouping axis plus ordering ('newest first'). This cleanly distinguishes it from sibling per-metric tools like crash_rate and from vitals_summary, which does not segment by version.
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?
Ends with a clear use case — 'to see whether the last release made things worse' — which tells the agent when this tool is the right choice over a single-metric rate tool. It does not, however, explicitly name an alternative or state exclusions, so it stops 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.
vitals_freshnessVitals freshnessBRead-onlyIdempotent
For each vitals metric set, the latest date (and hour) for which data is available.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description usefully adds that the result is per metric set at date and hour granularity, but says nothing about return format, auth requirements, or how metric sets are enumerated.
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 sentence with no wasted words, and the key concept (latest available date/hour) is front-loaded. It is a noun phrase rather than a verb-led statement, but it is tight and readable.
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 low-complexity, single-optional-parameter tool with no output schema, the description conveys the shape of the return (per metric set, date plus hour), which is the essential information. It stops short of specifying the exact response fields or units, so it is adequate rather than complete.
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 100% and the single parameter (package_name) is documented in the schema, including its default. The description adds no additional parameter information, so the baseline 3 applies.
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 clearly states what the tool returns: the latest date and hour of available data per vitals metric set. It is specific about the resource (vitals freshness) but does not distinguish itself from sibling vitals tools such as vitals_summary or vitals_by_version, leaving the agent to infer the boundary.
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 explicit when-to-use guidance and no mention of alternatives. The purpose implies you would call it to check data availability before querying vitals metrics, but that inference is left entirely to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vitals_summaryVitals summaryARead-onlyIdempotent
All six vitals at once: the latest 28-day user-weighted value of each, flagged against Google's bad-behaviour thresholds (user-perceived crash rate 1.09%, user-perceived ANR rate 0.47%).
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | No | Android package name. Defaults to PLAY_MCP_PACKAGE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower. The description adds real behavioral context: the 28-day window, user-weighting, and that values are flagged against Google's bad-behaviour thresholds, with the specific crash (1.09%) and ANR (0.47%) cutoffs.
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 dense sentence, front-loaded with the aggregate scope and followed by the measurement window and flagging rule. No filler sentences.
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 carries the return-value burden, and it does state what is returned (latest 28-day user-weighted value per vital) and the flagging criterion. It stops short of saying what a 'flag' looks like (status vs. boolean), a minor gap for a summary 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?
There is one optional parameter and schema description coverage is 100%, with the schema already documenting package_name and its PLAY_MCP_PACKAGE default. The description adds nothing about parameters, so the baseline 3 applies.
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 resource (all six vitals) and scope (latest 28-day user-weighted value of each). The phrase 'all six vitals at once' implicitly differentiates it from the single-vital siblings (crash_rate, anr_rate, slow_start_rate, etc.), 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 only implied: an agent can infer this is the aggregate alternative to the six single-vital tools, but the description never says when to prefer it over them or when-not to use it. No prerequisites or exclusions are given.
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.
41 tool updates
v1.0.0- First observed
anr_rate - First observed
app_overview - First observed
check_asset_links - First observed
crash_rate - First observed
create_release - First observed
deploy - First observed
excessive_wakeup_rate - First observed
get_app_details - First observed
get_listing - First observed
get_review - First observed
get_testers - First observed
get_track - First observed
halt_rollout - First observed
list_anomalies - First observed
list_apps - First observed
list_bundles - First observed
list_images - First observed
list_listings - First observed
list_releases - First observed
list_reviews - First observed
list_tracks - First observed
promote_release - First observed
release_status - First observed
reply_to_review - First observed
resume_rollout - First observed
search_error_issues - First observed
search_error_reports - First observed
slow_rendering_rate - First observed
slow_start_rate - First observed
stuck_wakelock_rate - First observed
update_app_details - First observed
update_listing - First observed
update_rollout - First observed
update_testers - First observed
upload_bundle - First observed
upload_deobfuscation_file - First observed
upload_image - First observed
upload_internal_sharing - First observed
vitals_by_version - First observed
vitals_freshness - First observed
vitals_summary
TDQS
Scored across 41 tools
Most tools have clearly distinct purposes: upload_internal_sharing, upload_bundle and deploy are cleanly separated by intent, and the six vitals metrics are individually identifiable. The main overlap cluster is list_tracks/get_track/list_releases/release_status, four tools that all describe track-and-release state with subtly different scopes, which could cause misselection.
The action family consistently uses verb_noun snake_case (list_releases, create_release, promote_release, update_rollout, halt_rollout, reply_to_review), and the vitals family consistently uses metric-noun names (crash_rate, anr_rate, vitals_summary). A few noun-only names like release_status and app_overview deviate from the verb_noun convention, but the pattern stays predictable overall.
41 tools is well above the well-scoped range and sits in the heavy category, even accounting for the fact that Play Console spans releases, vitals, reviews, listings, images and testers. Some consolidation is plausible (e.g. merging track/release listing tools, or wrapping per-metric vitals tools behind a parameterised call).
Coverage is unusually thorough across release/rollout lifecycle, bundle uploads, vitals and error reporting, reviews, listings, images, testers and app details, with sensible dry-run/confirm semantics. Remaining gaps are adjacent domains rather than dead ends: no monetization (in-app products/subscriptions), no release deletion or rollback, and no way to create or manage tracks themselves.
Maintenance
Related MCP Connectors
Manage App Store and Google Play apps: listings, screenshots, builds, releases, reviews, metrics.
141Manage Meta apps: creation, configuration, webhooks, permissions, compliance, and App Review.
42matters MCP — wraps the 42matters App Market Data API (42matters.com)
- TieruxOAuthcom.tierux
Server-side purchase verification and entitlements for Google Play and Apple App Store over MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceManages Google Play Store listing text through the official Android Publisher API with dry-run-first safety, supporting CLI for humans/CI and MCP tools for agents.MIT
- AlicenseAqualityCmaintenanceAn MCP server that drives Google Play releases: bundle upload, track releases (internal/closed/open/production), listing metadata, store graphics, and review replies.8MIT
- 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
- AlicenseNot gradedqualityBmaintenanceEnables end-to-end Android app publishing to Google Play via the Developer API, including readiness checks, releases, promotions, reviews, and subscriptions.2MIT