Android Developer MCP by Nova (CIVAI)
Server Details
Ship a new Android app from chat. AI runs Google Play Console listings, screenshots, releases, uplo…
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 38 tools
Most tools have clearly distinct purposes, and the descriptions actively distinguish near-neighbours such as get_setup_state vs get_pre_submit_status vs get_app_submission_state, and upload_screenshot_asset vs upload_store_listing_graphic. However, the large cluster of update_* App content declaration tools and several release/status tools still creates some potential for misselection.
Tool names consistently use snake_case and generally follow a verb_noun or verb_object pattern: list_tracks, create_release, get_release, upload_bundle, start_rollout, update_privacy_policy. Deviations like setup_closed_testing are minor and still readable.
With 38 tools, the surface is very large for a single MCP server. While the domain is broad, this exceeds the typical 3-15 well-scoped range and risks overwhelming an agent during tool selection.
The tool set covers the full Play Console publishing lifecycle surprisingly well: app creation, listing updates, declarations, bundle upload, artifact attachment, track setup, rollout, review submission, permissions, and session handling. Minor gaps remain, such as reading back the current store listing text/graphics, but the core workflows are covered.
Available Tools
38 toolsattach_artifact_to_releaseAInspect
Attach an already-uploaded artifact (version code) to a release — the required step between upload_bundle and start_rollout. Uploading a bundle does NOT attach it, so without this the release has no artifact and start_rollout refuses. Identify the artifact by artifact_id, or give version_code and it is looked up among the app's processed artifacts. Carries the release's existing name and notes forward untouched. Reads the release back afterwards and returns attach_verified plus the attached version codes rather than assuming success. This does NOT publish — call start_rollout for that, and confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes | Numeric track id from list_tracks (the aliases "internal"/"production" are not accepted). | |
| release_id | Yes | The release to attach to, from get_track or create_release. | |
| artifact_id | No | Optional: the artifact id to attach. Omit and pass version_code instead to have it looked up. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| version_code | No | Optional: version code of the uploaded bundle; used to find the artifact when artifact_id is omitted. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it discloses the non-publishing scope, that existing name and notes are preserved untouched, and that the result is read back and reported as attach_verified rather than assumed. That is exactly the mutation-safety context an agent needs before a write 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?
One dense paragraph, front-loaded with the purpose and sequencing constraint, then the identification modes, then the side effects, then the exclusion. Every sentence carries distinct information and nothing is repeated from the 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?
There is no output schema, so the description must describe the return value, and it does ('returns attach_verified plus the attached version codes'). Combined with the pipeline placement and the non-publishing scope, 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 coverage is 100%, so the schema already documents all eight parameters and the baseline applies. The description only restates the artifact_id/version_code lookup pair and adds that the lookup runs against the app's processed artifacts; it adds no syntax or constraint beyond what the schema provides.
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 (attach an already-uploaded artifact to a release) and immediately positions it in the pipeline between upload_bundle and start_rollout. The 'uploading a bundle does NOT attach it' line eliminates the most likely confusion with its closest 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?
Explicitly says when it is required ('without this the release has no artifact and start_rollout refuses'), names the alternative for publishing (start_rollout), and adds a 'confirm with the user first' guardrail. There is no ambiguity about when to pick this tool versus upload_bundle or start_rollout.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_package_name_availabilityAInspect
Check whether a package name is available before creating a new app. Derived from web decompile recon, not the official API — uses the Play Console web session, not the service account.
| Name | Required | Description | Default |
|---|---|---|---|
| developer_id | Yes | Numeric Play Console developer id, from your console URL (play.google.com/console/u/N/developers/{this}/...). | |
| package_name | Yes | Target Android package name, e.g. com.example.myapp. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm the right one with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does something genuinely useful: it discloses that this is derived from web decompile recon rather than the official API, and that it rides the Play Console web session instead of the service account. That tells the agent the call is unofficial and session-dependent, which is the key risk. It does not cover failure modes, rate limits, or what an unavailable/error result looks like, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the purpose front-loaded and the caveat about provenance following immediately. Nothing here could be cut without losing signal.
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, so the description should say what a call returns (a boolean, an availability reason, a name-conflict detail) and what happens when the web session is stale. The auth prerequisite is covered in the schema rather than the description, which helps, but the return shape is left entirely unspecified for a check tool whose whole value is its answer.
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 developer_id, package_name, google_account_email, and notification_message are already fully documented, including the instruction to call list_accounts first and confirm with the user. The description adds no additional parameter meaning beyond the schema. 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 ('Check whether a package name is available') and scopes it to the pre-creation step, which implicitly distinguishes it from create_app and the other app-mutating siblings. A dedicated sibling differentiation sentence is absent, but the intent is unmistakable.
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 'before creating a new app' is an explicit usage trigger that tells the agent when to reach for this tool rather than calling create_app directly. There is no statement of when NOT to use it or what to do if the check is inconclusive, 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.
create_appAInspect
Create a brand-new Android app on Google Play — the one thing the official Android Publisher API cannot do. Derived from web decompile recon of Play Console's own client, not yet verified against a real call; uses the Play Console web session (browser_auth_profile.json), not the service account. Check package_name availability first.
| Name | Required | Description | Default |
|---|---|---|---|
| paid | No | Whether the app is paid. Default false. | |
| app_type | No | APP_TYPE_APP or APP_TYPE_GAME. | |
| app_class | No | PLAY_APP_CLASSIFICATION_UNSPECIFIED for a normal app (default), or EXTERNAL / THIRD_PARTY_APP_STORE / CREATOR. | |
| app_title | Yes | App title shown on the store listing. | |
| developer_id | Yes | Numeric Play Console developer id, from your console URL (play.google.com/console/u/N/developers/{this}/...). | |
| package_name | Yes | Target Android package name, e.g. com.example.myapp. | |
| default_language | Yes | Default app language, e.g. en-US. | |
| us_law_compliant | No | Confirms US law compliance. Default true. | |
| app_meets_guidelines | No | Confirms the app meets Play policy guidelines. Default true. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm the right one with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| distributes_on_android | No | Whether the app distributes on Android. Default true. | |
| distributes_on_windows | No | Whether the app also distributes on Windows. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does well: it discloses that the endpoint is derived from decompile recon and not yet verified, and that it relies on browser_auth_profile.json rather than the service account — both critical risk facts. It stops short of saying whether app creation is irreversible or what failure modes look like.
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 purpose, then the differentiator, then the auth caveat and the prerequisite. Every clause adds information an agent needs before calling.
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 13-parameter write operation with no output schema and no annotations, the description covers the essential unknowns: authentication path, unverified status, and a required pre-check. It would be stronger if it noted irreversibility of app creation or what a successful response contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across 13 parameters, so the schema already documents semantics; baseline 3 applies. The description adds only the package_name availability prerequisite, which is a useful cross-parameter hint but modest (baseline-plus rather than full description-level parameter guidance).
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 ('Create a brand-new Android app on Google Play') and immediately distinguishes it from siblings and from the underlying API by noting it is the one thing the official Publisher API cannot do. No ambiguity about what the tool produces.
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 prerequisite ('Check package_name availability first', pointing at the check_package_name_availability sibling) and specifies which auth path to use (Play Console web session, not service account). It lacks an explicit 'do not use when' clause, but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_releaseAInspect
Create a new draft release on a track. Play Console allows only one draft release per track at a time — fails clearly if one already exists rather than guessing its id. Optionally sets a release_name (cosmetic label only).
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes | Numeric track id (e.g. the long digits in the Play Console URL's .../tracks/<this>/..., not the human alias like "internal"). Call list_tracks first to find it. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| release_name | No | Optional cosmetic label for the release (not shown to users on Google Play). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does disclose non-obvious behavior: the Play Console limit of one draft per track, that the call fails clearly instead of silently guessing a release id, and that release_name is cosmetic. What it omits is whether the newly created draft's identifier is returned, which matters because attach_artifact_to_release would need it.
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, front-loaded with purpose, then the constraint, then the optional parameter note. Nothing is redundant and no sentence could be dropped 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 create operation on a 6-parameter tool with a fully described schema, the definition covers purpose, the key failure mode, and the optional field. It stops short of describing what comes back (no output schema exists), which leaves a small but real gap for an agent chaining into attach_artifact_to_release.
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 reinforces the semantics of release_name (cosmetic label only) but adds no syntax, format, or validation detail for track_id, play_app_id, or google_account_email beyond what the schema already documents.
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 first sentence names a specific verb and resource ("Create a new draft release on a track") and the word "draft" distinguishes it from siblings like promote_release, start_rollout, and get_release without those names needing to be listed. Scope is bounded further by the one-draft-per-track rule, so an agent knows exactly which operation it is choosing.
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 precondition (one draft release per track) is stated, which is real usage context, but there is no explicit routing guidance such as "use promote_release to move a draft forward" or "use update_track_countries to change track config". The agent must infer from the sibling names when this tool is the right entry point versus the other release-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declare_asset_ai_stateAInspect
Declare whether the store listing's images were created or edited using AI. Play Console's listing editor has a second step ("Review") carrying this REQUIRED regulatory declaration, and until it is answered the listing stays Draft, the dashboard's store_listings task stays incomplete, and send_app_for_review refuses with a bare FAILED_PRECONDITION — however complete the listing content is. DRY-RUN BY DEFAULT. This is a statement to a regulator about who made the images: ask the user, never infer it.
| Name | Required | Description | Default |
|---|---|---|---|
| commit | No | "true" actually declares. Omit or "false" for a dry run that lists the assets it would mark. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| ai_declaration | Yes | "not_ai_generated" (Play Console's "Don't label assets") or "ai_generated" ("Label assets as created or edited using AI"). Applies to every asset in the app's Asset Library, so confirm it is true of all of them. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so well: it discloses the dry-run-by-default behavior, the commit gate that makes the call actually write, the downstream blocking effects, and the ethical constraint that this is a statement to a regulator rather than an inferable fact. That is exactly the context an agent cannot get from structured fields.
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 dry-run warning and the regulatory framing are front-loaded, and every clause conveys actionable information. The middle sentence is long and stacks three separate failure consequences, which could be tightened, but nothing is 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 six-parameter mutation tool with no annotations and no output schema, the description supplies motivation, failure modes, safety posture, and even what the dry run returns (a list of assets it would mark). 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?
Schema coverage is 100%, so all six parameters are already documented, which sets the baseline at 3. The description adds real value on top by emphasizing DRY-RUN BY DEFAULT (the commit parameter's most dangerous misfire mode) and by framing ai_declaration as a fact to confirm with the user rather than deduce.
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 (declare) and a precise, narrow resource (whether the store listing's images were AI-created/edited), which is unmistakable against siblings like update_content_rating or update_data_safety. The scope — a regulatory declaration attached to the listing's images — is spelled out rather than implied.
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?
Explicitly tells the agent when this is mandatory (required Review step), what breaks without it (listing stays Draft, store_listings task incomplete, send_app_for_review returns FAILED_PRECONDITION), and how to source the value (ask the user, never infer). It also names the dry-run default up front so the agent knows the initial call is non-committal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enroll_play_app_signingAInspect
Read, or set, an app's Play App Signing enrolment. An app that is NOT enrolled CANNOT accept an .aab: upload_bundle returns 200 and Play then rejects the bundle during processing (error 3008), leaving a pending upload reference, no artifact, and an unexplained 400 from start_rollout. Call with action="status" first — that is read-only. Enrolment is PERMANENT, sets the app's signing identity for the life of the app and gives Google custody of the app signing key: get the user's explicit agreement to this specific action before enrolling, and ask whether Google should generate a fresh key or reuse another app's deployment key. There is no way to ship an .aab without it.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | "status" (default, read-only) or "enroll". | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| confirm_permanent | No | Required for action="enroll": must be exactly "yes". Only set it once the USER has agreed to this specific permanent change — not on a general approval to ship. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| reuse_deployment_key_app_id | No | Optional: numeric play_app_id of an existing app whose deployment key this app should share. Leave empty for Google to generate a fresh signing key, which is the right default unless the apps genuinely need a shared signing identity. The user's call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does it: enrolment is permanent, transfers custody of the app signing key to Google, is required for any .aab (with the concrete error 3008 / phantom-upload / 400-from-start_rollout chain described), and demands explicit user consent. That is exactly the irreversible-mutation disclosure an agent needs before calling.
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?
Front-loaded with purpose, then the failure mode, then the safety gate — a sensible order. Slightly redundant: the .aab requirement is stated twice ('CANNOT accept an .aab' and 'There is no way to ship an .aab without it'), and the error-chain sentence is dense, but almost every clause carries real decision value.
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 annotations and no output schema, the description covers the irreversibility, the prerequisite read call, and the consent requirement. The one gap is return behavior: it says action="status" is read-only but never says what status reports back, which matters 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 100%, so the baseline is 3; the description earns more by explaining that status is the read-only default and by framing reuse_deployment_key_app_id as a user decision where 'leave empty / fresh key' is the default. It doesn't restate developer_id or play_app_id, but the schema already handles those.
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?
Opens with a specific verb+resource pair: 'Read, or set, an app's Play App Signing enrolment.' It also distinguishes itself from the siblings that depend on it (upload_bundle, start_rollout) by explaining the failure mode when enrolment is absent, so an agent can place it in the workflow without opening a 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?
Explicit sequencing: 'Call with action="status" first — that is read-only,' then enroll only after user agreement on the specific permanent change. It also names the required alternative decision (Google-generated fresh key vs. reusing another app's deployment key), so the agent knows the exact branch to resolve before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_app_submission_stateAInspect
Has this app ever been sent for Google Play review? ANSWERS WHAT get_pre_submit_status CANNOT: that tool reported review_eligible: true for an unreviewed draft app that could not publish by any route. An app that has never been reviewed cannot be rolled out to production at all. ever_submitted_for_review is the trustworthy field. The status codes are RAW AND UNMAPPED on purpose — a previous guess reported a live in-review submission as REJECTED — so do not read a verdict into them; Play Console's Publishing overview is the authority on the real state. If the submission history cannot be read, this returns submission_state_known: false rather than guessing 'never submitted'.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it explains raw/unmapped status codes, warns against misreading them, names Play Console as the authority, and specifies the fallback `submission_state_known: false` when history cannot be read. It does not explicitly state read-only behavior or auth requirements, so it falls short of fully complete.
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 front-loaded with the core question and the sibling distinction, and most sentences earn their place by explaining trust, raw status codes, and fallback behavior. It is somewhat verbose with anecdotal warning language, but not 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?
Given no output schema and no annotations, the description still names the key return field `ever_submitted_for_review` and the fallback `submission_state_known: false`, which gives the agent a usable mental model of the result. It does not describe the full response shape, but it covers the behavior an agent most needs to avoid misinterpretation.
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 four parameters, including the required account identifier and app/developer IDs. The description adds no parameter-specific 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 clearly states the tool answers whether the app has ever been sent for Google Play review, naming the key field `ever_submitted_for_review`. It explicitly distinguishes this from sibling `get_pre_submit_status` and explains why that sibling is insufficient for this purpose.
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 gives a clear usage context by saying this answers what `get_pre_submit_status` cannot, and warns not to interpret raw status codes as a verdict. It does not spell out a full when-to-use/when-not-to-use rule set, but the sibling differentiation is explicit enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pre_submit_statusAInspect
Read-only: what Google Play still requires before this app is review-eligible. Reports each App Content declaration's state, the hub's blocking validation errors, the store listing's validation warnings, and whether the Publishing page considers the app blocked. review_eligible is conservative — if any source could not be read it is false and the unread source is listed in errors, so never report an app as clear on a partial answer.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| store_listing_id | No | Numeric store listing id (0 for the main listing). Defaults to 0. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does well: it explicitly declares the operation read-only and explains conservative review_eligible semantics, including that unread sources produce false and appear in errors. It does not mention authentication requirements, rate limits, or side effects beyond read-only status.
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 three sentences and front-loads the core purpose. Each sentence contributes useful information: the primary purpose, the reported status components, and the conservative partial-answer caveat.
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, but the description enumerates the key returned information: App Content declaration states, hub validation errors, store listing warnings, Publishing page blocked status, and the conservative review_eligible flag. Combined with the fully documented input schema, this gives an agent enough context to invoke and interpret the tool 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%, so the input schema already documents all five parameters in detail. The description adds no parameter-specific meaning beyond what the schema provides, which is appropriate for a baseline of 3 under high 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 states a specific read-only purpose: reporting what Google Play still requires before an app is review-eligible. It also enumerates the status sources it reports, making the tool's scope clear. It does not explicitly differentiate this tool from siblings such as get_app_submission_state or get_setup_state.
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 "before this app is review-eligible" implies the tool is used for pre-submission checks, giving some usage context. However, there is no explicit guidance on when to use this tool versus related sibling tools, nor any stated exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_releaseAInspect
Get a release's current state, including currently-attached artifacts and validation status — check this before start_rollout.
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes | Numeric track id (e.g. the long digits in the Play Console URL's .../tracks/<this>/..., not the human alias like "internal"). Call list_tracks first to find it. | |
| release_id | Yes | Release id on this track, from create_release/get_track. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden alone. 'Get' implies a read, and the return contents are named, but there is no statement about permissions, rate limits, or whether validation status can be stale/in-progress — meaningful gaps for an unannotated tool.
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 the action, the payload, and the workflow cue in that order. No filler, nothing to trim.
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 5 required ids, no annotations, and no output schema, the description covers the essential preconditions (read state, artifacts, validation) plus the workflow position. Auth or failure-mode context would complete it, but the schema handles the identifier complexity well.
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 every parameter is documented in detail (numeric vs alias ids, ordering hints like 'call list_tracks first'). 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 verb and resource ('Get a release's current state') and names the two things returned (attached artifacts, validation status). It clearly differs from mutation siblings like create_release or promote_release, though it doesn't explicitly contrast with the closest read sibling, get_track.
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?
Explicitly says 'check this before start_rollout', giving a concrete triggering condition. It stops short of when-not-to-use guidance or naming get_track as the alternative for track-level inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_setup_stateAInspect
Read the app dashboard's setup checklist. Returns which tasks are complete and which are still open (privacy_policy, app_access, ads, content_rating, target_audience, store_settings, store_listings, prod_countries, prod_release, ...). WARNING: the incomplete list is NOT a list of blockers — measured live, it listed 10 open tasks while Play Console's own Submit button was enabled and the app then submitted fine. It mixes real setup items with the action you are trying to take (sent_for_review), paths the app does not use (open, prereg_*) and consequences that only become true after review and rollout (prod_rollout, serving_in_prod). Still far better than get_pre_submit_status, which reads declarations and listing warnings only. For whether a submission can actually go through, use send_app_for_review's dry run (Play's blocked flag) or the Publishing overview. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so unusually well: it declares "Read-only" and discloses an empirically measured caveat that `incomplete` mixes real setup items with review-time consequences and unused paths. It stops short of covering auth/session prerequisites (relevant given refresh_browser_session/start_browser_auth siblings) or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries signal, but the parenthetical task list trails off into an ellipsis and the sibling comparison paragraph runs long relative to its payoff. Efficient but not tight.
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 adequately explains what comes back and warns about the misleading field — the main risk an agent faces here. Missing only environmental prerequisites (browser session/auth) that a Play Console scraper would likely need.
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 already documented in the schema, including the non-obvious "NOT the package name" distinction. The description adds no parameter-level meaning beyond that, 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 ("Read the app dashboard's setup checklist") and immediately specifies the return shape (complete vs. open tasks, with named task identifiers). It is clearly distinguishable from get_pre_submit_status, get_app_submission_state, and send_app_for_review, all of which it names.
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?
Explicitly routes the agent: use this for checklist state, do NOT interpret `incomplete` as blockers, prefer send_app_for_review's dry run or the Publishing overview for submission viability, and get_pre_submit_status is named as a weaker alternative. When/when-not/alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trackAInspect
Get one release track's current state by track_id, including every release on that track with its release_id, name, status and lifecycle state. This is how you find an existing draft release's id after create_release refuses a second draft.
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes | Numeric track id (e.g. the long digits in the Play Console URL's .../tracks/<this>/..., not the human alias like "internal"). Call list_tracks first to find it. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description still conveys read semantics through 'Get' and 'current state,' and it discloses the return contents at a high level. It also explains a specific error-recovery behavior involving create_release, though it does not explicitly state read-only safety, permissions, 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 with no waste. The core purpose is front-loaded, and the second sentence adds a specific operational scenario rather than repeating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, the description explains what is returned and when to use it. Required parameter details are fully covered by the rich schema, so the description is complete enough 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 coverage is 100%, so the schema already documents all five parameters thoroughly, including track_id and the account/app/developer ids. The description adds only that lookup is by track_id and does not supplement the remaining 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 gives a specific verb and resource: 'Get one release track's current state by track_id.' It also states what the result includes (every release with release_id, name, status, lifecycle state), which distinguishes it from get_release and 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?
It gives a clear use case: finding an existing draft release's id after create_release refuses a second draft. It does not explicitly name alternatives or exclusions, but the triggering context is concrete and useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_permissionsAInspect
Read one principal's current Play Console permissions by email — read-only, nothing changes. Works for a human teammate or a service account (…@….iam.gserviceaccount.com); both are the same user row keyed by email. Returns account-level permissions and, per app, the exact permission values already held. This is the prerequisite before grant_app_permission: an append has to preserve every app the principal already reaches, so read the current grants first and confirm them with the user.
| Name | Required | Description | Default |
|---|---|---|---|
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| target_user_email | Yes | The email whose permissions to read — e.g. the CI service account …@….iam.gserviceaccount.com. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account (the one acting). Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it declares read-only ('nothing changes'), explains that human and service-account principals share the same email-keyed row, and describes the return shape (account-level plus per-app values). It omits auth/permission requirements and error behavior, 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?
Front-loads purpose and read-only guarantee, then the grant_app_permission dependency. Slightly dense in the final clause, but every sentence contributes and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains what is returned (account-level permissions and per-app values), which is the key gap it must fill. It lacks detail on failure cases or what happens if the email is unknown, so not quite complete for a 4-param 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 100%, so baseline is 3; the description earns more by clarifying that both human and service-account emails resolve to the same user row keyed by email, which adds meaning to target_user_email beyond the schema text. It says nothing extra about notification_message, but the schema already documents it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one principal's current Play Console permissions by email') and distinguishes itself from the sibling mutation grant_app_permission. The agent can tell exactly what is returned and what is not (no writes).
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?
Explicitly names the prerequisite relationship: 'This is the prerequisite before grant_app_permission' and instructs reading current grants first and confirming with the user. Alternatives and sequencing are spelled out, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grant_app_permissionAInspect
Grant a principal (teammate or service account) access to ONE app, as an APPEND that preserves every existing app grant and all account-level permissions. Use it to give a CI service account release access to a newly-created app — the step the androidpublisher API cannot do for a release-scoped service account (it 403s, it cannot grant itself access); this runs on the owner's Play Console session. DRY-RUN BY DEFAULT: with commit omitted/not "true" it pre-reads and returns the exact before/after WITHOUT writing — show that to the user and get their explicit agreement to this specific account-permissions change, then re-run with commit="true". A relayed approval is not the user's approval. The write is append-only (refuses to drop or shrink any existing grant), scoped so account-level permissions are untouched, and re-reads afterwards to prove the append. For the permission set, prefer copy_permissions_from_app_id (copies an existing grant's values verbatim — matches the account's pattern and names no enum value).
| Name | Required | Description | Default |
|---|---|---|---|
| commit | No | Must be exactly "true" (or "yes") to actually write. Omit/anything else = dry-run that returns the before/after without writing. Only set it once the USER has agreed to this specific account-permissions change after seeing the dry-run. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| target_app_id | Yes | NUMERIC app id (from the Play Console URL) of the app to grant access to — NOT the package name. | |
| write_variant | No | Request shape for the grant write: "auto" (default) tries the known-good shapes in order. Pin a specific variant only when debugging a refused grant. | |
| permission_values | No | Alternative to copy_permissions_from_app_id: a JSON array of integer permission values for a least-privilege set, e.g. "[1,6]" (CAN_ACCESS_APP, CAN_MANAGE_TRACK_APKS — upload + testing-track release). | |
| target_user_email | Yes | The principal being granted access — e.g. the CI service account …@….iam.gserviceaccount.com. Must already exist on the account. | |
| google_account_email | Yes | The signed-in owner account email that is acting. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| copy_permissions_from_app_id | No | Preferred: numeric app id of an app the principal ALREADY has, whose permission values are copied verbatim onto the new grant. Matches the existing pattern and avoids naming any enum value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the dry-run default, the append-only refusal to drop/shrink grants, that account-level permissions are untouched, the owner-session execution context, and a post-write re-read to prove the append. It falls short of a 4-5 only because it omits failure/error modes beyond the 403 case (e.g., what happens if the principal doesn't exist, or what the returned before/after looks like).
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?
Front-loaded with the verb and scope, and the append-only constraint appears early. However, it runs long with somewhat repetitive framing ('as an APPEND that preserves every existing app grant' then later 'append-only... refuses to drop or shrink'), and the dry-run approval protocol spills across several sentences, so it is dense rather than tight.
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 9-parameter mutation tool with no annotations and no output schema, the description covers the safety model, the approval gate, the append semantics, the owner-context, and the verification re-read. An agent has everything needed to call it correctly once the user approves the dry-run.
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 modest value by pushing copy_permissions_from_app_id over permission_values, but the schema already documents the commit gating, the numeric-id caveats, and the enum values, so the description does not meaningfully extend parameter semantics.
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 ('Grant a principal access to ONE app') and immediately qualifies it as an append-only operation that preserves existing grants and account-level permissions. This distinguishes it from the sibling get_user_permissions (read) and points at copy_permissions_from_app_id as the companion, so an agent can identify the 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?
Gives an explicit concrete use case (CI service account release access to a newly-created app) and explains why the alternative path fails ('the androidpublisher API... 403s, it cannot grant itself access'). It also names the preferred parameter alternative ('prefer copy_permissions_from_app_id') and prescribes the exact dry-run-then-commit workflow, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsAInspect
List which Google accounts are signed in to this browser session, with their X-Goog-AuthUser slot index. For visibility/debugging only.
| Name | Required | Description | Default |
|---|---|---|---|
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It conveys read-only semantics and what is returned, which is useful, but says nothing about behavior when no accounts are signed in, whether the slot index is stable, or that the output is session-local and may be empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler. The purpose is front-loaded and the constraint ('only') closes it out efficiently.
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 parameterless read-only listing with no output schema, the description tells the agent what the call returns and why to use it. Minor gap: no hint about empty results or that the data is purely diagnostic, 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 there is only one optional parameter (notification_message), so the schema already does the explaining. The description adds nothing about it, which is acceptable at baseline 3 but no better.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List which Google accounts are signed in') plus the exact data returned ('X-Goog-AuthUser slot index'). The scope is tightly bounded to 'this browser session,' which implicitly separates it from siblings like start_browser_auth and refresh_browser_session, 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?
'For visibility/debugging only' gives a clear usage context and a soft exclusion (don't build on this for auth logic). It stops short of naming an alternative tool (e.g., refresh_browser_session) for when the agent actually needs to fix a stale session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_appsAInspect
List apps on this Play Console developer account. Derived from web decompile recon, not the official API.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Max results per page. Default 500. | |
| page_token | No | Pagination token from a previous call. | |
| developer_id | Yes | Numeric Play Console developer id. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm the right one with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does add genuinely useful context: this is derived from web decompile recon, not the official API, warning the agent about potential fragility. However it says nothing about auth/session requirements (relevant given siblings like start_browser_auth and refresh_browser_session) 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?
Two short sentences, purpose front-loaded, and the caveat about provenance follows immediately. Nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter read tool with full schema coverage and no output schema, the description plus schema give an agent enough to call it correctly. The only missing piece is any hint about the shape or size of the returned app list, which matters modestly for a paginated 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% and every parameter, including the ordering hint to call list_accounts first and the notification_message constraint, is documented in the schema. The description adds no parameter meaning beyond that, 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 ('List apps') scoped to 'this Play Console developer account', which distinguishes it from mutating siblings like create_app and from list_accounts/list_tracks. It does not explicitly name an alternative, 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?
Usage is implied by the scope phrase 'on this Play Console developer account', and the prerequisite of resolving the account lives in the google_account_email schema description rather than the tool description. No when-not-to-use or alternative routing is given in the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tracksAInspect
List an app's release tracks and their track_id — call this first to find the track_id other release tools need.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that this is a prerequisite listing operation returning track_id, but it does not cover permissions/auth requirements, account constraints, pagination, or the full return 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?
The description is a single efficient sentence with the operation and the key sequencing instruction front-loaded. There is no redundant or wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with fully described parameters and no output schema, the description is mostly complete: it identifies the returned track_id and explains why to call it first. It could still mention pagination or the broader return structure, but no critical gap prevents 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%, so the schema already documents all four parameters in detail. The description adds no parameter-level semantics beyond referencing the returned track_id, so the baseline score of 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 uses a specific verb and resource ('List an app's release tracks') and names a key return field ('track_id'). It distinguishes the operation from mutation tools like create_release, though it does not explicitly contrast with the sibling get_track.
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 says to call this first to find the track_id needed by other release tools, giving strong sequencing guidance. It does not name alternatives such as get_track or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_releaseAInspect
Promote an existing release to another track WITHOUT re-uploading the bundle. WARNING, measured 2026-10-28: it creates an EMPTY draft release — it does NOT carry the artifact across, despite what this description used to claim. ALWAYS follow it with attach_artifact_to_release and check attach_verified, or start_rollout will refuse because the release has no artifact. Its new_release_id also echoes the SOURCE release id, so read the destination with get_track rather than trusting the echo. It does NOT publish; call start_rollout afterwards and confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| release_id | No | Release id on the source track (from get_track/create_release). Pass this or version_code. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| version_code | No | Android version code of the build to promote; the release carrying it is looked up on the source track. Pass this or release_id. | |
| source_track_id | Yes | Numeric track id the release is on now. Call list_tracks first — the human alias ("internal") is not accepted. | |
| destination_track_id | Yes | Numeric track id to promote to. Call list_tracks first — the human alias ("production") is not accepted. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden and does so exceptionally: it discloses the empty-draft bug, the incorrect new_release_id echo, the non-publishing behavior, and the artifact precondition for start_rollout. There is no annotation coverage for safety/read-write profile, but the mutation semantics and its real-world side effects are clearly surfaced; only the auth/permission profile and pagination/return shape are left implicit.
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?
Front-loaded with the core action, then warnings, then follow-up steps — a sensible ordering. It is dense and uses heavy emphasis, but nearly every clause delivers a distinct, actionable caveat; only the 'despite what this description used to claim' aside is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation mutation tool with a rich schema, the description supplies the missing pieces an agent truly needs: the downstream chain, the known bug, the unreliable echo field, and the publish step. Given no output schema exists, it even compensates by telling the agent where to verify results.
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 the schema already documents all 8 parameters including the release_id/version_code alternatives and the numeric track-id requirement. The description adds workflow semantics (destination id must be read via get_track) but does not add per-parameter meaning beyond what the schema provides, 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 ('Promote an existing release to another track') and immediately adds the key scope constraint 'WITHOUT re-uploading the bundle,' which distinguishes it from create_release/upload_bundle. The mechanism (source track -> destination track) is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent through the required workflow: always follow with attach_artifact_to_release, then start_rollout, and use get_track instead of trusting the echoed id. It also states a when-not ('It does NOT publish') and names the consequence of skipping steps. Nothing 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.
refresh_browser_sessionAInspect
Refresh the saved Play Console session in place, with no new browser sign-in. Google rotates the __Secure-1PSIDTS/__Secure-3PSIDTS session cookies about every 10 minutes; the captured copy goes stale and every tool then returns 401 UNAUTHENTICATED — or list_accounts returns an empty list — even though the user never signed out. Every tool already retries this automatically on a 401, so call it deliberately before a long sequence, or to tell a stale cookie apart from a session that has genuinely ended (if this succeeds and no account is signed in, only start_browser_auth will help).
| Name | Required | Description | Default |
|---|---|---|---|
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly delivers: it explains the 10-minute cookie rotation, the resulting 401/empty-list symptoms, and that all other tools retry this automatically. It stops short of describing what a failed refresh looks like versus a transient error, or any cost/latency of the in-place refresh.
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?
Front-loaded with the action and its key constraint, and the diagnostic/alternative guidance is packed efficiently. The middle clause about cookie rotation is dense and slightly run-on, but no sentence 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 zero-required-param, no-output-schema tool with no annotations, the description covers purpose, trigger conditions, failure modes and the fallback path. It only omits what a successful versus failed refresh returns, which an agent calling it deliberately would want to know.
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 optional parameter and schema coverage is 100%, so the schema already fully documents notification_message; the description adds nothing about it. Baseline 3 applies since the schema does the work.
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 ('Refresh the saved Play Console session in place') and immediately narrows the semantics with 'no new browser sign-in', distinguishing it from start_browser_auth. An agent can tell what it does and what it is not 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 explicit when-to-use conditions ('before a long sequence', 'to tell a stale cookie apart from a session that has genuinely ended') and an explicit exclusion ('Every tool already retries this automatically on a 401'). It also names the only alternative when this fails: start_browser_auth.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_app_for_reviewAInspect
Send the app's pending changes to Google Play review — the API behind Play Console's "Send app for review". OUTWARD-FACING AND NOT FREELY REVERSIBLE: for an app that has never shipped this is the submission that decides whether it can be published at all. DRY-RUN BY DEFAULT — it reports what would be sent and sends nothing until commit="true". Confirm with the user first, exactly like start_rollout. It fetches the publishing page's continuation token itself and round-trips it, which is what Play actually requires; the dry run also reports Play's own blocked flag, the best machine-readable "can this be sent?" in this capture. A FAILED_PRECONDITION here is NOT reliably a setup-task problem — that was wrong for a whole session. Read the dry run's publishing_page block and Play Console's Publishing overview before blaming the app's state.
| Name | Required | Description | Default |
|---|---|---|---|
| commit | No | "true" actually submits. Omit or "false" for a dry run. Never pass "true" without the user's explicit agreement in this conversation. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| include_sections | No | Comma-separated non-track sections to include: store_listing, store_settings, app_content, preregistration, advanced_distribution. Mirrors the Publishing overview's own groups - include each group that shows pending changes. | |
| review_behaviour | No | "review_immediately" (default) or "queue_for_review". | |
| include_track_ids | No | Comma-separated numeric track ids whose pending changes this submission covers (AppChangesToInclude.trackIds). Play Console always sends this selection; with neither this nor a section list the server has an empty selection and answers FAILED_PRECONDITION. To submit everything pending, pass every track that has pending changes on the Publishing overview. | |
| number_of_changes | No | The number of pending changes being submitted, exactly as Play Console's own "Submit N changes for review" button reads it. REQUIRED IN PRACTICE: Play treats this as a confirmation count and answers FAILED_PRECONDITION when it is missing, even when the Console's own button is enabled on the same pending set. Read N from the Publishing overview; do not guess. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| publishing_behaviour | No | "automatic" (default — changes go live as soon as review passes) or "manual" (hold for a manual go-live). Confirm which the user wants. | |
| send_session_headers | No | Diagnostic only. "true" also sends the Console's own X-Play-Console-Session-Id and Accept-Language headers. Measured 2026-10-28: these are NOT required - the submission succeeds without them. Leave unset unless a write is refused for a reason the payload cannot explain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it flags the operation as outward-facing and not freely reversible, notes that for a never-shipped app this decides publishability, discloses the dry-run default, the continuation-token round-trip, the blocked flag on the dry run, and the misleading FAILED_PRECONDITION semantics. It stops short of describing what a successful commit returns or how long review typically takes, so it is not exhaustive.
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 most important constraint — outward-facing, dry-run by default — is front-loaded in the first two sentences. The remainder is dense with operative warnings, though the aside about a past session being wrong is editorial and slightly chatty rather than instructional.
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, annotation-free, no-output-schema mutation of this severity, the description covers risk, defaults, confirmation, token mechanics, and failure-mode interpretation. It leaves success/return verification implicit — the agent is not told how to confirm the submission landed beyond reading the dry run — which keeps it just short of 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 each of the 11 parameters is already documented in the schema, which sets the baseline at 3. The description reinforces the commit gate and the dry run's blocked/publishing_page outputs, but adds little parameter-level syntax or interaction detail beyond what the schema already states for include_sections, include_track_ids, number_of_changes, and review_behaviour.
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 — sending the app's pending changes to Google Play review — and anchors it to the exact Play Console action it mirrors. It is clearly distinguishable from siblings like start_rollout (already-shipped releases), submit_prod_access_application (access request), and get_app_submission_state (read-only inspection).
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?
Explicitly says to confirm with the user first, ties the pattern to start_rollout, and explains that the default is a dry run that sends nothing until commit="true". It also gives concrete guidance on interpreting a FAILED_PRECONDITION (read the dry run's publishing_page block and the Publishing overview before assuming a setup-task problem), which is exactly the when/when-not routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_closed_testingAInspect
Set up a track's testers: creates or updates a tester email list and attaches it to the track as an audience group. Google requires a personal developer account to run a closed test with a minimum tester count for a minimum number of days before it can even APPLY for production access — this starts that clock, and reports the live required-vs-current tester and day counts so the gap is a number. DRY-RUN BY DEFAULT.
| Name | Required | Description | Default |
|---|---|---|---|
| commit | No | "true" applies the change. Omit or "false" for a dry run. | |
| track_id | Yes | Numeric track id — call list_tracks first. Use the closed/alpha track for the production-access requirement. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| tester_emails | No | Comma-separated Google account emails of testers. Real accounts that will install the app — Play counts installs, not invitations. | |
| tester_list_name | No | Name of the tester email list (default "Closed testers"). An existing list with this name is updated rather than duplicated. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does meaningful work: it declares DRY-RUN BY DEFAULT, discloses the Google personal-developer-account requirement, and says the tool reports live required-vs-current tester and day counts. It stops short of describing what committing changes does to the live track's audience or what the final response looks like in detail.
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 purpose is front-loaded in the first sentence and the middle sentence earns its length by explaining why the tool exists. The critical DRY-RUN BY DEFAULT warning lands at the end, where it is easy to skim past, which slightly weakens the structure.
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 8-parameter mutation tool with no annotations and no output schema, the definition covers the safety default, the account constraint, and the reporting behavior. Minor gaps remain around what commit actually changes on the live track and the exact return payload.
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 every parameter is documented there, including commit, track_id, tester_emails, and tester_list_name. The description adds no parameter-level syntax or format detail beyond the schema, 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/updates a tester email list and attaches it to a track as an audience group — which is distinct from siblings like update_track_countries or attach_artifact_to_release. The production-access framing further pins down what the tool is for.
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?
Explains the scenario that selects this tool (starting the closed-test clock required before applying for production access) and the schema reinforces the prerequisites (call list_tracks first, list_accounts first, use the closed/alpha track). It does not name explicit alternatives or when-not-to-use cases, 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.
start_browser_authAInspect
Open App Store Connect sign-in only when needed. If the saved session is still valid, this tool returns success immediately and does not open the viewer. Call session_status first. Use force_reconnect only when the user explicitly wants to wipe the saved cookie and sign in again (destructive).
| Name | Required | Description | Default |
|---|---|---|---|
| force_reconnect | No | DESTRUCTIVE: delete the saved session cookie for this tenant, then open the viewer for a fresh sign-in. Do not set true unless the user explicitly asks to sign out / reconnect / clear session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the no-op/idempotent short-circuit when a saved session is valid, that the viewer is not opened in that case, and that force_reconnect destroys the saved cookie. It does not say whether the call blocks while the user signs in or what a failure result looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the default safe behavior, then the prerequisite, then the opt-in destructive path. Nothing extraneous; the repeated 'destructive' emphasis is proportionate to the risk.
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?
Covers the branching behavior, prerequisite, and risk for a one-parameter tool with no output schema. The only gap is what the tool returns or how long it blocks during interactive sign-in.
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% and the single parameter is already well documented, so baseline is 3; the description adds a usage-level condition (only on explicit user request to sign out/reconnect/clear session) that reinforces the destructive semantics beyond the schema 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 ('Open App Store Connect sign-in') plus the scope constraint ('only when needed'), and names the sibling that should gate it (session_status). An agent can distinguish it from login and session_status without further reading.
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?
Explicit ordering ('Call session_status first') and an explicit exclusion for the destructive path ('Use force_reconnect only when the user explicitly wants to wipe the saved cookie'). Both when-to-use and when-not-to-use are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_rolloutAInspect
Roll out a release — this IS Android's publish action for the release. Not simply reversible; always confirm with the user, especially on production. Preconditions it cannot satisfy itself: the release needs an artifact attached (attach_artifact_to_release — promote_release does NOT attach one), and the track needs at least one EXPLICITLY selected country (target_rest_of_world alone is not a selection — see update_track_countries). A bare FAILED_PRECONDITION here names nothing: open the Console's release review page (.../tracks/{track}/releases/{release}/review) and expand its errors, which is read-only and states the cause in one sentence. Production additionally requires the app to have passed review once.
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes | Numeric track id (e.g. the long digits in the Play Console URL's .../tracks/<this>/..., not the human alias like "internal"). Call list_tracks first to find it. | |
| release_id | Yes | Release id on this track, from create_release/get_track. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| rollout_percentage | No | Percentage of users to roll out to, 0-100. Defaults to 100 (full rollout) if omitted. | |
| targeted_countries | No | Comma-separated ISO 3166-1 alpha-2 codes, e.g. "NG,GH,KE". NOTE: on a track that has no country targeting of its own this does NOT work — tested live, Play still refuses. Use update_track_countries to set the track's countries first; this parameter only narrows a rollout on a track that is already targeted. Nothing is defaulted — ask the user. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| target_rest_of_world | No | "true" serves every country/region Play allows; "false" serves only targeted_countries. Omitted is NOT the same as "false" — it keeps whatever the track already targets. Same caveat as targeted_countries: it cannot stand in for update_track_countries on an untargeted track. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it declares the operation not simply reversible, requires user confirmation, gates production on a prior review pass, and explains the failure mode. It does not describe the success response or what the returned rollout state looks like, which is a remaining gap given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive action and its confirmation requirement, and nearly every sentence earns its place. The FAILED_PRECONDITION sentence is dense and slightly run-on, costing some readability.
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 9-parameter, annotation-free mutation with no output schema, the description covers safety, preconditions, and error recovery well. It leaves the return/rollout-state behavior and the effect of the rollout_percentage/target_rest_of_world defaults unaddressed in prose.
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 genuine cross-parameter meaning: target_rest_of_world alone is not a valid country selection, and targeted_countries only narrows an already-targeted track. That interdependence is behavioral, not merely per-field.
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 ("Roll out a release") and immediately defines the scope: "this IS Android's publish action for the release." That framing cleanly separates it from the sibling promote_release and attach_artifact_to_release.
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?
Explicitly names when to use it (publish a prepared release), when to stop and confirm with the user (always, especially production), and the exact prerequisites plus the sibling that satisfies each (attach_artifact_to_release, update_track_countries). It even routes the agent to a read-only diagnostic path for a bare FAILED_PRECONDITION.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_prod_access_applicationAInspect
Submit the production-access application questionnaire for a personal developer account. Only possible once the closed-testing tester/day requirement is met (see setup_closed_testing and get_setup_state). All ten answers are the developer's own words about their testing — never invent them. DRY-RUN BY DEFAULT.
| Name | Required | Description | Default |
|---|---|---|---|
| commit | No | "true" submits. Omit or "false" for a dry run. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| tester_feedback | No | What feedback testers gave (free text). | |
| intended_audience | No | Who the app is for (free text). | |
| tester_engagement | No | How testers engaged with the app (free text). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| app_value_or_uniqueness | No | What the app offers users (free text). | |
| testing_induced_changes | No | What changed as a result of testing (free text). | |
| subsequent_round_changes | No | Changes planned after launch (free text). | |
| expected_first_year_installs | No | zero_to_ten_thousand | ten_thousand_to_one_hundred_thousand | one_hundred_thousand_to_one_million | one_million_or_more | i_dont_know | |
| production_readiness_decision | No | Why the app is ready for production (free text). | |
| tester_recruitment_difficulty | No | very_difficult | difficult | neither | easy | very_easy | |
| tester_recruitment_methodology | No | How testers were recruited (free text, the developer's own words). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full load, and it does disclose the single most important behavioral trait: it is a dry run unless commit is set, so the safe default is preview. It also discloses the blocking precondition. It stops short of saying what a dry run returns, whether a real submission is reversible, or what happens after submission, which matters for a mutation of this weight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences ordered by what → precondition → content rule → safety default, with no filler. The 'DRY-RUN BY DEFAULT' fragment is deliberately front-loaded as the last and most operationally important signal.
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 15-parameter mutation with no annotations and no output schema, it covers purpose, gating, content sourcing, and dry-run safety — everything needed to avoid a wrong call. What's missing is post-call behavior: what the dry run echoes back, whether submission is irreversible, and whether re-submission after rejection is allowed.
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 the baseline is 3; the description earns a point above it by constraining how the free-text answer parameters must be sourced ('the developer's own words about their testing — never invent them'), which the schema cannot express. It also reinforces the commit parameter's default behavior at the description level rather than leaving it buried.
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 ('Submit the production-access application questionnaire') scoped to 'a personal developer account', which no sibling tool covers. The prerequisite reference to setup_closed_testing and get_setup_state lets an agent place it precisely in the workflow 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?
Explicit gating condition ('Only possible once the closed-testing tester/day requirement is met') plus named tools to verify that condition before calling. It also sets a content rule — answers must be the developer's own words, never invented — which is usage guidance an agent would otherwise get wrong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ads_declarationAInspect
Declare whether the app contains ads, using Play Console's own web session. Mandatory App content declaration required before a new app is eligible for production submission/review.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| contains_ads | Yes | "true" if the app shows ads, "false" otherwise. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that the tool uses Play Console's own web session and that the declaration is mandatory before production submission/review, but it does not describe authentication/session prerequisites, side effects, or what happens after the declaration.
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 concise sentences with no wasted language. The core action is front-loaded, followed immediately by the mandatory production-eligibility context.
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 purpose and pre-submission requirement, and the schema is fully documented. However, for a mutation tool with no annotations or output schema, it leaves out session/auth handling and post-declaration behavior that an agent may need to reason about.
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 explains the parameters. The description mirrors the contains_ads parameter but adds no extra meaning or format guidance 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 verb and resource: declaring whether the app contains ads. This is clearly distinct from sibling declaration tools such as update_data_safety or update_content_rating, so an agent can identify the correct tool 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?
It gives clear usage context by stating this is a mandatory App content declaration required before a new app is eligible for production submission/review. It does not explicitly name alternatives or when-not-to-use cases, which keeps it 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_content_ratingAInspect
Submit and apply the mandatory IARC content rating questionnaire, using Play Console's own web session. Only content_rating_category="all_other_app_types" (every question answered No, producing the lowest possible rating) is currently supported — the correct choice for a brand-new app with no mature content.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| content_rating_category | Yes | Must be "all_other_app_types" — the only supported value right now. Games and Social/Communication apps need a different questionnaire path not yet supported. | |
| content_rating_contact_email | Yes | Contact email for content rating authorities / IARC correspondence. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations the description carries the full burden and does add real context: it runs through a Play Console web session (auth/session dependency) and answers every question No, producing the lowest possible rating. It does not disclose whether the submission is reversible, whether it can be resubmitted or edited later, or what a session failure looks like — significant for a filing submitted to an external authority (IARC).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the core action first and the limitation second — front-loaded and free of filler. The parenthetical is dense but earns its place by quantifying the rating outcome.
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 six-parameter mutation with no annotations and no output schema, the description covers the what and the category restriction but leaves out prerequisites (signed-in session, account confirmation), reversibility, and what the tool returns on success. Adequate to start a call, not enough to predict its effects.
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 the baseline is 3. The description reinforces the content_rating_category constraint and explains its consequence (lowest possible rating), but adds nothing about the other five parameters, including the account/app identifiers and the notification_message fallback behavior already documented 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+resource ("Submit and apply the mandatory IARC content rating questionnaire") and names the mechanism ("Play Console's own web session"). Clearly distinguishable from siblings like update_data_safety, update_target_audience_content, or update_policy_declaration, which are different declaration forms.
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 strong positive condition ("correct choice for a brand-new app with no mature content") and implicitly excludes games/social apps from the supported path. What's missing is ordering/prerequisite guidance — e.g., whether this must precede send_app_for_review or get_pre_submit_status — which matters given the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_data_safetyAInspect
Submit the Data safety declaration. data_collection="none" declares the app collects and shares NO user data; data_collection="collects" files the per-data-type questionnaire from data_types. REQUIRES update_privacy_policy to have been called first. This is a public, legally-meaningful statement about the app: "none" is a FALSE declaration for any app that collects anything at all, including a push notification token, so confirm what the app actually collects with the user rather than assuming. Nothing is defaulted on your behalf — an unknown data type or a missing purpose is refused, not approximated. An app where users can sign up must also answer the account section (questions 92-96); pass the real account_creation_methods plus the deletion URLs rather than defaulting to "none", which publicly declares the app has no sign-up.
| Name | Required | Description | Default |
|---|---|---|---|
| data_types | No | Required when data_collection="collects". JSON array, one object per data type the app collects or shares: {"type": <data type>, "collected": bool, "shared": bool, "ephemeral": bool, "required": bool, "collection_purposes": [...], "sharing_purposes": [...]}. "required" means users cannot use the app without providing it. Purposes: app_functionality, analytics, developer_communications, fraud_prevention_and_security, advertising_or_marketing, personalization, account_management. Data types include name, email_address, phone_number, physical_address, user_ids, purchase_history, payment_info, device_or_other_ids, approximate_location, precise_location, photos, videos, contacts, crash_logs, diagnostics, app_interactions, installed_apps, files_and_docs, health_info, fitness_info — the tool's error detail lists the full set if one is rejected. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| data_collection | Yes | "none" (app collects/shares nothing) or "collects" (then data_types is required). | |
| data_deletion_url | No | Public https URL where users request data-only deletion (question 96). Needed when supports_data_deletion is "yes". | |
| account_deletion_url | No | Public https URL where users can request account deletion (question 94). Play requires this once the app declares real account creation. Must be reachable without signing in. | |
| encrypted_in_transit | No | Required when data_collection="collects": "true"/"false" — is all collected user data encrypted in transit? Confirm with the user; do not assume. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| supports_data_deletion | No | Question 95 — can users delete their data WITHOUT deleting the whole account? It looks like a yes/no but is a three-way choice: "yes", "no", or "no_auto_deleted" (the app deletes the data automatically). Confirm with the user. | |
| account_creation_methods | No | For data_collection="collects": how users create accounts in the app. MANDATORY for Play (omitting it makes the submission fail with a bare INVALID_ARGUMENT), so it is always sent. Comma-separated — question 92 is a MULTIPLE choice and an app can offer several. Values: none, other, user_id_and_password, user_id_and_other_auth, oauth, user_id_password_and_other_auth, non_app_account, id_through_product_or_service, enterprise_app. "none" means the app has NO sign-up at all and cannot be combined with another value — it is a false declaration for any app with a login, so confirm with the user. Anything other than "none" makes Play require follow-ups; the tool reads the app's live questionnaire and tells you exactly which of account_creation_method_other, account_deletion_url, supports_data_deletion and data_deletion_url it needs. | |
| user_can_request_deletion | No | Required when data_collection="collects": "true"/"false" — can users request that their data be deleted? Confirm with the user; do not assume. | |
| account_creation_method_other | No | Free text describing the sign-up method, for question 93. Required when account_creation_methods includes "other". Ask the user; do not invent a description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses that the call is a public, legally-meaningful filing, that nothing is defaulted, that unknown data types or missing purposes are refused rather than approximated, that omitting account_creation_methods fails with a bare INVALID_ARGUMENT, and that the tool reads the live questionnaire to report which follow-ups are required. That is a genuinely informative behavioral profile for a mutation tool.
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?
Front-loaded with the action and the mode split, and nearly every clause carries decision-relevant content. It is a dense single block, though, and the "confirm with the user / don't assume" warning is effectively repeated three times, which costs it a point against a strict every-sentence-earns-its-place bar.
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 13-parameter, no-annotation, no-output-schema mutation tool, the description supplies the missing scaffolding: prerequisite ordering, refusal semantics, the mandatory-argument failure mode, and the fact that the tool will report required follow-ups. Nothing an agent needs in order to call it safely is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by attaching consequences to parameter values rather than restating them — what "none" publicly asserts, why account_creation_methods is always sent, and how the questions 92-96 cluster depends on prior answers. It stops short of covering the deletion-URL or encryption parameters, which it leaves entirely to 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 and resource ("Submit the Data safety declaration") and immediately disambiguates its two operating modes (data_collection="none" vs "collects"). It also separates itself from the neighboring update_privacy_policy by naming it as a prerequisite rather than an alternative, so an agent can route correctly without opening a 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 an explicit precondition ("REQUIRES update_privacy_policy to have been called first"), explicit branch selection between "none" and "collects", and explicit when-not guidance: "none" is a false declaration for any app collecting anything, including a push token. It also tells the agent to confirm with the user rather than assume, which is the correct escalation behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_none_option_declarationAInspect
Declare 'none of the above' for a multi-select feature-checklist App content declaration, using Play Console's own web session. Mandatory declarations. Currently supports none_option_declaration="financial_features" (does the app provide any financial features?) or "health" (does the app use any health features?). Only the 'none apply' answer is supported.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| none_option_declaration | Yes | Which declaration to set: "financial_features" or "health". Other values are not supported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the operation uses Play Console's own web session, that the declarations are mandatory, and that only the 'none apply' answer is supported. It still omits important mutation details such as required permissions, whether an existing declaration is overwritten, reversibility, and failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and scope, then adds the supported values and the 'none apply' limitation. Every sentence contributes directly to understanding what the tool does or does not support, with no wasted exposition.
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 schema fully documents the five parameters, and the description covers the tool's purpose and supported declaration values. But for a mutation tool with no annotations and no output schema, it should say more about session/auth requirements, side effects, and what happens when a declaration already exists. It is adequate but not 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%, so every parameter is already documented in the schema. The description reinforces the meaning of none_option_declaration by naming financial_features and health, but it adds little beyond the schema and does not explain notification_message. With the schema doing the heavy lifting, a 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 uses a specific verb, "Declare," and a precise resource: the 'none of the above' option for a multi-select feature-checklist App content declaration. It also names the exact supported declarations, financial_features and health, so the tool's scope is clear. It does not explicitly contrast itself with sibling declaration tools such as update_policy_declaration or update_data_safety, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by saying these are mandatory declarations and that only the 'none apply' answer is supported. However, it does not say when an agent should choose this tool over other declaration tools or what prerequisites beyond the web session matter. The guidance is enough to understand the tool's narrow role but not enough to route reliably among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_policy_declarationAInspect
Set a simple Yes/No App content policy declaration, using Play Console's own web session. Mandatory declaration gating production submission eligibility. Currently supports policy_declaration="advertising_id" (does the app use advertising ID?) or "government_app" (is this app developed by or on behalf of a government?).
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| policy_declaration | Yes | Which declaration to set: "advertising_id" or "government_app". Other App content declarations (data safety, content rating, target audience, ads, sign in details, financial features, health) have their own tools or are not yet supported. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| policy_declaration_answer | Yes | "true" or "false" answer to the declaration's Yes/No question. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does disclose two non-obvious traits: the write happens through 'Play Console's own web session' (an auth/session dependency the agent must satisfy) and the declaration gates production submission eligibility (business consequence of getting it wrong). It stops short of stating whether an existing answer is overwritten, whether the call is idempotent, or what happens when the web session is stale.
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 sentences, front-loaded with the action, then the business consequence, then the supported-value scope. Every clause carries information the agent needs; there is no filler or restatement of the tool name.
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 annotations and no output schema, the description covers purpose, auth mechanism, and business stakes adequately. The remaining gap is the return side: with no output schema and no statement of what comes back after the declaration is set, the agent cannot anticipate the response or confirm success without a separate call to a state-reading sibling.
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 and the schema already documents all six parameters, including the two allowed policy_declaration values. The description adds only modest value on top: it spells out the actual Yes/No question behind each declaration ('does the app use advertising ID?' / 'is this app developed by or on behalf of a government?'), which helps the agent choose policy_declaration_answer, but adds nothing about the id or email 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 and resource ('Set a simple Yes/No App content policy declaration') and immediately scopes it to the two supported declarations ('advertising_id' or 'government_app'). This cleanly separates it from siblings like update_ads_declaration, update_data_safety, and update_none_option_declaration, which all touch adjacent App content surfaces.
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 triggering context: the declaration is 'mandatory... gating production submission eligibility', which tells the agent this belongs in the pre-submission path near get_pre_submit_status / send_app_for_review. It also implicitly excludes the other declaration tools by saying only two policy_declaration values are supported, though it never names a sibling tool or states a hard when-not condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_privacy_policyAInspect
Set the app's privacy policy URL, using Play Console's own web session. Mandatory App content declaration, and a prerequisite for submitting the Data safety declaration.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| privacy_policy_url | Yes | A real, publicly accessible URL (http:// or https://) to the app's privacy policy page. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It does disclose an important behavioral trait — that the action runs through Play Console's own web session — implying a browser auth dependency, but it does not say whether an existing URL is overwritten, what prior session setup (start_browser_auth / refresh_browser_session) is needed, or what happens on failure.
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 core action is stated first with the workflow constraint immediately after. Nothing could be cut 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 five-parameter mutation tool with no annotations and no output schema, the description covers purpose and workflow placement well and benefits from fully documented parameters. However, it omits the session prerequisites and the effect on any existing policy URL, leaving real gaps an agent would want filled.
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 including the non-obvious play_app_id-vs-package-name distinction and the google_account_email confirmation workflow is already documented. The description adds no parameter-level meaning beyond that, 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 ('Set the app's privacy policy URL') and adds the mechanism ('using Play Console's own web session'). It implicitly distinguishes itself from siblings like update_data_safety by framing itself as their prerequisite, though it never names an alternative 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?
Gives clear situational context: it is a mandatory App content declaration and a prerequisite for submitting the Data safety declaration, which tells the agent when this step is required in a workflow. It stops short of stating exclusions or naming sibling tools to use instead, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sign_in_detailsAInspect
Declare whether any part of the app is restricted (requires account sign-in, payment, referral/QR codes, OTP, biometrics, or actions on another device). Formerly 'App access'. Mandatory App content declaration and one of the app-dashboard setup tasks that gate send_app_for_review. Both answers are supported: "false" is live-verified; "true" attaches reviewer credentials and its wire shape is derived from Play Console's own bundle but not yet live-verified — check the App access page after filing one.
| Name | Required | Description | Default |
|---|---|---|---|
| credentials | No | Required when is_restricted="true". JSON array, one object per test account Play's reviewer should use: [{"name": "Checkout account", "username": "...", "password": "...", "credential_type": "email"|"username"|"phone_number"|"otp"|"other", "additional_details": "any steps the reviewer needs"}]. Ask the user for a REAL working test account — never invent credentials, and never reuse a personal login. Passwords are redacted from this tool's output but are sent to Play. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| is_restricted | Yes | "false" if every part of the app works without signing in or paying. "true" if ANY functionality is behind a login, payment, OTP, referral code, biometrics or an action on another device — then `credentials` is required so Play's reviewer can get in. This is a declaration Google acts on: filing "false" for an app with gated content is a false declaration and a common rejection reason. Ask the user; don't infer it from the code. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does disclose valuable asymmetries: "false" is live-verified while "true" has a wire shape derived from Play Console's bundle but is not live-verified, plus a post-filing verification step on the App access page. However it never states whether this overwrites a prior declaration, what permissions or account scope are required, or whether the call is idempotent — important gaps for a mutation with a false-declaration rejection risk.
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?
Front-loaded with the declarative purpose, then gating context, then the reliability caveat — a sensible order. Sentences are dense but each carries information; the parenthetical list of gated mechanisms is the only mild redundancy against the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation with no annotations and no output schema, the description covers purpose, workflow gating, the unreliability of the "true" path, and a verification follow-up. Missing is any statement about overwrite/idempotency or the response, which would complete the picture.
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 credentials, play_app_id, developer_id, is_restricted and google_account_email are already fully documented, including the "true"→credentials dependency. The description restates the credentials requirement and the consequence of a wrong is_restricted value, but adds no format or edge-case detail beyond the schema; 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 opens with a specific verb and resource — "Declare whether any part of the app is restricted" — and enumerates what counts as restricted (sign-in, payment, referral/QR, OTP, biometrics, another device). The former name "App access" is given, which lets an agent map it to Play Console terminology and distinguish it from sibling declarations like update_data_safety or update_content_rating.
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 places the call in workflow context: a mandatory App content declaration and one of the setup tasks that gate send_app_for_review, which tells the agent when the call is required. It also advises asking the user rather than inferring from code. It stops short of naming an alternative tool or stating when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_store_listingAInspect
Update an app's main store listing (title, short/full description) for one language using Play Console's own web session. Does NOT need create_edit/commit_edit — it patches the listing directly. On an app whose language has no listing entry yet this CREATES the entry (verified live), so it is the first call before attaching any graphic. Note the PATCH replaces the whole entry for that language, so title, short_description and full_description must all be supplied together.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | App title for this language. | |
| language | Yes | BCP-47 language code for the listing, e.g. en-US. | |
| save_mode | No | "save" COMMITS the listing (what Play Console's own Save button does); "draft" (the DEFAULT) writes only the draft copy. **Pass "save" for any listing that has to count toward release.** With the default, the app dashboard's `store_listings` task never completes no matter how complete the content is, and send_app_for_review stays blocked - measured live, and no amount of content or validation_mode=full fixes it. "draft" is for staging text you are not ready to commit. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| validation_mode | No | "draft" (default) or "full". Only applies when save_mode is "draft" - the committed endpoint rejects the validationMode query param outright ("Cannot bind query parameter"). Does NOT make the dashboard task complete; only save_mode="save" does that. | |
| full_description | Yes | Full description for this language. | |
| store_listing_id | No | Always "0" — the main store listing. (It is NOT the long number in the Play Console store-listing URL; that is the app id. "0" is what Play Console's own PATCH sends and it is what creates the listing on an app that has none.) Defaults to 0. | |
| short_description | Yes | Short description for this language. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses that the call bypasses the edit/commit transaction, that the PATCH replaces the entire entry for the language (so all three text fields must be sent together), and that it silently CREATES a missing entry. Those are exactly the destructive/side-effect traits an agent needs before invoking.
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?
Front-loaded with the action and scope, then the behavioral caveats in descending order of importance. Four dense sentences, all earning their place; slightly over-packed but 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 an 11-parameter mutation tool with no annotations and no output schema, the description covers the risky behaviors (creation side effect, whole-entry replace, edit-transaction bypass). What it omits is what the call returns and whether a failed write leaves a partial entry — minor since the schema already documents the save/validation interplay.
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 beyond the schema: it explains that title, short_description, and full_description are a coupled set due to whole-entry replacement, which the schema lists only as three independent required strings. The save_mode/validation_mode traps are documented in the schema rather than repeated here.
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 (update), resource (app's main store listing), and the exact fields it governs (title, short/full description) for one language. That scoping clearly separates it from the sibling tools that touch adjacent resources: update_store_listing_screenshots, upload_store_listing_graphic, and update_store_settings.
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 prerequisite/ordering rule — it is the first call before attaching any graphic — and states that create_edit/commit_edit are not needed. It also flags the no-existing-entry case that creates one. It stops short of naming which sibling to use for graphics or settings, but the sequencing guidance is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_store_listing_screenshotsAInspect
Reorder or remove an app's existing store-listing screenshots for one language. Preserves the listing's title/descriptions untouched. Can ONLY reorder/remove already-uploaded screenshots (matched by URL) — cannot add a brand-new screenshot image.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | BCP-47 language code for the listing, e.g. en-US. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| screenshot_urls | Yes | JSON array of the EXISTING screenshot URLs, in the desired final order (omit a URL to remove that screenshot). Every URL must already be present in the listing — this tool cannot add new images. | |
| store_listing_id | Yes | Numeric store listing id from the Play Console store listing URL (0 for the main listing). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and usefully discloses that title/descriptions are preserved and that screenshots must already exist and are matched by URL. It does not detail permissions, irreversibility of removal, or response behavior, but the core mutation constraints are clear.
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 short, front-loaded, and every sentence adds useful information about scope, preservation, and limitations.
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, the description covers the essential operational behavior and constraints. Minor gaps remain around auth prerequisites and failure handling, but those are partially 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 100%, so the parameters are already well documented in the input schema. The description reinforces the URL-matching and final-order semantics but does not add meaningful details 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 (reorder/remove) and resource (store-listing screenshots) with clear scope for one language. It also distinguishes itself from image-upload tools by explicitly saying it cannot add a brand-new screenshot.
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 explains the usage context: operate on already-uploaded screenshots and omit a URL to remove it. It also states the negative case (cannot add new images), though it does not explicitly name the alternative upload tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_store_settingsAInspect
Set the app's store category and public contact details — one of the app dashboard setup tasks that gates send_app_for_review. Until it is done Play refuses the review submission with a bare FAILED_PRECONDITION and Play Console's own Send-for-review button stays greyed out. The contact details are PUBLIC on the store listing. Derived from Play Console's own bundle; not yet live-verified.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| app_category | No | Store category, lower_snake_case: shopping, food_and_drink, business, lifestyle, social, finance, health_and_fitness, education, entertainment, productivity, travel_and_local, photography, music_and_audio, news_and_magazines, books_and_reference, tools, dating, beauty, events, parenting, medical, weather, maps_and_navigation, personalization, art_and_design, auto_and_vehicles, house_and_home, comics, communication, sports, video_players, libraries_and_demo. Decides where the app is listed — ask the user. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| contact_email | No | PUBLIC support email shown on the store listing. Confirm it with the user; don't reuse an internal address by reflex. | |
| contact_phone | No | Optional public support phone number. | |
| contact_website | No | Optional public support website (https). | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers real behavioral context: the contact details become PUBLIC on the listing, the failure mode is a bare FAILED_PRECONDITION, and the source is Play Console's bundle with a not-yet-live-verified caveat. It does not say whether unspecified settings are preserved or cleared on a call, nor whether repeated calls are idempotent, which matters for a settings mutator.
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?
Purpose is front-loaded in the first clause, and the gating consequence follows immediately. The second sentence is slightly padded ("with a bare FAILED_PRECONDITION and Play Console's own Send-for-review button stays greyed out") but every part still informs the agent's decision to call.
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 8-parameter mutation tool with no annotations and no output schema, the description covers purpose, triggering condition, a strong public-visibility warning, and a provenance caveat. The remaining gap is the semantics of an update: whether omitted fields are left untouched, and what a successful call returns.
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 eight parameters, including the PUBLIC warning on contact_email and the enum-like category list. The description reinforces that contact details are public but adds nothing about developer_id, play_app_id, google_account_email, or notification_message beyond what the schema states, 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 (Set) plus specific resource (the app's store category and public contact details), with the affected fields named. It is clearly separable from sibling tools like update_store_listing, update_privacy_policy, and update_content_rating, which touch different surfaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when this tool is needed: it is a dashboard setup task that gates send_app_for_review, and without it review submission fails with FAILED_PRECONDITION. That gives a clear trigger condition. It stops short of explicit exclusions, e.g. how this differs from update_store_listing or update_privacy_policy when an agent is deciding between the several update_* declaration tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_target_audience_contentAInspect
Declare the app's target audience & content, using Play Console's own web session. Mandatory App content declaration. Only target_audience="adults" (18 and over only, not aimed at children) is currently supported — the correct, simplest answer for an app with no child-directed content.
| Name | Required | Description | Default |
|---|---|---|---|
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| target_audience | Yes | Must be "adults" (18 and over only, not aimed at children) — the only supported value right now. Any other value is not yet implemented and will return an error. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose two real traits: the operation rides on Play Console's own web session (auth/session dependency) and any non-'adults' value errors out. It omits whether an existing declaration is overwritten, whether the change is reversible, and what a successful response looks like — significant gaps for a mutation tool.
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 front-loaded sentences: the action and its mandatory status come first, then the value constraint. The target_audience restriction duplicates the schema, which costs a little, but there is no filler otherwise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation with full schema coverage and no output schema, the description supplies the essential context an agent needs: it is mandatory, it uses the browser session, and only one value works. Missing only overwrite/idempotency and return behavior, which are secondary given the schema's 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 all five parameters are already documented, including the enum-like constraint on target_audience and the 'do not guess' rule for google_account_email. The description restates the target_audience restriction rather than adding new 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?
States a specific verb and resource: declare the app's target audience & content. The addition of 'Mandatory App content declaration' and the Play Console web-session framing separates it from the other declaration siblings (update_content_rating, update_data_safety, update_policy_declaration). It stops short of explicitly naming a sibling it is not, so 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys that this is a mandatory app-content step and pins the only valid input value, but it never says when to call it versus the other declaration tools or what prerequisite state the app must be in. Prerequisite guidance exists only in the schema ('Call list_accounts first and confirm with the user'), not in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_track_countriesAInspect
Set which countries/regions a release track serves — the precondition for a track's first rollout. CRITICAL, measured 2026-10-28: pass at least one explicit targeted_countries value. target_rest_of_world="true" ALONE writes the rest-of-world flag and leaves the country list empty, and Play's release validator then refuses every rollout with "No countries or regions have been selected for this track" — surfacing from start_rollout as a bare FAILED_PRECONDITION with no detail, while get_setup_state still reports closed_countries/prod_countries as complete. For a worldwide launch pass one real market in targeted_countries AND target_rest_of_world="true". Does not publish anything. Ask the user which countries; never pick for them.
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes | Numeric track id — call list_tracks first. Not the alias like "production". | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| targeted_countries | No | Comma-separated ISO 3166-1 alpha-2 codes, e.g. "NG,GH,KE". These are the countries the app becomes downloadable in. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. | |
| target_rest_of_world | No | "true" also serves every other country/region Play allows — a worldwide launch, so confirm it. "false" (default) serves only targeted_countries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the write semantics, the silent partial-write failure mode (rest-of-world flag set, country list empty), the downstream symptom (bare FAILED_PRECONDITION from start_rollout), and the misleading state report from get_setup_state. It also states what the tool does not do ("Does not publish anything"), which is exactly the kind of non-obvious trait an agent needs.
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?
Purpose and the critical constraint are front-loaded before the failure detail, and nearly every sentence carries actionable content. The failure is described twice (validator refusal plus the stripped FAILED_PRECONDITION symptom), which is slightly redundant but justified by how non-obvious the trap is.
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?
Covers the hard parts for a 7-parameter mutation with no annotations and no output schema: the worldwide-launch recipe, the empty-list trap, and user confirmation. It leaves open whether an existing country list is replaced or merged on repeat calls, and says nothing about the response shape beyond the failure path.
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 the baseline is 3; the description goes beyond the schema by explaining the interaction between targeted_countries and target_rest_of_world, including the degenerate combination that silently breaks rollouts. It does not touch notification_message or the id-confirmation params, which the schema already covers.
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 ("Set which countries/regions a release track serves") and names its role in the workflow ("the precondition for a track's first rollout"), which separates it from update_store_settings, create_release, and start_rollout. An agent can tell instantly what it mutates and where it sits in the sequence.
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?
Explicitly says when to call it (before a track's first rollout), what NOT to do (target_rest_of_world="true" alone), the exact recipe for a worldwide launch, and the human-in-the-loop rule ("Ask the user which countries; never pick for them"). It also clarifies scope boundaries by naming start_rollout as the downstream step this tool does not perform.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_bundleAInspect
Upload a signed .aab. IMPORTANT: uploading does NOT attach the artifact to the release — it only becomes an app-level artifact (visible with its own version code) while the release's addedArtifacts stays empty, so start_rollout would have nothing to roll out. Call attach_artifact_to_release next, then get_release to check signing/content validation, then start_rollout. This call only confirms the bytes arrived and that Play accepted the bundle for processing.
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes | Numeric track id (e.g. the long digits in the Play Console URL's .../tracks/<this>/..., not the human alias like "internal"). Call list_tracks first to find it. | |
| bundle_url | No | https URL the replay host downloads the signed .aab from — the route for a bundle built on your own machine, since bundle_path only sees files already on the replay host. Must be publicly resolvable. | |
| release_id | Yes | Release id on this track, from create_release/get_track. | |
| bundle_path | No | Absolute path ON THE REPLAY HOST, inside the secops container (repo root = /app). Only usable if you can already put files there — most operators cannot, so prefer bundle_url. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| bundle_base64 | No | The .aab inline as base64. Exists for symmetry with the image tools but is capped at 64 KiB, far below any real bundle — use bundle_url. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so well: it discloses that the release's addedArtifacts stays empty, that the bundle appears as an app-level artifact with its own version code, and that the call only confirms byte arrival and Play's acceptance for processing. It preempts the most likely agent misunderstanding (assuming upload implies attachment).
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?
Front-loads the action then the critical caveat, which is the right ordering. It is dense rather than padded, though the closing sentence partly restates the 'does not attach' point and could be trimmed without loss.
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 nine-parameter mutation tool with no annotations and no output schema, the description covers the state outcome, the required follow-up sequence, and what a success response actually guarantees. Nothing essential 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 description coverage is 100%, so the schema already documents all nine parameters with useful guidance (bundle_url vs bundle_path vs bundle_base64, list_tracks for track_id, list_accounts for google_account_email). The description adds no parameter-level detail beyond that, 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 ('Upload a signed .aab') and immediately clarifies the scope of that action — an app-level artifact, not a release attachment. That distinction is what separates it from attach_artifact_to_release, so an agent can route correctly 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?
Gives an explicit ordered workflow: call attach_artifact_to_release next, then get_release for validation, then start_rollout. It also states the failure mode of stopping here ('start_rollout would have nothing to roll out'), which is exactly the when/when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_screenshot_assetAInspect
Upload an image into the app's Asset Library. NOTE: for store listing graphics use upload_store_listing_graphic instead — the Asset Library's image cannot be attached to a listing slot (it lacks the blobKey the listing requires, confirmed live). This tool is only for getting an image into the Asset Library itself.
| Name | Required | Description | Default |
|---|---|---|---|
| image_url | No | https URL the replay host fetches the image from — the route for anything over the base64 cap. Must be publicly resolvable (a URL that resolves to a private address is refused). | |
| image_path | No | Absolute path ON THE REPLAY HOST, inside the secops container (repo root = /app). Only usable if you can already put files there — most operators cannot, so prefer image_base64 or image_url. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| image_base64 | No | The image's bytes as base64 (a data: URI prefix is fine) — the route that needs no file on the replay host and no hosting at all. Capped at 64 KiB of image because CLI steps receive their arguments in one environment variable and Linux caps that at 128 KiB; anything larger must use image_url. A 512x512 icon usually fits, a full-resolution screenshot usually does not. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses the Asset Library/blobKey limitation, which is important context beyond the schema, but it does not describe auth requirements, failure behavior, idempotency, or what the upload 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?
The description is front-loaded and mostly efficient, with the purpose first and the critical sibling routing immediately after. The final sentence slightly restates the opening scope, keeping it just short of maximally 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 mutation tool with no annotations and no output schema, the description covers the key selection concern: this is only for the Asset Library and not for store listing graphics. It does not explain the result of a successful upload, but the highly detailed input schema covers invocation 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 100%, and the schema already explains each parameter in detail, including the base64 cap and URL restrictions. The description does not add further parameter semantics beyond what the schema provides, 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 and resource: uploading an image into the app's Asset Library. It also explicitly distinguishes this from the sibling tool upload_store_listing_graphic and clarifies the exact scope, so an agent can tell the two apart without inspecting 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?
Gives explicit routing guidance: use this for Asset Library uploads, but use upload_store_listing_graphic for store listing graphics because the Asset Library image lacks the blobKey a listing slot requires. The alternative and when-not condition are both named directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_store_listing_graphicAInspect
Upload an image AND attach it to a store-listing slot in one call — phone screenshot, feature graphic or app icon. This is what makes a store listing completable from here; upload_screenshot_asset only gets an image into the Asset Library and CANNOT attach it. Play requires at least 2 phone screenshots plus a feature graphic and an icon for a complete listing, so call this once per image. Preserves the listing's existing text and other graphics, and refuses rather than risking a partial overwrite. Give the image ONE of three ways: image_base64 (inline bytes, no hosting needed, 64 KiB cap), image_url (https, any size) or image_path (replay host only).
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | BCP-47 language code of the listing to attach into, e.g. en-US. The listing must already have text for this language (update_store_listing creates it). | |
| image_url | No | https URL the replay host fetches the image from — the route for anything over the base64 cap. Must be publicly resolvable (a URL that resolves to a private address is refused). | |
| image_path | No | Absolute path ON THE REPLAY HOST, inside the secops container (repo root = /app). Only usable if you can already put files there — most operators cannot, so prefer image_base64 or image_url. | |
| image_type | Yes | Which slot: "phone_screenshot", "feature_graphic" (must be exactly 1024x500) or "icon" (must be exactly 512x512). | |
| attach_mode | No | For phone_screenshot only: "append" (default) adds alongside existing screenshots, "replace" makes it the only one. Ignored for feature_graphic and icon, which are single-image slots. | |
| play_app_id | Yes | Numeric Play app id from the Play Console URL (.../app/<this>/...). NOT the package name. | |
| developer_id | Yes | Numeric Play Console developer id (from the Play Console URL). | |
| image_base64 | No | The image's bytes as base64 (a data: URI prefix is fine) — the route that needs no file on the replay host and no hosting at all. Capped at 64 KiB of image because CLI steps receive their arguments in one environment variable and Linux caps that at 128 KiB; anything larger must use image_url. A 512x512 icon usually fits, a full-resolution screenshot usually does not. | |
| store_listing_id | No | Numeric store listing id (0 for the main listing). Defaults to 0. | |
| google_account_email | Yes | The signed-in Google account email that owns this Play Console developer account. Call list_accounts first and confirm with the user — do not guess. | |
| notification_message | No | Short user-facing sentence for this action if the follow-up reply fails. Plain text only; do not mention template syntax or variable names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does real work: it discloses that existing text and other graphics are preserved, that the operation refuses rather than risk a partial overwrite, and that non-public URLs resolving to private addresses are rejected. It does not describe what a successful response contains or what auth steps precede the call, but the failure-mode and safety disclosure is well beyond a bare procedural note.
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?
Front-loaded with the action and the differentiator against the sibling, then the Play completeness requirement, then the input routes — a sensible priority order with no filler. It runs long and repeats some of the 64 KiB reasoning that the schema already carries, which keeps it just below top marks.
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 no annotations and no output schema, the description supplies the missing behavioral frame: attachment semantics, per-slot requirements, and source-selection rules. The remaining gap is the return value/confirmation shape and any auth prerequisites, which the google_account_email schema field only partly covers by pointing at list_accounts.
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 the baseline is 3; the description earns extra by declaring the three image-source parameters mutually exclusive ('give the image ONE of three ways') and by explaining the routing trade-off between them, which the schema does not express via any oneOf/anyOf structure. The dimension/format rules for slots are left to the schema's image_type description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound action (upload an image AND attach it to a store-listing slot) plus the three image kinds it accepts. It explicitly names and contrasts the nearest sibling, upload_screenshot_asset, saying that tool only lands an image in the Asset Library and cannot attach it — an agent can pick between them 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?
Tells the agent exactly when and how often to call it (once per image, with the Play requirement of 2+ phone screenshots, a feature graphic and an icon spelled out). It also routes between the three input methods with concrete conditions: base64 for small inline bytes under the 64 KiB cap, image_url for anything larger, image_path only when files can be placed on the replay host.
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.
38 tool updates
- First observed
attach_artifact_to_release - First observed
check_package_name_availability - First observed
create_app - First observed
create_release - First observed
declare_asset_ai_state - First observed
enroll_play_app_signing - First observed
get_app_submission_state - First observed
get_pre_submit_status - First observed
get_release - First observed
get_setup_state - First observed
get_track - First observed
get_user_permissions - First observed
grant_app_permission - First observed
list_accounts - First observed
list_apps - First observed
list_tracks - First observed
promote_release - First observed
refresh_browser_session - First observed
send_app_for_review - First observed
setup_closed_testing - First observed
start_browser_auth - First observed
start_rollout - First observed
submit_prod_access_application - First observed
update_ads_declaration - First observed
update_content_rating - First observed
update_data_safety - First observed
update_none_option_declaration - First observed
update_policy_declaration - First observed
update_privacy_policy - First observed
update_sign_in_details - First observed
update_store_listing - First observed
update_store_listing_screenshots - First observed
update_store_settings - First observed
update_target_audience_content - First observed
update_track_countries - First observed
upload_bundle - First observed
upload_screenshot_asset - First observed
upload_store_listing_graphic
Related MCP Connectors
Ship a new iOS app from chat. AI runs App Store Connect, builds, release, and submission through Ap…
551Build signed Android (APK/AAB) and iOS (IPA) apps from a GitHub repo, from your AI assistant.
AppDeploy turns app ideas described in AI chat into live full-stack web applications
Give your AI agent a real cloud Android phone: push APKs, drive it, get screenshots and logs.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables managing releases, monitoring Android vitals, analyzing earnings and search terms, optimizing ASO, and preflighting store assets through natural language, with a confirmation gate before destructive writes.17056 PyPI2Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to automate Android release workflows via the Google Play Android Publisher API, including deploying builds, managing listings, and replying to reviews.40MIT
- AlicenseNot gradedqualityDmaintenanceIntegrates Google Play Store management tools with AI assistants to handle app listings, releases, and user reviews. It enables users to manage Play Console tasks like updating store information and retrieving performance statistics through natural language.50 npm10MIT
- AlicenseNot gradedqualityBmaintenanceEnables autonomous AI agents and developers to programmatically manage Google Play apps via the Play Developer API v3, including uploading Android App Bundles, managing release tracks, updating store listings, and replying to user reviews.3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.