Skip to main content
Glama

Play Store MCP Server

CI codecov Security Rating Reliability Rating Maintainability Rating Vulnerabilities

PyPI version Docker Python 3.11+ Lines of Code License: MIT play-store-mcp MCP server

An MCP (Model Context Protocol) server that connects to the Google Play Developer API. Deploy apps, manage releases, respond to reviews, and monitor app health โ€” all through your AI assistant.

๐Ÿ“– Full Documentation

โœจ Features

  • ๐Ÿš€ App Deployment โ€” Deploy APK/AAB files to any track (internal, alpha, beta, production)

  • โšก Batch Operations โ€” Deploy to multiple tracks simultaneously

  • ๐ŸŒ Multi-Language Support โ€” Deploy with release notes in multiple languages

  • โœ… Input Validation โ€” Validate package names, tracks, and text before API calls

  • ๐Ÿ”„ Automatic Retries โ€” Built-in retry logic with exponential backoff for transient failures

  • ๐Ÿ“ Store Listings โ€” Update app titles, descriptions, and videos for any language

  • ๐Ÿ“ˆ Release Management โ€” Promote releases between tracks, manage staged rollouts

  • ๐Ÿ‘ฅ Tester Management โ€” Add and manage testers for testing tracks

  • โญ Review Management โ€” Fetch and reply to user reviews

  • ๐Ÿ’ณ Subscription Management โ€” List subscriptions and check purchase status

  • ๐Ÿ›’ In-App Products โ€” List and manage in-app products

  • ๐Ÿ“ฆ Expansion Files โ€” Manage APK expansion files for large apps

  • ๐Ÿงพ Orders โ€” Retrieve detailed transaction information

  • ๐Ÿณ Docker Support โ€” Run as a container with health checks

  • ๐Ÿ”‘ Per-Request Credentials โ€” Bring-your-own-credentials for multi-tenant deployments

  • ๐Ÿ”’ Secure โ€” Google Cloud service account authentication

Related MCP server: Google Play Developer API MCP Server

๐Ÿš€ Quick Start

Prerequisites

  1. Google Cloud Project with the Google Play Developer API enabled

  2. Service Account with access to your Play Console

  3. Python 3.11+, uvx, or Docker installed

Installation

# Run directly without installation
uvx play-store-mcp

Using pip

pip install play-store-mcp
play-store-mcp

Using Docker

docker run -e GOOGLE_APPLICATION_CREDENTIALS=/creds/key.json \
  -v /path/to/service-account.json:/creds/key.json:ro \
  ghcr.io/lusky3/play-store-mcp:latest

From source

git clone https://github.com/lusky3/play-store-mcp.git
cd play-store-mcp
pip install -e .
play-store-mcp

Configuration

Set the path to your service account key:

export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json

Running with HTTP Transport

For remote access or public deployments, run the server with streamable-http transport:

play-store-mcp --transport streamable-http --host 0.0.0.0 --port 8000

The server exposes a /health endpoint for monitoring.

For public deployments where users bring their own credentials, configure your MCP client to pass credentials in headers:

{
  "mcpServers": {
    "play-store": {
      "url": "https://your-server.com/mcp",
      "transport": "http",
      "headers": {
        "X-Google-Credentials-Base64": "YOUR_BASE64_ENCODED_CREDENTIALS"
      }
    }
  }
}

To get your base64-encoded credentials:

base64 -w 0 < service-account.json

Per-request credentials are isolated โ€” each request uses only the credentials provided in its headers. No credentials are stored server-side or shared between requests.

Server-Side Credentials (For Private/Trusted Deployments)

For private deployments, set credentials via environment variable at server startup:

export GOOGLE_PLAY_STORE_CREDENTIALS='{"type":"service_account",...}'
# or
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json

play-store-mcp --transport streamable-http --host 0.0.0.0 --port 8000

Read-Only Mode

To point the server at a live Play Console without any risk of mutating it, run in read-only mode. All write tools (deploy, promote, halt, rollout, reply to reviews, listing/tester updates) return an error instead of calling the API; read tools are unaffected.

play-store-mcp --read-only
# or
export PLAY_STORE_MCP_READ_ONLY=1

Code Mode (Experimental, enabled by default)

By default the tools are served as three meta-tools (search/get_schema/ execute) instead of the full tool list, cutting per-request tool-list token overhead. The sandbox execute runs in is a base dependency, so this works out of the box โ€” no extra install needed.

To opt out and use the classic tool list instead (CODE_MODE is env-only โ€” there is no CLI flag):

export CODE_MODE=0

Under code mode one execute call can invoke up to 50 tool calls (including mutations) behind a single approval. Read-only enforcement still applies inside the sandbox, so pair it with --read-only / PLAY_STORE_MCP_READ_ONLY=1 unless you need writes.

๐Ÿ”ง MCP Client Configuration

Claude Desktop

Add to your claude_desktop_config.json:

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

Kiro

Add to .kiro/settings/mcp.json:

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

Gemini CLI / Other MCP Clients

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

๐Ÿ› ๏ธ Available Tools

Publishing Tools

Tool

Description

deploy_app

Deploy an APK/AAB to a track with optional staged rollout and single-language release notes

deploy_app_multilang

Deploy an APK/AAB with multi-language release notes

promote_release

Promote a release from one track to another

get_releases

Get release status for all tracks

halt_release

Halt a staged rollout

update_rollout

Update rollout percentage for a staged release

get_app_details

Get app metadata (title, description, etc.)

Store Listings Tools

Tool

Description

get_listing

Get store listing for a specific language

update_listing

Update store listing (title, descriptions, video)

list_all_listings

List all store listings for all languages

Review Tools

Tool

Description

get_reviews

Fetch recent reviews with optional filters

reply_to_review

Reply to a user review

Subscription Tools

Tool

Description

list_subscriptions

List subscription products for an app

get_subscription_status

Check subscription purchase status

list_voided_purchases

List voided purchases

In-App Products Tools

Tool

Description

list_in_app_products

List all in-app products for an app

get_in_app_product

Get details of a specific in-app product

Testers Management Tools

Tool

Description

get_testers

Get testers for a specific testing track

update_testers

Update testers for a testing track

Orders Tools

Tool

Description

get_order

Get detailed order/transaction information

Expansion Files Tools

Tool

Description

get_expansion_file

Get APK expansion file information

Validation Tools

Tool

Description

validate_package_name

Validate package name format

validate_track

Validate track name

validate_listing_text

Validate store listing text lengths

Batch Operations Tools

Tool

Description

batch_deploy

Deploy to multiple tracks simultaneously

๐Ÿ“‹ Google Cloud Setup

1. Create a Service Account

  1. Go to Google Cloud Console

  2. Create a new project or select an existing one

  3. Enable the Google Play Developer API

  4. Go to IAM & Admin > Service Accounts

  5. Create a new service account

  6. Download the JSON key file

2. Grant Play Console Access

  1. Go to Google Play Console

  2. Navigate to Users and permissions

  3. Click Invite new users

  4. Enter the service account email (from the JSON file)

  5. Grant the following permissions:

    • Release apps to testing tracks (for internal/alpha/beta)

    • Release apps to production (for production releases)

    • Reply to reviews (for review management)

    • View app information and download bulk reports (for app details and orders)

๐Ÿ”’ Environment Variables

Variable

Description

Required

GOOGLE_APPLICATION_CREDENTIALS

Path to service account JSON key

Yes (or use per-request credentials)

GOOGLE_PLAY_STORE_CREDENTIALS

Inline JSON credentials string

Alternative to file path

PLAY_STORE_MCP_LOG_LEVEL

Log level (DEBUG, INFO, WARNING, ERROR)

No (default: INFO)

PLAY_STORE_MCP_DISABLE_DNS_REBINDING

Disable DNS rebinding protection (for cloud/reverse-proxy deployments)

No

PLAY_STORE_MCP_ADMIN_TOKEN

Require Authorization: Bearer <token> on the /credentials endpoint (for deployments behind a reverse proxy)

No

PLAY_STORE_MCP_READ_ONLY

Disable all write operations (deploy, promote, rollout, reply, listing/tester updates)

No (default: off)

PLAY_STORE_MCP_DOWNLOAD_DIR

Directory that APK/AAB downloads are confined to (path-traversal / arbitrary-write protection). Downloads are always confined; defaults to the working directory when unset

No (defaults to cwd); recommended for network/hosted deployments โ€” the server warns if unset

CODE_MODE

Set to 0 to opt out of the code-mode transform and use the classic tool list

No (default: on)

๐Ÿงช Development

Setup

git clone https://github.com/lusky3/play-store-mcp.git
cd play-store-mcp
uv sync --dev

Running Tests

uv run pytest -v --cov=src/play_store_mcp

Linting

ruff check src/ tests/
ruff format src/ tests/

Type Checking

mypy src/

๐Ÿ› Troubleshooting

Error: "Service account key not found"

Ensure GOOGLE_APPLICATION_CREDENTIALS points to a valid JSON file:

ls -la $GOOGLE_APPLICATION_CREDENTIALS

Error: "The caller does not have permission"

Verify the service account has been granted access in Play Console with the required permissions.

Error: "Package name not found"

Ensure the app exists in Play Console and the service account has access to it.

๐Ÿ“„ License

MIT License โ€” see LICENSE for details.

๐Ÿ™ Acknowledgments

๐Ÿค– AI Usage Disclaimer

Portions of this codebase were generated with the assistance of Large Language Models (LLMs). All AI-generated code has been reviewed and tested to ensure quality and correctness.

Available Tools

3 tools
executeExecuteA

Chain await call_tool(...) calls in one Python block; prefer returning the final answer from a single block. Use return to produce output. Only call_tool(tool_name: str, params: dict) -> Any is available in scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesPython async code to execute tool calls via call_tool(name, arguments)

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the burden of explaining behavior. It usefully discloses that only `call_tool(tool_name: str, params: dict) -> Any` is in scope and that output is produced with `return`. However, it does not describe execution environment constraints, error behavior, side effects, or persistence across blocks, leaving meaningful gaps.

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 three short sentences with no filler. The core instruction is front-loaded, and every sentence contributes either to usage, output, or scope constraints.

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 single-parameter tool with no output schema, the description is largely sufficient: it explains how to invoke tools, how to return output, and what is available in scope. It could be more complete by noting error/exception behavior or execution restrictions, but these are not critical for basic usage.

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 already documents `code` at 100% coverage, but the description adds real value by specifying the callable signature, the need for `await`, and the output mechanism. This goes beyond merely restating the schema.

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 that the tool executes a Python block which chains `await call_tool(...)` calls and returns output via `return`. It is not a tautology and gives a concrete sense of the tool's role, though it does not explicitly differentiate itself from siblings like `search` or `get_schema`.

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?

It gives clear context for when to use the tool: when multiple tool calls need to be chained in one Python block, and it advises preferring a single block and using `return`. It lacks explicit exclusion criteria or named alternatives, but the usage intent is clear.

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

get_schemaGet SchemaA

Get parameter schemas for specific tools.

Use after searching to get the detail needed to call a tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolsYesList of tool names to get schemas for
detailNo'brief' for names and descriptions, 'detailed' for parameter schemas as markdown, 'full' for complete JSON schemasdetailed

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of conveying behavioral context. It does present this as a read/inspection operation ('Get', 'Use after searching'), and the output schema partially covers return behavior. However, it does not explicitly state that the tool has no side effects, does not execute the requested tools, or how it behaves if a tool name is invalid.

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 two short sentences with no filler. The main purpose is front-loaded, and the workflow guidance directly follows. Every sentence earns its place.

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 low-complexity introspection tool with an output schema and fully documented parameters, the description is largely sufficient. It gives the workflow context ('after searching') and the goal ('detail needed to call a tool'). The main missing piece is a brief note on side-effect-free behavior, but this is minor for a tool like this.

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 input schema already provides 100% coverage with meaningful descriptions for both tools and detail, including the enum meanings. The description adds little parameter-specific value beyond the phrase 'detail needed to call a tool,' so the baseline of 3 applies.

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 identifies the action ('Get') and resource ('parameter schemas for specific tools'), so an agent can quickly understand what the tool does. However, it slightly undersells the output: the detail parameter can return names/descriptions and full JSON schemas, not just parameter schemas. It also doesn't explicitly differentiate from execute, though the workflow hint helps.

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 says to use this tool 'after searching' and frames it as the step to obtain 'the detail needed to call a tool.' This gives useful sequencing relative to the sibling tools search and execute. It stops short of naming explicit exclusions or when not to use it, so it is clear but not fully exhaustive.

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. 120 tool updatesv0.6.1
    • Removedacknowledge_product_purchase
    • Removedactivate_base_plan
    • Removedactivate_purchase_option_offer
    • Removedactivate_subscription_offer
    • Removedadd_app_recovery_targeting
    • Removedbatch_delete_in_app_products
    • Removedbatch_delete_one_time_products
    • Removedbatch_delete_purchase_option_offers
    • Removedbatch_delete_purchase_options
    • Removedbatch_deploy
    • Removedbatch_get_in_app_products
    • Removedbatch_get_one_time_products
    • Removedbatch_get_orders
    • Removedbatch_get_purchase_option_offers
    • Removedbatch_get_subscription_offers
    • Removedbatch_get_subscriptions
    • Removedbatch_migrate_base_plan_prices
    • Removedbatch_update_base_plan_states
    • Removedbatch_update_one_time_products
    • Removedbatch_update_purchase_option_offer_states
    • Removedbatch_update_purchase_option_offers
    • Removedbatch_update_purchase_option_states
    • Removedbatch_update_subscription_offer_states
    • Removedbatch_update_subscription_offers
    • Removedbatch_update_subscriptions
    • Removedcancel_app_recovery
    • Removedcancel_purchase_option_offer
    • Removedcancel_subscription_purchase
    • Removedconsume_product_purchase
    • Removedcreate_app_recovery
    • Removedcreate_device_tier_config
    • Removedcreate_external_transaction
    • Removedcreate_grant
    • Removedcreate_in_app_product
    • Removedcreate_subscription
    • Removedcreate_subscription_offer
    • Removedcreate_system_apk_variant
    • Removedcreate_user
    • Removeddeactivate_base_plan
    • Removeddeactivate_purchase_option_offer
    • Removeddeactivate_subscription_offer
    • Removeddefer_subscription_purchase
    • Removeddelete_all_images
    • Removeddelete_base_plan
    • Removeddelete_grant
    • Removeddelete_image
    • Removeddelete_in_app_product
    • Removeddelete_one_time_product
    • Removeddelete_subscription
    • Removeddelete_subscription_offer
    • Removeddelete_user
    • Removeddeploy_app
    • Removeddeploy_app_multilang
    • Removeddeploy_app_recovery
    • Removeddownload_generated_apk
    • Removeddownload_system_apk_variant
    • Addedexecute
    • Removedget_app_details
    • Removedget_device_tier_config
    • Removedget_expansion_file
    • Removedget_external_transaction
    • Removedget_in_app_product
    • Removedget_listing
    • Removedget_one_time_product
    • Removedget_order
    • Removedget_product_purchase
    • Removedget_product_purchase_v2
    • Removedget_releases
    • Removedget_review
    • Removedget_reviews
    • Addedget_schema
    • Removedget_subscription
    • Removedget_subscription_offer
    • Removedget_subscription_status
    • Removedget_system_apk_variant
    • Removedget_testers
    • Removedhalt_release
    • Removedlist_all_listings
    • Removedlist_apks
    • Removedlist_app_recoveries
    • Removedlist_bundles
    • Removedlist_device_tier_configs
    • Removedlist_generated_apks
    • Removedlist_images
    • Removedlist_in_app_products
    • Removedlist_one_time_products
    • Removedlist_purchase_option_offers
    • Removedlist_subscription_offers
    • Removedlist_subscriptions
    • Removedlist_system_apk_variants
    • Removedlist_users
    • Removedlist_voided_purchases
    • Removedmigrate_base_plan_prices
    • Removedpatch_in_app_product
    • Removedpatch_one_time_product
    • Removedpatch_subscription
    • Removedpatch_subscription_offer
    • Removedpromote_release
    • Removedrefund_external_transaction
    • Removedrefund_order
    • Removedreply_to_review
    • Removedrevoke_subscription_purchase
    • Addedsearch
    • Removedset_data_safety
    • Removedupdate_grant
    • Removedupdate_in_app_product
    • Removedupdate_listing
    • Removedupdate_rollout
    • Removedupdate_testers
    • Removedupdate_user
    • Removedupload_apk
    • Removedupload_bundle
    • Removedupload_deobfuscation_file
    • Removedupload_expansion_file
    • Removedupload_image
    • Removedupload_internal_app_sharing_apk
    • Removedupload_internal_app_sharing_bundle
    • Removedvalidate_listing_text
    • Removedvalidate_package_name
    • Removedvalidate_track
  2. 119 tool updatesv0.5.0
    • Addedacknowledge_product_purchase
    • Addedactivate_base_plan
    • Addedactivate_purchase_option_offer
    • Addedactivate_subscription_offer
    • Addedadd_app_recovery_targeting
    • Addedbatch_delete_in_app_products
    • Addedbatch_delete_one_time_products
    • Addedbatch_delete_purchase_option_offers
    • Addedbatch_delete_purchase_options
    • Changedbatch_deploy13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / file_path / description
        Added value: +"Absolute path to APK or AAB file"
      • removedInput schema / properties / file_path / title
        Removed value: -"File Path"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / release_notes / description
        Added value: +"Optional release notes for all tracks"
      • removedInput schema / properties / release_notes / title
        Removed value: -"Release Notes"
      • addedInput schema / properties / rollout_percentages / description
        Added value: +"Optional dict mapping track names to rollout percentages"
      • removedInput schema / properties / rollout_percentages / title
        Removed value: -"Rollout Percentages"
      • addedInput schema / properties / tracks / description
        Added value: +"List of tracks to deploy to (e.g., [\"internal\", \"alpha\"])"
      • removedInput schema / properties / tracks / title
        Removed value: -"Tracks"
      • removedInput schema / title
        Removed value: -"batch_deployArguments"
      • removedOutput schema / title
        Removed value: -"batch_deployDictOutput"
    • Addedbatch_get_in_app_products
    • Addedbatch_get_one_time_products
    • Addedbatch_get_orders
    • Addedbatch_get_purchase_option_offers
    • Addedbatch_get_subscription_offers
    • Addedbatch_get_subscriptions
    • Addedbatch_migrate_base_plan_prices
    • Addedbatch_update_base_plan_states
    • Addedbatch_update_one_time_products
    • Addedbatch_update_purchase_option_offer_states
    • Addedbatch_update_purchase_option_offers
    • Addedbatch_update_purchase_option_states
    • Addedbatch_update_subscription_offer_states
    • Addedbatch_update_subscription_offers
    • Addedbatch_update_subscriptions
    • Addedcancel_app_recovery
    • Addedcancel_purchase_option_offer
    • Addedcancel_subscription_purchase
    • Addedconsume_product_purchase
    • Addedcreate_app_recovery
    • Addedcreate_device_tier_config
    • Addedcreate_external_transaction
    • Addedcreate_grant
    • Addedcreate_in_app_product
    • Addedcreate_subscription
    • Addedcreate_subscription_offer
    • Addedcreate_system_apk_variant
    • Addedcreate_user
    • Addeddeactivate_base_plan
    • Addeddeactivate_purchase_option_offer
    • Addeddeactivate_subscription_offer
    • Addeddefer_subscription_purchase
    • Addeddelete_all_images
    • Addeddelete_base_plan
    • Addeddelete_grant
    • Addeddelete_image
    • Addeddelete_in_app_product
    • Addeddelete_one_time_product
    • Addeddelete_subscription
    • Addeddelete_subscription_offer
    • Addeddelete_user
    • Changeddeploy_app15 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / file_path / description
        Added value: +"Absolute path to APK or AAB file"
      • removedInput schema / properties / file_path / title
        Removed value: -"File Path"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name (e.g., com.example.myapp)"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / release_notes / description
        Added value: +"Optional release notes for this version (string for single language,\n          or use release_notes_multilang for multiple languages)"
      • removedInput schema / properties / release_notes / title
        Removed value: -"Release Notes"
      • addedInput schema / properties / release_notes_language / description
        Added value: +"Language code for release notes (default: en-US)"
      • removedInput schema / properties / release_notes_language / title
        Removed value: -"Release Notes Language"
      • addedInput schema / properties / rollout_percentage / description
        Added value: +"Rollout percentage (0-100). Default 100 for full rollout."
      • removedInput schema / properties / rollout_percentage / title
        Removed value: -"Rollout Percentage"
      • addedInput schema / properties / track / description
        Added value: +"Release track - one of: internal, alpha, beta, production"
      • removedInput schema / properties / track / title
        Removed value: -"Track"
      • removedInput schema / title
        Removed value: -"deploy_appArguments"
      • removedOutput schema / title
        Removed value: -"deploy_appDictOutput"
    • Changeddeploy_app_multilang13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / file_path / description
        Added value: +"Absolute path to APK or AAB file"
      • removedInput schema / properties / file_path / title
        Removed value: -"File Path"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name (e.g., com.example.myapp)"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / release_notes / description
        Added value: +"Dictionary mapping language codes to release notes\n          (e.g., {\"en-US\": \"Bug fixes\", \"es-ES\": \"Correcciรณn de errores\"})"
      • removedInput schema / properties / release_notes / title
        Removed value: -"Release Notes"
      • addedInput schema / properties / rollout_percentage / description
        Added value: +"Rollout percentage (0-100). Default 100 for full rollout."
      • removedInput schema / properties / rollout_percentage / title
        Removed value: -"Rollout Percentage"
      • addedInput schema / properties / track / description
        Added value: +"Release track - one of: internal, alpha, beta, production"
      • removedInput schema / properties / track / title
        Removed value: -"Track"
      • removedInput schema / title
        Removed value: -"deploy_app_multilangArguments"
      • removedOutput schema / title
        Removed value: -"deploy_app_multilangDictOutput"
    • Addeddeploy_app_recovery
    • Addeddownload_generated_apk
    • Addeddownload_system_apk_variant
    • Changedget_app_details7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / language / description
        Added value: +"Language code for localized content (default: en-US)"
      • removedInput schema / properties / language / title
        Removed value: -"Language"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"get_app_detailsArguments"
      • removedOutput schema / title
        Removed value: -"get_app_detailsDictOutput"
    • Addedget_device_tier_config
    • Changedget_expansion_file9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / expansion_file_type / description
        Added value: +"Type of expansion file (main or patch)"
      • removedInput schema / properties / expansion_file_type / title
        Removed value: -"Expansion File Type"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / version_code / description
        Added value: +"APK version code"
      • removedInput schema / properties / version_code / title
        Removed value: -"Version Code"
      • removedInput schema / title
        Removed value: -"get_expansion_fileArguments"
      • removedOutput schema / title
        Removed value: -"get_expansion_fileDictOutput"
    • Addedget_external_transaction
    • Changedget_in_app_product7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / sku / description
        Added value: +"Product SKU identifier"
      • removedInput schema / properties / sku / title
        Removed value: -"Sku"
      • removedInput schema / title
        Removed value: -"get_in_app_productArguments"
      • removedOutput schema / title
        Removed value: -"get_in_app_productDictOutput"
    • Changedget_listing7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / language / description
        Added value: +"Language code (e.g., en-US, es-ES, fr-FR)"
      • removedInput schema / properties / language / title
        Removed value: -"Language"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"get_listingArguments"
      • removedOutput schema / title
        Removed value: -"get_listingDictOutput"
    • Addedget_one_time_product
    • Changedget_order7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / order_id / description
        Added value: +"Order ID to retrieve"
      • removedInput schema / properties / order_id / title
        Removed value: -"Order Id"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"get_orderArguments"
      • removedOutput schema / title
        Removed value: -"get_orderDictOutput"
    • Addedget_product_purchase
    • Addedget_product_purchase_v2
    • Changedget_releases7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"get_releasesArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_releasesOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Addedget_review
    • Changedget_reviews11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum number of reviews to return (default: 50, max: 100)"
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / translation_language / description
        Added value: +"Optional language code to translate reviews to"
      • removedInput schema / properties / translation_language / title
        Removed value: -"Translation Language"
      • removedInput schema / title
        Removed value: -"get_reviewsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"get_reviewsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Addedget_subscription
    • Addedget_subscription_offer
    • Changedget_subscription_status9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / purchase_token / description
        Added value: +"The purchase token from the client app"
      • removedInput schema / properties / purchase_token / title
        Removed value: -"Purchase Token"
      • addedInput schema / properties / subscription_id / description
        Added value: +"Subscription product ID"
      • removedInput schema / properties / subscription_id / title
        Removed value: -"Subscription Id"
      • removedInput schema / title
        Removed value: -"get_subscription_statusArguments"
      • removedOutput schema / title
        Removed value: -"get_subscription_statusDictOutput"
    • Addedget_system_apk_variant
    • Changedget_testers7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / track / description
        Added value: +"Track name (internal, alpha, beta)"
      • removedInput schema / properties / track / title
        Removed value: -"Track"
      • removedInput schema / title
        Removed value: -"get_testersArguments"
      • removedOutput schema / title
        Removed value: -"get_testersDictOutput"
    • Removedget_vitals_metrics
    • Removedget_vitals_overview
    • Changedhalt_release9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / track / description
        Added value: +"Track containing the release (internal, alpha, beta, production)"
      • removedInput schema / properties / track / title
        Removed value: -"Track"
      • addedInput schema / properties / version_code / description
        Added value: +"Version code of the release to halt"
      • removedInput schema / properties / version_code / title
        Removed value: -"Version Code"
      • removedInput schema / title
        Removed value: -"halt_releaseArguments"
      • removedOutput schema / title
        Removed value: -"halt_releaseDictOutput"
    • Changedlist_all_listings7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"list_all_listingsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_all_listingsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Addedlist_apks
    • Addedlist_app_recoveries
    • Addedlist_bundles
    • Addedlist_device_tier_configs
    • Addedlist_generated_apks
    • Addedlist_images
    • Changedlist_in_app_products7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"list_in_app_productsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_in_app_productsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Addedlist_one_time_products
    • Addedlist_purchase_option_offers
    • Addedlist_subscription_offers
    • Changedlist_subscriptions7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"list_subscriptionsArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_subscriptionsOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Addedlist_system_apk_variants
    • Addedlist_users
    • Changedlist_voided_purchases9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum number of results (default: 100)"
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"list_voided_purchasesArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"list_voided_purchasesOutput"
      • addedOutput schema / x-fastmcp-wrap-result
        Added value: +true
    • Addedmigrate_base_plan_prices
    • Addedpatch_in_app_product
    • Addedpatch_one_time_product
    • Addedpatch_subscription
    • Addedpatch_subscription_offer
    • Changedpromote_release13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / from_track / description
        Added value: +"Source track (internal, alpha, beta)"
      • removedInput schema / properties / from_track / title
        Removed value: -"From Track"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / rollout_percentage / description
        Added value: +"Rollout percentage for target track (0-100)"
      • removedInput schema / properties / rollout_percentage / title
        Removed value: -"Rollout Percentage"
      • addedInput schema / properties / to_track / description
        Added value: +"Destination track (alpha, beta, production)"
      • removedInput schema / properties / to_track / title
        Removed value: -"To Track"
      • addedInput schema / properties / version_code / description
        Added value: +"Version code to promote"
      • removedInput schema / properties / version_code / title
        Removed value: -"Version Code"
      • removedInput schema / title
        Removed value: -"promote_releaseArguments"
      • removedOutput schema / title
        Removed value: -"promote_releaseDictOutput"
    • Addedrefund_external_transaction
    • Addedrefund_order
    • Changedreply_to_review9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / reply_text / description
        Added value: +"Text of the reply (will be visible to the reviewer)"
      • removedInput schema / properties / reply_text / title
        Removed value: -"Reply Text"
      • addedInput schema / properties / review_id / description
        Added value: +"ID of the review to reply to (from get_reviews)"
      • removedInput schema / properties / review_id / title
        Removed value: -"Review Id"
      • removedInput schema / title
        Removed value: -"reply_to_reviewArguments"
      • removedOutput schema / title
        Removed value: -"reply_to_reviewDictOutput"
    • Addedrevoke_subscription_purchase
    • Addedset_data_safety
    • Addedupdate_grant
    • Addedupdate_in_app_product
    • Changedupdate_listing15 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / full_description / description
        Added value: +"Full description (max 4000 characters, optional)"
      • removedInput schema / properties / full_description / title
        Removed value: -"Full Description"
      • addedInput schema / properties / language / description
        Added value: +"Language code (e.g., en-US, es-ES, fr-FR)"
      • removedInput schema / properties / language / title
        Removed value: -"Language"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / short_description / description
        Added value: +"Short description (max 80 characters, optional)"
      • removedInput schema / properties / short_description / title
        Removed value: -"Short Description"
      • addedInput schema / properties / title / description
        Added value: +"App title (max 50 characters, optional)"
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • addedInput schema / properties / video / description
        Added value: +"YouTube video URL (optional)"
      • removedInput schema / properties / video / title
        Removed value: -"Video"
      • removedInput schema / title
        Removed value: -"update_listingArguments"
      • removedOutput schema / title
        Removed value: -"update_listingDictOutput"
    • Changedupdate_rollout11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / rollout_percentage / description
        Added value: +"New rollout percentage (0-100)"
      • removedInput schema / properties / rollout_percentage / title
        Removed value: -"Rollout Percentage"
      • addedInput schema / properties / track / description
        Added value: +"Track containing the release"
      • removedInput schema / properties / track / title
        Removed value: -"Track"
      • addedInput schema / properties / version_code / description
        Added value: +"Version code of the staged release"
      • removedInput schema / properties / version_code / title
        Removed value: -"Version Code"
      • removedInput schema / title
        Removed value: -"update_rolloutArguments"
      • removedOutput schema / title
        Removed value: -"update_rolloutDictOutput"
    • Changedupdate_testers9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / google_groups / description
        Added value: +"List of Google Group email addresses"
      • removedInput schema / properties / google_groups / title
        Removed value: -"Google Groups"
      • addedInput schema / properties / package_name / description
        Added value: +"App package name"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • addedInput schema / properties / track / description
        Added value: +"Track name (internal, alpha, beta)"
      • removedInput schema / properties / track / title
        Removed value: -"Track"
      • removedInput schema / title
        Removed value: -"update_testersArguments"
      • removedOutput schema / title
        Removed value: -"update_testersDictOutput"
    • Addedupdate_user
    • Addedupload_apk
    • Addedupload_bundle
    • Addedupload_deobfuscation_file
    • Addedupload_expansion_file
    • Addedupload_image
    • Addedupload_internal_app_sharing_apk
    • Addedupload_internal_app_sharing_bundle
    • Changedvalidate_listing_text9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / full_description / description
        Added value: +"Full description (max 4000 characters)"
      • removedInput schema / properties / full_description / title
        Removed value: -"Full Description"
      • addedInput schema / properties / short_description / description
        Added value: +"Short description (max 80 characters)"
      • removedInput schema / properties / short_description / title
        Removed value: -"Short Description"
      • addedInput schema / properties / title / description
        Added value: +"App title (max 50 characters)"
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • removedInput schema / title
        Removed value: -"validate_listing_textArguments"
      • removedOutput schema / title
        Removed value: -"validate_listing_textDictOutput"
    • Changedvalidate_package_name5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / package_name / description
        Added value: +"Package name to validate (e.g., com.example.myapp)"
      • removedInput schema / properties / package_name / title
        Removed value: -"Package Name"
      • removedInput schema / title
        Removed value: -"validate_package_nameArguments"
      • removedOutput schema / title
        Removed value: -"validate_package_nameDictOutput"
    • Changedvalidate_track5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / track / description
        Added value: +"Track name to validate (internal, alpha, beta, production)"
      • removedInput schema / properties / track / title
        Removed value: -"Track"
      • removedInput schema / title
        Removed value: -"validate_trackArguments"
      • removedOutput schema / title
        Removed value: -"validate_trackDictOutput"
  3. 27 tool updatesv0.2.0
    • First observedbatch_deploy
    • First observeddeploy_app
    • First observeddeploy_app_multilang
    • First observedget_app_details
    • First observedget_expansion_file
    • First observedget_in_app_product
    • First observedget_listing
    • First observedget_order
    • First observedget_releases
    • First observedget_reviews
    • First observedget_subscription_status
    • First observedget_testers
    • First observedget_vitals_metrics
    • First observedget_vitals_overview
    • First observedhalt_release
    • First observedlist_all_listings
    • First observedlist_in_app_products
    • First observedlist_subscriptions
    • First observedlist_voided_purchases
    • First observedpromote_release
    • First observedreply_to_review
    • First observedupdate_listing
    • First observedupdate_rollout
    • First observedupdate_testers
    • First observedvalidate_listing_text
    • First observedvalidate_package_name
    • First observedvalidate_track

TDQS

A3.8/5.0

Scored across 3 tools

Disambiguation5/5

Each tool occupies a clearly separate stage of the workflow: search discovers tools, get_schema inspects parameters, and execute runs the actual call. There is no overlap or ambiguity between them.

Naming Consistency4/5

Tool names are all lowercase and verb-focused, with get_schema following verb_noun while search and execute are bare verbs. The pattern is mostly predictable but not perfectly uniform.

Tool Count4/5

Three tools is minimal but exactly matches the intended meta-workflow of discover, inspect, and execute. Each tool clearly earns its place, though the set is on the smaller end.

Completeness4/5

The workflow covers the full lifecycle from discovery to execution, enabling an agent to find and call tools effectively. A dedicated list-all-tools capability is missing, but search compensates for that gap.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that provides AI agents with tools to build, deploy, and manage Flutter applications, including APK/AAB generation, keystore management, and CI/CD integration.
    9
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that connects AI assistants to the Google Play Developer API for automated app publishing, subscription management, review monitoring, and tester management.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that exposes Google Play Console analytics to AI agents, including store-listing acquisitions by traffic source, installs, uninstalls, ratings, crashes, subscriptions, and reviews by reading bulk CSV reports from Cloud Storage.
    MIT