{
  "markdown": "# Google Play Console MCP\n\n[![Google Play Console MCP server](https://glama.ai/mcp/servers/AgiMaulana/GooglePlayConsoleMcp/badges/card.svg)](https://glama.ai/mcp/servers/AgiMaulana/GooglePlayConsoleMcp)\n\n[![GooglePlayConsoleMcp MCP server](https://glama.ai/mcp/servers/AgiMaulana/GooglePlayConsoleMcp/badges/score.svg)](https://glama.ai/mcp/servers/AgiMaulana/GooglePlayConsoleMcp)\n[![MCP Badge](https://lobehub.com/badge/mcp/agimaulana-googleplayconsolemcp)](https://lobehub.com/mcp/agimaulana-googleplayconsolemcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nA Python [Model Context Protocol](https://modelcontextprotocol.io/) server that\nlets AI assistants (Claude, etc.) manage the full Google Play Store release\nlifecycle directly — from uploading artifacts to managing testers, rollouts,\nand Android Vitals.\n\n<!-- mcp-name: io.github.AgiMaulana/google-play-mcp -->\n\n---\n\n## Quick start\n\n### Option A — `uvx` (recommended, no install needed)\n\nRun this once. Claude automatically starts and stops the server for every session — you never have to touch it again.\n\n```bash\nclaude mcp add google-play-mcp \\\n  -e GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json \\\n  -- uvx google-play-mcp\n```\n\n> Requires `uv` — install with `brew install uv` or `curl -Lsf https://astral.sh/uv/install.sh | sh`\n\n### Option B — `pip install`\n\nIf you prefer a permanent install:\n\n```bash\npip install google-play-mcp\n\nclaude mcp add google-play-mcp \\\n  -e GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json \\\n  -- google-play-mcp\n```\n\n### Option C — HTTP (local server)\n\nOnly needed if you want to connect via HTTP transport instead of stdio:\n\n```bash\n# Terminal 1 — start the server\nGOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json \\\n  uvx google-play-mcp --transport http --port 8080\n\n# Terminal 2 — register with Claude\nclaude mcp add --transport http google-play-mcp http://localhost:8080\n```\n\n> **How stdio works:** With Options A and B, there is no server to start manually.\n> Claude launches the process in the background when a session opens and shuts it\n> down when the session ends. Zero maintenance.\n\n---\n\n## Features\n\n### Tracks & Releases\n\n| Tool | Description |\n|---|---|\n| `list_tracks` | List all tracks (internal, alpha, beta, production) with releases and country availability |\n| `get_track_info` | Get detailed status, rollout %, and release notes for a specific track |\n| `create_release` | Create or replace a release on any track with rollout %, release notes, and country targeting |\n| `update_release` | Update rollout %, halt, resume, or complete an existing release |\n| `promote_release` | Promote a release between tracks (e.g. internal → alpha → beta → production) |\n\n### Artifact Management\n\n| Tool | Description |\n|---|---|\n| `list_artifacts` | List all APKs and AABs with their version codes and SHA hashes |\n| `upload_artifact` | Upload an APK or AAB and create a release on a track in one step |\n| `upload_to_internal_sharing` | Upload a build to Internal App Sharing and get a shareable download URL |\n\n### Tester Management\n\n| Tool | Description |\n|---|---|\n| `get_testers` | Get tester email addresses and Google Groups for internal/closed testing |\n| `update_testers` | Replace the tester list for an internal or closed testing track |\n\n### Android Vitals\n\n| Tool | Description |\n|---|---|\n| `get_crash_rate` | Daily crash rate and user-perceived crash rate by version code |\n| `get_anr_rate` | Daily ANR rate and user-perceived ANR rate by version code |\n| `get_vitals_summary` | Combined crash + ANR overview with bad behavior threshold indicators |\n| `get_wakelock_rate` | Daily stuck background wake lock rate by version code (battery health) |\n| `get_wakeup_rate` | Daily excessive wakeup rate by version code (battery health) |\n\n---\n\n## Prerequisites\n\n1. **`uv`** — [install guide](https://docs.astral.sh/uv/getting-started/installation/)\n2. A **Google Cloud service account** with the JSON key downloaded.\n3. The service account added to **Google Play Console** with the correct permissions (see below).\n4. These APIs enabled in your Google Cloud project:\n   - [Google Play Android Developer API](https://console.cloud.google.com/apis/library/androidpublisher.googleapis.com)\n   - [Google Play Developer Reporting API](https://console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com)\n\n### Required Play Console permissions\n\n| Tools | Minimum permission required |\n|---|---|\n| `upload_artifact`, `create_release`, `update_release`, `promote_release`, `update_testers` | **Release to production, exclude devices, and use app signing by Google Play** |\n| `upload_to_internal_sharing` | **Release to testing tracks** |\n| `list_tracks`, `get_track_info`, `list_artifacts`, `get_testers` | **View app information and download bulk reports (read-only)** |\n| `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 |\n\n> **Important:** Release Manager does **not** grant Reporting API access. You must also enable\n> **View app information and download bulk reports (read-only)** — both at account level and\n> per-app level — for the Vitals tools to work.\n\n---\n\n## Claude Desktop integration\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS):\n\n```json\n{\n  \"mcpServers\": {\n    \"google-play\": {\n      \"command\": \"uvx\",\n      \"args\": [\"google-play-mcp\"],\n      \"env\": {\n        \"GOOGLE_APPLICATION_CREDENTIALS\": \"/absolute/path/to/service-account.json\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop after saving.\n\n---\n\n## Service account setup\n\n1. Go to [IAM & Admin → Service Accounts](https://console.cloud.google.com/iam-admin/serviceaccounts) in your GCP project.\n2. Create a service account (or use an existing one) and download a JSON key.\n3. In [Google Play Console](https://play.google.com/console) → **Setup → API access**:\n   - Link your Google Cloud project.\n   - Find the service account → **Manage Play Console permissions**.\n   - Under **Account permissions**, enable **View app information and download bulk reports (read-only)**.\n   - Under **App permissions** for each app, enable:\n     - **View app information and download bulk reports (read-only)**\n     - **Release to production…** _(if you need write access)_\n   - Click **Apply** → **Invite user**.\n\n> Permissions must be granted at **both** account level and per-app level.\n> Account-level alone is not sufficient for the Reporting API.\n\n---\n\n## Tool reference\n\n### `list_tracks`\n\n```\npackage_name : str  — e.g. \"com.example.myapp\"\n```\n\nReturns all tracks with their releases, rollout percentages, statuses, and country availability.\n\n---\n\n### `get_track_info`\n\n```\npackage_name : str\ntrack        : str  — \"internal\" | \"alpha\" | \"beta\" | \"production\" (default: \"production\")\n```\n\nReturns a human-readable summary plus releases with status, rollout %, version codes, and release notes.\n\n---\n\n### `create_release`\n\n```\npackage_name       : str\ntrack              : str        — \"internal\" | \"alpha\" | \"beta\" | \"production\"\nversion_codes      : list[int]  — e.g. [1042]\nrollout_percentage : float      — default 10.0 (used when status is \"inProgress\")\nstatus             : str        — \"draft\" (default) | \"inProgress\" | \"halted\" | \"completed\"\nrelease_name       : str        — optional\nrelease_notes      : dict       — optional, e.g. {\"en-US\": \"Bug fixes\", \"fr-FR\": \"Corrections\"}\ncountry_codes      : list[str]  — optional ISO 3166-1 alpha-2 codes, e.g. [\"US\", \"GB\"]\n```\n\nCreates or replaces a release on the given track. Use `status=\"inProgress\"` with a\n`rollout_percentage` for a staged production rollout, or `status=\"completed\"` to release\nto all users immediately.\n\n---\n\n### `update_release`\n\n```\npackage_name       : str\ntrack              : str    — default \"production\"\nrollout_percentage : float  — optional; pass 100 to complete the rollout\nstatus             : str    — optional; \"inProgress\" | \"halted\" | \"completed\" | \"draft\"\nversion_codes      : list[int]  — optional filter; targets first matching release if omitted\n```\n\nUpdate an existing release. Common use cases:\n- **Increase rollout:** `update_release(pkg, rollout_percentage=50)`\n- **Complete rollout:** `update_release(pkg, rollout_percentage=100)`\n- **Halt rollout:** `update_release(pkg, status=\"halted\")`\n- **Resume rollout:** `update_release(pkg, status=\"inProgress\")`\n\n---\n\n### `promote_release`\n\n```\npackage_name       : str\nfrom_track         : str        — \"internal\" | \"alpha\" | \"beta\"\nto_track           : str        — \"alpha\" | \"beta\" | \"production\"\nversion_codes      : list[int]\nrollout_percentage : float      — default 10.0\nrelease_name       : str        — optional override\nrelease_notes      : dict       — optional override; inherits from source if omitted\n```\n\nCopies a release from one track to another. Release notes and name are inherited from the\nsource release unless explicitly overridden.\n\n---\n\n### `list_artifacts`\n\n```\npackage_name : str\n```\n\nReturns all APKs and AABs sorted by version code (newest first) with SHA hashes.\n\n---\n\n### `upload_artifact`\n\n```\npackage_name       : str\nfile_path          : str    — absolute local path to .apk or .aab\ntrack              : str    — default \"internal\"\nstatus             : str    — \"draft\" (default) | \"inProgress\" | \"completed\"\nrollout_percentage : float  — default 10.0 (used when status is \"inProgress\")\nrelease_name       : str    — optional\nrelease_notes      : dict   — optional\n```\n\nUploads an APK or AAB (auto-detected from extension) and creates a release on the given\ntrack in a single atomic operation. Returns the assigned version code.\n\n---\n\n### `upload_to_internal_sharing`\n\n```\npackage_name : str\nfile_path    : str  — absolute local path to .apk or .aab\n```\n\nUploads a build to Internal App Sharing (bypasses track assignment) and returns a\nshareable `downloadUrl`. Testers must have Internal App Sharing enabled in their Play\nStore settings. Ideal for quick one-off testing without affecting any release track.\n\n---\n\n### `get_testers`\n\n```\npackage_name : str\ntrack        : str  — \"internal\" (default) | \"alpha\"\n```\n\nReturns the list of tester email addresses and Google Groups for the track.\n\n---\n\n### `update_testers`\n\n```\npackage_name  : str\ntrack         : str         — \"internal\" (default) | \"alpha\"\nemails        : list[str]   — optional; full replacement list of tester emails\ngoogle_groups : list[str]   — optional; full replacement list of Google Group emails\n```\n\n> **Warning:** This is a full replacement. Testers not in the new list will lose access.\n> Call `get_testers` first to retrieve the current list if you only want to add/remove individuals.\n\n---\n\n### `get_crash_rate`\n\n```\npackage_name : str\ndays         : int  — look-back window, 1–30 (default 7)\nversion_code : str  — optional single version code to filter\n```\n\nReturns daily `crashRate`, `userPerceivedCrashRate`, and `distinctUsers` per version code.\nGoogle's bad behavior threshold for user-perceived crash rate is **~1.09%**.\n\n---\n\n### `get_anr_rate`\n\n```\npackage_name : str\ndays         : int  — look-back window, 1–30 (default 7)\nversion_code : str  — optional single version code to filter\n```\n\nReturns daily `anrRate`, `userPerceivedAnrRate`, and `distinctUsers` per version code.\nGoogle's bad behavior threshold for user-perceived ANR rate is **~0.47%**.\n\n---\n\n### `get_vitals_summary`\n\n```\npackage_name : str\ndays         : int  — look-back window, 1–30 (default 7)\n```\n\nReturns a combined crash + ANR summary aggregated per version code, with averages over\nthe period and `exceedsCrashThreshold` / `exceedsAnrThreshold` flags. The latest version\nis highlighted as `latestVersionSummary`.\n\n### `get_wakelock_rate`\n\n```\npackage_name : str\ndays         : int  — look-back window, 1–30 (default 7)\nversion_code : str  — optional single version code to filter\n```\n\nReturns daily `stuckBackgroundWakelockRate` and `distinctUsers` per version code.\nRelevant for 2026 Google Play battery health enforcement — apps with an excessive\nproportion of sessions holding a partial wake lock for more than 1 hour in the background\nmay be penalized.\n\n---\n\n### `get_wakeup_rate`\n\n```\npackage_name : str\ndays         : int  — look-back window, 1–30 (default 7)\nversion_code : str  — optional single version code to filter\n```\n\nReturns daily `excessiveWakeupRate` and `distinctUsers` per version code.\nRelevant for 2026 Google Play battery health enforcement — apps that wake the CPU too\nfrequently (above platform thresholds) may be penalized.\n\n---\n\n## Troubleshooting\n\n### `403 Forbidden` on Vitals tools\n\n```\n403 Client Error: Forbidden for url: https://playdeveloperreporting.googleapis.com/...\n```\n\nThis error has two common causes — check both:\n\n**1. Google Play Developer Reporting API not enabled**\n\nEnable it in your Google Cloud project:\n[console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com](https://console.cloud.google.com/apis/library/playdeveloperreporting.googleapis.com)\n\n**2. Service account lacks per-app Reporting API access**\n\n1. Play Console → **Setup → API access** → find the service account → **Manage Play Console permissions**.\n2. Under **App permissions**, select the app and enable **View app information and download bulk reports (read-only)**.\n3. Save and wait a few minutes for the change to propagate.\n\n### `404 Package not found`\n\nThe service account must be linked to the same Google Play Console account that owns the app.\nGo to Play Console → **Setup → API access** and verify the service account is listed and has been invited.\n\n---\n\n## Marketplaces\n\n| Registry | Link |\n|---|---|\n| [PyPI](https://pypi.org/project/google-play-mcp/) | `pip install google-play-mcp` |\n| [Smithery](https://smithery.ai/server/@agimaulana/google-play-mcp) | search `google-play-mcp` |\n| [Official MCP Registry](https://registry.modelcontextprotocol.io/?search=google-play-mcp) | `google-play-mcp` |\n\n---\n\n## License\n\nMIT\n",
  "bytes": 14033,
  "sha": "6c8f4d405f298abb48526e2058bebb9d77a4f7716b14cf247c45e33f5ceb70da",
  "repo_slug": "agimaulana/googleplayconsolemcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_agimaulana_google_play_mcp_56fc6b3e/readme"
}