Skip to main content
Glama
AgiMaulana

Google Play Console

by AgiMaulana

Google Play Console MCP

Google Play Console MCP server

GooglePlayConsoleMcp MCP server MCP Badge License: MIT

A Python Model Context Protocol server that lets AI assistants (Claude, etc.) manage the full Google Play Store release lifecycle directly — from uploading artifacts to managing testers, rollouts, and Android Vitals.


Quick start

Option A — uvx (recommended, no install needed)

Run this once. Claude automatically starts and stops the server for every session — you never have to touch it again.

claude mcp add google-play-mcp \
  -e GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json \
  -- uvx google-play-mcp

Requires uv — install with brew install uv or curl -Lsf https://astral.sh/uv/install.sh | sh

Option B — pip install

If you prefer a permanent install:

pip install google-play-mcp

claude mcp add google-play-mcp \
  -e GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json \
  -- google-play-mcp

Option C — HTTP (local server)

Only needed if you want to connect via HTTP transport instead of stdio:

# Terminal 1 — start the server
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json \
  uvx google-play-mcp --transport http --port 8080

# Terminal 2 — register with Claude
claude mcp add --transport http google-play-mcp http://localhost:8080

How stdio works: With Options A and B, there is no server to start manually. Claude launches the process in the background when a session opens and shuts it down when the session ends. Zero maintenance.


Related MCP server: Google Play Store MCP Server

Features

Tracks & Releases

Tool

Description

list_tracks

List all tracks (internal, alpha, beta, production) with releases and country availability

get_track_info

Get detailed status, rollout %, and release notes for a specific track

create_release

Create or replace a release on any track with rollout %, release notes, and country targeting

update_release

Update rollout %, halt, resume, or complete an existing release

promote_release

Promote a release between tracks (e.g. internal → alpha → beta → production)

Artifact Management

Tool

Description

list_artifacts

List all APKs and AABs with their version codes and SHA hashes

upload_artifact

Upload an APK or AAB and create a release on a track in one step

upload_to_internal_sharing

Upload a build to Internal App Sharing and get a shareable download URL

Tester Management

Tool

Description

get_testers

Get tester email addresses and Google Groups for internal/closed testing

update_testers

Replace the tester list for an internal or closed testing track

Android Vitals

Tool

Description

get_crash_rate

Daily crash rate and user-perceived crash rate by version code

get_anr_rate

Daily ANR rate and user-perceived ANR rate by version code

get_vitals_summary

Combined crash + ANR overview with bad behavior threshold indicators

get_wakelock_rate

Daily stuck background wake lock rate by version code (battery health)

get_wakeup_rate

Daily excessive wakeup rate by version code (battery health)


Prerequisites

  1. uvinstall guide

  2. A Google Cloud service account with the JSON key downloaded.

  3. The service account added to Google Play Console with the correct permissions (see below).

  4. These APIs enabled in your Google Cloud project:

Required Play Console permissions

Tools

Minimum permission required

upload_artifact, create_release, update_release, promote_release, update_testers

Release to production, exclude devices, and use app signing by Google Play

upload_to_internal_sharing

Release to testing tracks

list_tracks, get_track_info, list_artifacts, get_testers

View app information and download bulk reports (read-only)

get_crash_rate, get_anr_rate, get_vitals_summary, get_wakelock_rate, get_wakeup_rate

View app information and download bulk reports (read-only) + Reporting API enabled

Important: Release Manager does not grant Reporting API access. You must also enable View app information and download bulk reports (read-only) — both at account level and per-app level — for the Vitals tools to work.


Claude Desktop integration

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "google-play": {
      "command": "uvx",
      "args": ["google-play-mcp"],
      "env": {
        "GOOGLE_APPLICATION_CREDENTIALS": "/absolute/path/to/service-account.json"
      }
    }
  }
}

Restart Claude Desktop after saving.


Service account setup

  1. Go to IAM & Admin → Service Accounts in your GCP project.

  2. Create a service account (or use an existing one) and download a JSON key.

  3. In Google Play ConsoleSetup → API access:

    • Link your Google Cloud project.

    • Find the service account → Manage Play Console permissions.

    • Under Account permissions, enable View app information and download bulk reports (read-only).

    • Under App permissions for each app, enable:

      • View app information and download bulk reports (read-only)

      • Release to production… (if you need write access)

    • Click ApplyInvite user.

Permissions must be granted at both account level and per-app level. Account-level alone is not sufficient for the Reporting API.


Tool reference

list_tracks

package_name : str  — e.g. "com.example.myapp"

Returns all tracks with their releases, rollout percentages, statuses, and country availability.


get_track_info

package_name : str
track        : str  — "internal" | "alpha" | "beta" | "production" (default: "production")

Returns a human-readable summary plus releases with status, rollout %, version codes, and release notes.


create_release

package_name       : str
track              : str        — "internal" | "alpha" | "beta" | "production"
version_codes      : list[int]  — e.g. [1042]
rollout_percentage : float      — default 10.0 (used when status is "inProgress")
status             : str        — "draft" (default) | "inProgress" | "halted" | "completed"
release_name       : str        — optional
release_notes      : dict       — optional, e.g. {"en-US": "Bug fixes", "fr-FR": "Corrections"}
country_codes      : list[str]  — optional ISO 3166-1 alpha-2 codes, e.g. ["US", "GB"]

Creates or replaces a release on the given track. Use status="inProgress" with a rollout_percentage for a staged production rollout, or status="completed" to release to all users immediately.


update_release

package_name       : str
track              : str    — default "production"
rollout_percentage : float  — optional; pass 100 to complete the rollout
status             : str    — optional; "inProgress" | "halted" | "completed" | "draft"
version_codes      : list[int]  — optional filter; targets first matching release if omitted

Update an existing release. Common use cases:

  • Increase rollout: update_release(pkg, rollout_percentage=50)

  • Complete rollout: update_release(pkg, rollout_percentage=100)

  • Halt rollout: update_release(pkg, status="halted")

  • Resume rollout: update_release(pkg, status="inProgress")


promote_release

package_name       : str
from_track         : str        — "internal" | "alpha" | "beta"
to_track           : str        — "alpha" | "beta" | "production"
version_codes      : list[int]
rollout_percentage : float      — default 10.0
release_name       : str        — optional override
release_notes      : dict       — optional override; inherits from source if omitted

Copies a release from one track to another. Release notes and name are inherited from the source release unless explicitly overridden.


list_artifacts

package_name : str

Returns all APKs and AABs sorted by version code (newest first) with SHA hashes.


upload_artifact

package_name       : str
file_path          : str    — absolute local path to .apk or .aab
track              : str    — default "internal"
status             : str    — "draft" (default) | "inProgress" | "completed"
rollout_percentage : float  — default 10.0 (used when status is "inProgress")
release_name       : str    — optional
release_notes      : dict   — optional

Uploads an APK or AAB (auto-detected from extension) and creates a release on the given track in a single atomic operation. Returns the assigned version code.


upload_to_internal_sharing

package_name : str
file_path    : str  — absolute local path to .apk or .aab

Uploads a build to Internal App Sharing (bypasses track assignment) and returns a shareable downloadUrl. Testers must have Internal App Sharing enabled in their Play Store settings. Ideal for quick one-off testing without affecting any release track.


get_testers

package_name : str
track        : str  — "internal" (default) | "alpha"

Returns the list of tester email addresses and Google Groups for the track.


update_testers

package_name  : str
track         : str         — "internal" (default) | "alpha"
emails        : list[str]   — optional; full replacement list of tester emails
google_groups : list[str]   — optional; full replacement list of Google Group emails

Warning: This is a full replacement. Testers not in the new list will lose access. Call get_testers first to retrieve the current list if you only want to add/remove individuals.


get_crash_rate

package_name : str
days         : int  — look-back window, 1–30 (default 7)
version_code : str  — optional single version code to filter

Returns daily crashRate, userPerceivedCrashRate, and distinctUsers per version code. Google's bad behavior threshold for user-perceived crash rate is ~1.09%.


get_anr_rate

package_name : str
days         : int  — look-back window, 1–30 (default 7)
version_code : str  — optional single version code to filter

Returns daily anrRate, userPerceivedAnrRate, and distinctUsers per version code. Google's bad behavior threshold for user-perceived ANR rate is ~0.47%.


get_vitals_summary

package_name : str
days         : int  — look-back window, 1–30 (default 7)

Returns a combined crash + ANR summary aggregated per version code, with averages over the period and exceedsCrashThreshold / exceedsAnrThreshold flags. The latest version is highlighted as latestVersionSummary.

get_wakelock_rate

package_name : str
days         : int  — look-back window, 1–30 (default 7)
version_code : str  — optional single version code to filter

Returns daily stuckBackgroundWakelockRate and distinctUsers per version code. Relevant for 2026 Google Play battery health enforcement — apps with an excessive proportion of sessions holding a partial wake lock for more than 1 hour in the background may be penalized.


get_wakeup_rate

package_name : str
days         : int  — look-back window, 1–30 (default 7)
version_code : str  — optional single version code to filter

Returns daily excessiveWakeupRate and distinctUsers per version code. Relevant for 2026 Google Play battery health enforcement — apps that wake the CPU too frequently (above platform thresholds) may be penalized.


Troubleshooting

403 Forbidden on Vitals tools

403 Client Error: Forbidden for url: https://playdeveloperreporting.googleapis.com/...

This error has two common causes — check both:

1. Google Play Developer Reporting API not enabled

Enable it in your Google Cloud project: console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com

2. Service account lacks per-app Reporting API access

  1. Play Console → Setup → API access → find the service account → Manage Play Console permissions.

  2. Under App permissions, select the app and enable View app information and download bulk reports (read-only).

  3. Save and wait a few minutes for the change to propagate.

404 Package not found

The service account must be linked to the same Google Play Console account that owns the app. Go to Play Console → Setup → API access and verify the service account is listed and has been invited.


Marketplaces

Registry

Link

PyPI

pip install google-play-mcp

Smithery

search google-play-mcp

Official MCP Registry

google-play-mcp


License

MIT

Available Tools

16 tools
create_releaseA

Create or replace a release on a track.

NOTE: With Managed Publishing enabled, the edit is held pending approval. Call publish_managed_release to send live.

Args: package_name: Package name, e.g. com.example.myapp track: "internal", "alpha", "beta", or "production". version_codes: Version codes to include, e.g. [1234]. rollout_percentage: Rollout % when status is "inProgress". Default 10%. status: "draft" (default), "inProgress" (staged), "halted", or "completed". release_name: Optional human-readable name. release_notes: Optional {lang: text} dict, e.g. {"en-US": "Bug fixes"}. country_codes: Optional ISO 3166-1 alpha-2 codes. Empty list removes restrictions. submit_for_review: If True, submits changes for Google Play review. Set to False to keep as draft without submitting for review.

ParametersJSON Schema
NameRequiredDescriptionDefault
trackYes
statusNodraft
package_nameYes
release_nameNo
country_codesNo
release_notesNo
version_codesYes
submit_for_reviewNo
rollout_percentageNo

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full burden. It discloses the managed publishing hold and submit_for_review behavior, but does not mention potential destructive aspects of replacement, idempotency, rate limits, or authentication needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with a brief purpose statement followed by a bullet-like parameter list. Every sentence adds value, and the managed publishing note is front-loaded for immediate attention.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description adequately covers parameters and the managed publishing workflow, referencing a sibling tool for follow-up. However, it lacks details on return values, error scenarios, and prerequisites, which would be helpful given the complexity and absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds detailed meaning for all 9 parameters, including valid values (e.g., track options), conditional behavior (e.g., rollout_percentage used only with inProgress status), and explanatory notes (e.g., country codes removing restrictions).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create or replace a release on a track,' which is a specific verb+resource combination. This distinguishes it from siblings like 'update_release' (which likely updates) and 'publish_managed_release' (which publishes a pending release).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes guidance on when Managed Publishing is enabled and advises to call 'publish_managed_release' to send live. However, it lacks explicit differentiation from 'update_release' and does not provide when-not-to-use scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_anr_rateA

Fetch ANR (Application Not Responding) rate from Android Vitals.

Returns daily anrRate, userPerceivedAnrRate, and distinctUsers by version code. Bad behavior threshold: userPerceivedAnrRate > 0.47% may cause Play Store ranking penalties.

Args: package_name: Package name, e.g. com.example.myapp days: Past days to include (default 7, max 30). version_code: Optional version code filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
package_nameYes
version_codeNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description explains it is a read operation (fetch), lists the data returned, and notes the threshold. It lacks details on permissions or rate limits, but is sufficient for a non-destructive fetch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (few sentences plus args list), front-loads key functionality, and has no redundant information. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While there is no output schema, the description covers the main return fields. It could be more precise about the data format, but is adequate for a simple metric tool with low complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description includes an Args section that elaborates on all three parameters (package_name format, days default/max, version_code optional), compensating for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Fetch ANR rate from Android Vitals' and specifies the returned metrics (anrRate, userPerceivedAnrRate, distinctUsers). This distinguishes it from sibling tools like get_crash_rate or get_vitals_summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions a performance threshold (userPerceivedAnrRate > 0.47% may cause penalties), which helps interpret the data, but does not explicitly state when to prefer this tool over alternatives or provide when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_crash_rateA

Fetch user-perceived crash rate from Android Vitals.

Returns daily crashRate, userPerceivedCrashRate, and distinctUsers by version code. Bad behavior threshold: userPerceivedCrashRate > 1.09% may cause Play Store ranking penalties.

Args: package_name: Package name, e.g. com.example.myapp days: Past days to include (default 7, max 30). version_code: Optional version code filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
package_nameYes
version_codeNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses data returned and a threshold, but lacks details on error handling, rate limits, or expected response format. Does not explicitly state read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Reasonably concise with a clear flow: purpose, returns, threshold, then args. The args section could be integrated more concisely, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains return values and threshold. Lacks details on error conditions and data format, but sufficiently complete for a simple fetch tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description compensates by explaining package_name (with example), days (default 7, max 30), and version_code (optional). This adds meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches user-perceived crash rate from Android Vitals, listing specific return values (daily crashRate, userPerceivedCrashRate, distinctUsers) and a threshold. This distinctively separates it from siblings like get_anr_rate (ANR rate) and get_vitals_summary (summary).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives (e.g., get_anr_rate, get_vitals_summary). Does not state when not to use or provide context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_testersB

Get tester emails and Google Groups for an internal or alpha track.

Args: package_name: Package name, e.g. com.example.myapp track: "internal" (default) or "alpha".

ParametersJSON Schema
NameRequiredDescriptionDefault
trackNointernal
package_nameYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden for behavioral disclosure. It states the operation is a 'get' (read), but does not explicitly confirm safety, lack of side effects, authorization requirements, or any constraints like rate limits. The description is too minimal for full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, using two sentences for the main purpose and a short list for parameters. Every sentence adds value, with no redundancy or unnecessary words. It is well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no output schema, the description should indicate the return structure (e.g., a list of emails and groups) or any error conditions. It only names the outputs vaguely. Additionally, it omits any context on prerequisites (e.g., app must exist) or edge cases, making it incomplete for an agent to use confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description adds meaningful detail: example for 'package_name' and clarification of allowed values and default for 'track'. This compensates for the schema's lack of descriptions, though it could be more exhaustive (e.g., format constraints).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool retrieves tester emails and Google Groups for a specific track, using a specific verb ('Get') and resource ('testers for a track'). It distinguishes from sibling 'update_testers' by its read-only nature, and the parameter documentation clarifies the scope (internal or alpha).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like 'update_testers' or 'list_tracks'. The description does not specify prerequisites, limitations, or conditions for use, leaving the agent without context for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_track_infoA

Get detailed info for a specific release track.

Returns releases with status, rollout %, version codes, release notes, and country availability.

Args: package_name: Package name, e.g. com.example.myapp track: "internal", "alpha", "beta", or "production". Default "production".

ParametersJSON Schema
NameRequiredDescriptionDefault
trackNoproduction
package_nameYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description implies read-only via 'Get' but does not explicitly confirm non-destructive behavior. Lists return fields but omits side effects or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences plus clear Args block. Purpose front-loaded, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Lists return fields (status, rollout %, version codes, etc.) compensating for missing output schema. Could note that data is for latest release, but otherwise complete for a simple read operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Description adds example for package_name and valid values with default for track, going beyond schema. Despite context signal of 0% coverage, the Args block provides full parameter description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Get detailed info for a specific release track' with specific verb and resource. Distinguishes from sibling 'list_tracks' which likely lists tracks without details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Does not provide when-to-use or when-not-to-use compared to siblings. No guidance on selecting this tool over alternatives like 'list_tracks'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vitals_summaryA

Get combined Android Vitals: crash rate and ANR rate per version code.

Returns averages over the period with threshold flags. Thresholds: userPerceivedCrashRate > 1.09%, userPerceivedAnrRate > 0.47%.

Args: package_name: Package name, e.g. com.example.myapp days: Past days to include (default 7, max 30).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
package_nameYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses returns: averages with threshold flags, and lists the thresholds. However, no annotations are provided, and the description does not mention side effects, authentication needs, or response structure beyond the brief summary.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a front-loaded first sentence summarizing the tool's purpose. The parameter details are structured in a clear list. Could be slightly shorter by omitting the arg format, but overall efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the main output (averages with threshold flags) and parameters, but with no output schema, it lacks specifics on the exact return format (e.g., JSON fields). It is adequate for a simple two-parameter tool but not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds meaningful details: 'days' gets default and max (7, 30), 'package_name' gets an example. This compensates well for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get combined Android Vitals: crash rate and ANR rate per version code.' It uses specific verbs and resources, and distinguishes from sibling tools like get_anr_rate and get_crash_rate by noting it combines both metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for obtaining combined vitals but does not explicitly state when to use this tool versus the separate rate tools (e.g., get_anr_rate, get_crash_rate). No exclusions or alternative tools are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_wakelock_rateA

Fetch stuck background wake lock rate from Android Vitals.

Returns daily stuckBackgroundWakelockRate and distinctUsers by version code. Excessive wakelock holding (>1 hour in background) may be penalized.

Args: package_name: Package name, e.g. com.example.myapp days: Past days to include (default 7, max 30). version_code: Optional version code filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
package_nameYes
version_codeNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It indicates a read operation ('Fetch') and describes the return data (daily rates and distinctUsers). It does not discuss auth, rate limits, or idempotency, but the behavioral details are adequate for a fetch tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (6 lines) and front-loaded with the purpose. It includes a blank line separating overview from args, but it could be slightly more streamlined without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking output schema and annotations, the description covers purpose, return values, and parameter details. It does not mention authentication or error handling, but for a simple data fetch tool, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero description coverage, but the tool description's 'Args' section adds thorough meaning: example for package_name, default and max for days, optional nature for version_code. This fully compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches 'stuck background wake lock rate from Android Vitals,' specifying the verb and resource. It distinguishes itself from siblings like 'get_anr_rate' and 'get_crash_rate' by focusing on wakelock data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the metric (daily rates by version) and mentions that excessive wakelock may be penalized, providing context for when to use. However, it does not explicitly exclude alternatives like 'get_wakeup_rate' or state when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_wakeup_rateB

Fetch excessive CPU wakeup rate from Android Vitals.

Returns daily excessiveWakeupRate and distinctUsers by version code. Frequent CPU wakeups above platform thresholds may be penalized.

Args: package_name: Package name, e.g. com.example.myapp days: Past days to include (default 7, max 30). version_code: Optional version code filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
package_nameYes
version_codeNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that frequent CPU wakeups above thresholds may be penalized, adding context beyond fetching data. However, it does not cover authentication, rate limits, or other behavioral aspects. With no annotations, the description carries some burden but is only moderately transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the purpose. Every sentence adds value, though the structure could be more bullet-point friendly. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple fetch tool, the description covers purpose, return fields, and parameter details. Lacks specifics on output format or threshold definitions, and there is no output schema. Adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates with an 'Args' section explaining each parameter: package_name with an example, days with default and max, version_code as optional. This adds significant meaning beyond the schema's bare titles and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches 'excessive CPU wakeup rate from Android Vitals', with a specific verb and resource. It distinguishes from sibling tools like get_anr_rate or get_crash_rate by focusing on wakeup rate, though it does not explicitly contrast them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. The description does not mention exclusions or when not to use it, leaving the agent to infer from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_artifactsA

List all APKs and AABs uploaded to the app.

Returns version codes and SHA hashes. Useful for finding version codes available to assign to a track.

Args: package_name: Package name, e.g. com.example.myapp

ParametersJSON Schema
NameRequiredDescriptionDefault
package_nameYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; the description states return values but does not disclose potential errors, required permissions, or whether the operation is read-only. Transparency is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and front-loaded, with a clear first sentence. Could be slightly more concise, but acceptable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with one parameter, the description provides purpose and usage example. Lacks details on optional parameters or response format, but acceptable given simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds an example for package_name, providing meaning beyond the schema. This compensates for missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly defines the tool as listing APKs and AABs, specifying the resource and the return of version codes and SHA hashes. It distinguishes from sibling tools like upload_artifact, which are write operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a concrete use case: finding version codes for track assignment. However, it lacks explicit guidance on when not to use this tool or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tracksA

List all release tracks with their current releases.

Returns tracks (internal, alpha, beta, production) with rollout percentages, statuses, and country availability.

Args: package_name: Package name, e.g. com.example.myapp

ParametersJSON Schema
NameRequiredDescriptionDefault
package_nameYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description provides some behavioral context by listing return data (rollout percentages, statuses, country availability) but does not explicitly state read-only nature, side effects, or error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus a clear 'Args' line. Every word contributes useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description covers the essential: what it lists, what it returns, and the argument. Lacks details on pagination or error handling, but adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage for the one parameter, but the description adds an example ('com.example.myapp') and clarifies it is a package name, providing meaning beyond the schema's type field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists release tracks with their releases, specifying the types of tracks and data returned. It implicitly distinguishes from sibling like 'get_track_info' by indicating a broader scope (all tracks vs. specific), but no explicit comparison.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., get_track_info for a single track). No prerequisites or exclusions mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

promote_releaseA

Promote a release from one track to another.

Copies version codes from source to destination. Common: internal→alpha→beta→production. Release notes/name are inherited unless overridden.

Args: package_name: Package name, e.g. com.example.myapp from_track: Source — "internal", "alpha", or "beta". to_track: Destination — "alpha", "beta", or "production". version_codes: Version codes to promote, e.g. [1234]. rollout_percentage: Rollout % at destination. Default 10%. Use 100 for full release. release_name: Optional name override. release_notes: Optional {lang: text} override, e.g. {"en-US": "New features"}. submit_for_review: If True, submits changes for Google Play review. Set to False to keep as draft without submitting for review.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_trackYes
from_trackYes
package_nameYes
release_nameNo
release_notesNo
version_codesYes
submit_for_reviewNo
rollout_percentageNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It explains that version codes are copied, defaults for rollout_percentage (10%) and submit_for_review (True), and that release notes/name are inherited unless overridden. It does not mention potential destructive actions or error conditions, but the core behavior is well-covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a one-line summary followed by explanation and an argument list. It is slightly lengthy but concise enough; every sentence adds value. Could be trimmed by removing redundant phrasing but overall good.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity and lack of output schema, the description covers the main functionality, parameter semantics, and defaults. It does not describe return values or error handling, but the core use-case is fully addressed. Slightly lacking in prerequisites or postconditions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning parameters have no descriptions. The description compensates with a detailed 'Args:' block explaining each parameter, including defaults, examples (e.g., version_codes: [1234], release_notes: {"en-US": "New features"}), and meaning (e.g., submit_for_review). This adds significant value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Promote a release from one track to another.' It specifies the action (promote), resource (release), and scope (tracks). It distinguishes from sibling tools like create_release and update_release by focusing on copying version codes between tracks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides common progression (internal→alpha→beta→production) and notes that release notes/name are inherited unless overridden. While it implies when to use the tool, it does not explicitly state when not to use or mention alternatives. The context is clear but could be stronger.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_managed_releaseA

Send approved changes live when Managed Publishing is enabled.

Call after changes committed via create_release/update_release/promote_release have been reviewed in Play Console. No-op if Managed Publishing is off.

Args: package_name: Package name, e.g. com.example.myapp

ParametersJSON Schema
NameRequiredDescriptionDefault
package_nameYes

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It mentions the prerequisite (committed changes reviewed) and the no-op condition, but lacks information on whether the operation is idempotent, reversible, requires permissions, or has side effects. For a publish action, more detail on expected behavior and error conditions is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: three sentences plus an args section. Every sentence adds value, no redundancy. The main action is stated first, followed by usage context and condition. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one required parameter, no output schema, no annotations), the description covers the core workflow: it explains when to call it (after other tools and review) and the no-op condition. It lacks details on return values or error handling, but for a straightforward publish operation, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides an example value for the single parameter package_name ('e.g. com.example.myapp'), adding format context beyond the schema's just 'Package Name'. However, with 0% schema description coverage, more detail (e.g., constraints, validation rules) would be beneficial. The example is minimal but helpful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Send approved changes live when Managed Publishing is enabled.' It specifies the verb 'publish' and the resource 'managed release', and distinguishes itself from sibling tools like create_release, update_release, and promote_release by indicating it is the final step after review.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Call after changes committed via create_release/update_release/promote_release have been reviewed in Play Console.' It also notes the no-op condition when Managed Publishing is off, setting expectations. However, it does not explicitly mention alternatives or when not to use it beyond the no-op case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_releaseA

Update rollout percentage and/or status of an existing release.

Examples: increase rollout (rollout_percentage=50), complete (=100), halt (status="halted"), resume (status="inProgress").

NOTE: With Managed Publishing enabled, changes are held pending approval. Call publish_managed_release to send live.

Args: package_name: Package name, e.g. com.example.myapp track: Track to update. Default "production". rollout_percentage: New rollout % (0–100). Pass 100 to complete. status: "inProgress", "halted", "completed", or "draft". version_codes: Filter to release containing these codes. Default: first release found. submit_for_review: If True, submits changes for Google Play review. Set to False to keep as draft without submitting for review.

ParametersJSON Schema
NameRequiredDescriptionDefault
trackNoproduction
statusNo
package_nameYes
version_codesNo
submit_for_reviewNo
rollout_percentageNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description carries full burden. It discloses ability to update rollout and status, effect of submit_for_review, and the Managed Publishing hold. However, it doesn't mention permissions, rate limits, or whether changes overwrite existing settings completely.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is moderate length, uses examples upfront, bullet lists for parameters, and a NOTE for important caveat. Could be slightly more concise, but structure is logical and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, no output schema, and mutation tool, description covers all parameters with examples and default behaviors. Missing info on return value or error handling, but overall adequate for agent decision-making.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, so description fully compensates by explaining each parameter: allowed values (status), defaults (track='production', version_codes='first release found'), and behavior (rollout_percentage=100 completes). Adds significant value beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb ('Update') and resource ('existing release'), specifies scope (rollout percentage and/or status), provides examples, and distinguishes from siblings like create_release and promote_release.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description gives examples of when to use (increase rollout, complete, halt, resume) and includes a NOTE about Managed Publishing pointing to publish_managed_release. It lacks explicit exclusion of siblings but context and examples imply appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_testersA

Replace the tester list for an internal or alpha track.

WARNING: Full replacement — omitted testers lose access. Call get_testers first to preserve existing testers.

Args: package_name: Package name, e.g. com.example.myapp track: "internal" (default) or "alpha". emails: Tester email addresses. Empty list removes all individuals. google_groups: Google Group addresses. Empty list removes all groups. submit_for_review: If True, submits changes for Google Play review. Set to False to keep as draft without submitting for review.

ParametersJSON Schema
NameRequiredDescriptionDefault
trackNointernal
emailsNo
package_nameYes
google_groupsNo
submit_for_reviewNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully bears the burden of behavioral transparency. It clearly warns: "WARNING: Full replacement — omitted testers lose access." and explains the effect of each parameter (e.g., empty emails removes individuals, submit_for_review controls review state). This is comprehensive for a destructive 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet comprehensive, with a front-loaded warning followed by a structured Args list. Every sentence adds value, and the total length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and moderate complexity (5 params, destructive action), the description is complete. It covers safety warnings, parameter details, and submission behavior. The only minor omission is not explicitly stating the default track value, but the default is implied in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds detailed semantics for all 5 parameters, including examples (e.g., package_name: com.example.myapp), valid values (track: internal or alpha), and behavior (empty lists remove all). This significantly adds meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: "Replace the tester list for an internal or alpha track." It uses a specific verb (replace/reset) and identifies the resource (tester list) and scope (internal or alpha tracks), effectively distinguishing it from sibling tools like get_testers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly warns to call get_testers first to preserve existing testers, providing a clear prerequisite. It also explains the behavior of each parameter (e.g., empty lists remove all). However, it does not explicitly state when to avoid using this tool (e.g., if you want to add testers incrementally without replacement).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_artifactA

Upload an APK or AAB and create a release on the given track.

File type auto-detected from extension (.apk/.aab). Upload and track assignment are atomic.

Args: package_name: Package name, e.g. com.example.myapp file_path: Absolute local path to the APK or AAB. track: "internal" (default), "alpha", "beta", or "production". status: "draft" (default), "inProgress", or "completed". rollout_percentage: Rollout % when status is "inProgress". Default 10%. release_name: Optional human-readable name. release_notes: Optional {lang: text} dict, e.g. {"en-US": "Initial release"}. submit_for_review: If True, submits changes for Google Play review. Set to False to keep as draft without submitting for review.

ParametersJSON Schema
NameRequiredDescriptionDefault
trackNointernal
statusNodraft
file_pathYes
package_nameYes
release_nameNo
release_notesNo
submit_for_reviewNo
rollout_percentageNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses key behaviors: file type auto-detection, atomic upload and track assignment, and effects of parameters like submit_for_review and rollout_percentage. This goes beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a clear heading and bullet-pointed args. While slightly verbose, every sentence provides value. It could be slightly trimmed but remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, no output schema, and no annotations, the description covers all parameters and crucial behaviors (atomicity, file detection). It is complete enough for an AI agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates. It explains each parameter's purpose, defaults, and constraints (e.g., release_notes format, rollout_percentage default 10%). This adds significant meaning beyond the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Upload an APK or AAB and create a release on the given track', clearly specifying the action (upload and create), resource (APK/AAB), and context (track). This distinguishes it from siblings like 'update_release' or 'promote_release'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides detailed parameter defaults and behaviors but does not explicitly guide when to use this tool versus alternatives like 'create_release' or 'upload_to_internal_sharing'. It lacks explicit when-to-use or when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_to_internal_sharingA

Upload APK or AAB to Internal App Sharing and get a shareable link.

Shares a build via URL without assigning it to a track. Ideal for quick one-off testing. File type auto-detected from extension (.apk/.aab).

Args: package_name: Package name, e.g. com.example.myapp file_path: Absolute local path to the APK or AAB.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYes
package_nameYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Mentions file type auto-detection from extension, which is helpful, but does not disclose potential errors, access requirements, or side effects beyond the upload.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: a one-sentence summary, a clarifying sentence, and parameter descriptions. No wasted words, essential information front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and lack of output schema, the description sufficiently covers the purpose, usage, and parameters. It explains the return (shareable link) and file detection. Minor omission: no mention of error handling or permissions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, but the description provides clear, example-rich explanations for both parameters (package_name and file_path), adding meaning beyond the raw schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states uploads APK/AAB to Internal App Sharing and returns a shareable link. Distinguishes from track assignments, and specifies the resource and verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Ideal for quick one-off testing' and 'Shares a build via URL without assigning it to a track', which implies when to use and differentiates from sibling tools like upload_artifact. However, lacks explicit when-not-to-use or alternative suggestions.

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.

  1. 5 tool updatesv0.6.0
    • Changedcreate_release1 field changed
      • addedInput schema / properties / submit_for_review
        Added value: +{
        +  "default": true,
        +  "title": "Submit For Review",
        +  "type": "boolean"
        +}
    • Changedpromote_release1 field changed
      • addedInput schema / properties / submit_for_review
        Added value: +{
        +  "default": true,
        +  "title": "Submit For Review",
        +  "type": "boolean"
        +}
    • Changedupdate_release1 field changed
      • addedInput schema / properties / submit_for_review
        Added value: +{
        +  "default": true,
        +  "title": "Submit For Review",
        +  "type": "boolean"
        +}
    • Changedupdate_testers1 field changed
      • addedInput schema / properties / submit_for_review
        Added value: +{
        +  "default": true,
        +  "title": "Submit For Review",
        +  "type": "boolean"
        +}
    • Changedupload_artifact1 field changed
      • addedInput schema / properties / submit_for_review
        Added value: +{
        +  "default": true,
        +  "title": "Submit For Review",
        +  "type": "boolean"
        +}
  2. 16 tool updatesv0.5.7
    • Changedcreate_release1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "create_releaseOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_anr_rate1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_anr_rateOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_crash_rate1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_crash_rateOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_testers1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_testersOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_track_info1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_track_infoOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_vitals_summary1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_vitals_summaryOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_wakelock_rate1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_wakelock_rateOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_wakeup_rate1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_wakeup_rateOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_artifacts1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_artifactsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_tracks1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_tracksOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpromote_release1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "promote_releaseOutput",
        -  "type": "object"
        -}New value: +null
    • Changedpublish_managed_release1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "publish_managed_releaseOutput",
        -  "type": "object"
        -}New value: +null
    • Changedupdate_release1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "update_releaseOutput",
        -  "type": "object"
        -}New value: +null
    • Changedupdate_testers1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "update_testersOutput",
        -  "type": "object"
        -}New value: +null
    • Changedupload_artifact1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "upload_artifactOutput",
        -  "type": "object"
        -}New value: +null
    • Changedupload_to_internal_sharing1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "title": "Result",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "upload_to_internal_sharingOutput",
        -  "type": "object"
        -}New value: +null
  3. 16 tool updatesv0.5.0
    • First observedcreate_release
    • First observedget_anr_rate
    • First observedget_crash_rate
    • First observedget_testers
    • First observedget_track_info
    • First observedget_vitals_summary
    • First observedget_wakelock_rate
    • First observedget_wakeup_rate
    • First observedlist_artifacts
    • First observedlist_tracks
    • First observedpromote_release
    • First observedpublish_managed_release
    • First observedupdate_release
    • First observedupdate_testers
    • First observedupload_artifact
    • First observedupload_to_internal_sharing

TDQS

A3.9/5.0

Scored across 16 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions, but list_tracks and get_track_info overlap somewhat, and create_release vs upload_artifact could be confused since upload_artifact also creates a release. Descriptions are specific enough to resolve most ambiguity.

Naming Consistency5/5

All tool names consistently follow a lowercase snake_case verb_noun pattern (list_, get_, create_, update_, promote_, publish_, upload_). The few longer names like upload_to_internal_sharing still fit the pattern clearly.

Tool Count4/5

16 tools is slightly above the ideal 3-15 range but appropriate given the server covers releases, artifacts, testers, and vitals. Each tool serves a distinct purpose and none feel redundant.

Completeness4/5

Core release lifecycle, artifact upload, tester management, and vitals monitoring are well covered. Minor gaps exist around removing artifacts/releases and listing all apps, but these are workable via existing tools.

Maintenance

ActivityInactive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables to interact with Google Play Console, allowing release management, app vitals monitoring, and APK/AAB deployment via a service account.
    -
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that drives Google Play releases: bundle upload, track releases (internal/closed/open/production), listing metadata, store graphics, and review replies.
    8
    MIT