# io.github.wiseappsai/play-console-mcp (npm · @wiseappsai/play-console-mcp)

Manage Google Play Console: releases, listings, monetization, reviews, and Android Vitals.

- Trust score: 70/100 (medium)
- Change this week: +34
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-04

## Components

- npm · `@wiseappsai/play-console-mcp`: 70/100 (this document), [markdown](https://verifymcp.io/servers/wiseappsai-play-console-mcp/wiseappsai-play-console-mcp.md), [page](https://verifymcp.io/servers/wiseappsai-play-console-mcp/wiseappsai-play-console-mcp)

## Channel facts

- Registry: `npm`
- Package: `@wiseappsai/play-console-mcp`
- Version: `0.3.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-04.

- **Supply Chain Security**: 85/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (144 of 162), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (144 of 162), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 71/100
  - Repository check failed: the declared repository URL returned HTTP 404.
  - Cryptographically verified build provenance (signed, bound to wiseappsai/play-console-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 64 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 9456 tokens (~270/item across 35 items; 35 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add wiseappsai-play-console-mcp -- npx -y @wiseappsai/play-console-mcp
```

### Codex

```bash
codex mcp add wiseappsai-play-console-mcp -- npx -y @wiseappsai/play-console-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "wiseappsai-play-console-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@wiseappsai/play-console-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add wiseappsai-play-console-mcp --command npx --arg -y --arg @wiseappsai/play-console-mcp
```

### Hermes

```yaml
mcp_servers:
  wiseappsai-play-console-mcp:
    command: "npx"
    args: ["-y", "@wiseappsai/play-console-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "wiseappsai-play-console-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@wiseappsai/play-console-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 70, +4)

- [functional improvement] Stability: unverified → 0.23

### 2026-08-02 (score 66, +66)

- [security improvement] Provenance: unverified → pass
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [security] The attested source repository moved: wiseappsai/play-console-mcp
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional improvement] Tool coverage: unverified → 100
- [functional] Licence: MIT

### 2026-08-01 (score 0, −12)

- [functional regression] Tool coverage: 100 → unverified

### 2026-07-31 (score 12, +12)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 0, −36)

- [security regression] Malware scan: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 36)

First indexed and scored.

## MCP tools (35)

### `play_edit` (~231 tokens)

App edits

Manage the app-edit lifecycle directly: open, inspect, validate, commit, and discard edits used to stage release changes.

Set `action` to one of:
• insert [write]: Open a new edit and return its editId for staging changes. — requires: packageName
• get: Get an open edit by id. — requires: packageName, editId
• validate: Validate an edit's staged changes without committing. — requires: packageName, editId
• commit [write]: Commit an edit, applying all its staged changes. — requires: packageName, editId
• delete [write]: Discard an open edit and its staged changes. — requires: packageName, editId

Input parameters:

- `action` (string, required): The operation to perform.
- `changesNotSentForReview` (boolean): Commit without sending the changes for review.
- `editId` (string): The open edit id.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): AppEdit object (optional; e.g. expiryTimeSeconds).

### `play_tracks` (~349 tokens)

Release tracks

Read and update release tracks (production, beta, etc.), their releases and rollout, tester lists, and country availability.

Set `action` to one of:
• list: List all tracks in an edit. — requires: packageName
• get: Get a single track's configuration. — requires: packageName, track
• patch [write]: Partially update a track (e.g. add/modify a release or rollout). — requires: packageName, track, requestBody
• update [write]: Replace a track's full configuration. — requires: packageName, track, requestBody
• get_testers: Get the tester groups configured for a track. — requires: packageName, track
• patch_testers [write]: Partially update a track's tester groups. — requires: packageName, track, requestBody
• update_testers [write]: Replace a track's tester groups. — requires: packageName, track, requestBody
• get_country_availability: Get the country availability for a track. — requires: packageName, track

Input parameters:

- `action` (string, required): The operation to perform.
- `editId` (string): Open edit ID from play_edit.insert. If omitted, the change is applied in a fresh edit and committed automatically (when PLAY_AUTO_COMMIT_EDITS is on).
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): Track config including releases[] (version codes, status, userFraction, releaseNotes).
- `track` (string): Release track, e.g. production, beta, alpha, internal, or a form-factor track like wear:production.

### `play_artifacts` (~297 tokens)

App bundles & APKs

List and upload release artifacts in an edit: Android App Bundles (.aab), APKs, and externally hosted APK references.

Set `action` to one of:
• list_bundles: List the app bundles in an edit. — requires: packageName
• upload_bundle [write]: Upload an Android App Bundle (.aab) to an edit. — requires: packageName, media
• list_apks: List the APKs in an edit. — requires: packageName
• upload_apk [write]: Upload an APK (.apk) to an edit. — requires: packageName, media
• add_externally_hosted_apk [write]: Register an externally hosted APK (enterprise private apps only). — requires: packageName, requestBody

Input parameters:

- `ackBundleInstallationWarning` (boolean): Acknowledge installation-size warnings to allow the upload.
- `action` (string, required): The operation to perform.
- `editId` (string): Open edit ID from play_edit.insert. If omitted, the change is applied in a fresh edit and committed automatically (when PLAY_AUTO_COMMIT_EDITS is on).
- `media` (object): File source: provide either `filePath` or `base64`.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): ApksAddExternallyHostedRequest (externallyHostedApk descriptor).

### `play_artifact_files` (~390 tokens)

Expansion & deobfuscation files

Manage per-APK auxiliary files: APK expansion files (OBB main/patch) and deobfuscation/symbol files (ProGuard or native code).

Set `action` to one of:
• get_expansion: Get an APK's expansion file (main or patch) metadata. — requires: packageName, apkVersionCode, expansionFileType
• patch_expansion [write]: Partially update an expansion file's reference (e.g. reuse another APK's file). — requires: packageName, apkVersionCode, expansionFileType, requestBody
• update_expansion [write]: Replace an expansion file's reference. — requires: packageName, apkVersionCode, expansionFileType, requestBody
• upload_expansion [write]: Upload an APK expansion file (OBB) for a version code. — requires: packageName, apkVersionCode, expansionFileType, media
• upload_deobfuscation [write]: Upload a deobfuscation/symbol file (ProGuard mapping or native debug symbols). — requires: packageName, apkVersionCode, symbolType, media

Input parameters:

- `action` (string, required): The operation to perform.
- `apkVersionCode` (integer): Version code of the APK the expansion file belongs to.
- `editId` (string): Open edit ID from play_edit.insert. If omitted, the change is applied in a fresh edit and committed automatically (when PLAY_AUTO_COMMIT_EDITS is on).
- `expansionFileType` (string): Which expansion file to address.
- `media` (object): File source: provide either `filePath` or `base64`.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): ExpansionFile object (e.g. referencesVersion or fileSize).
- `symbolType` (string): Kind of symbol file being uploaded.

### `play_listings` (~344 tokens)

Play Store listings & details

Read and write localized store listings (title, descriptions, video) and app-level details such as the default language and contact info.

Set `action` to one of:
• list: List all localized store listings for the app. — requires: packageName
• get: Get the store listing for a single language. — requires: packageName, language
• patch [write]: Partially update a localized store listing. — requires: packageName, language, requestBody
• update [write]: Create or fully replace a localized store listing. — requires: packageName, language, requestBody
• delete [write]: Delete the store listing for a single language. — requires: packageName, language
• delete_all [write]: Delete all localized store listings for the app. — requires: packageName
• get_details: Get app-level details (default language, contact info). — requires: packageName
• patch_details [write]: Partially update app-level details. — requires: packageName, requestBody
• update_details [write]: Fully replace app-level details. — requires: packageName, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `editId` (string): Open edit ID from play_edit.insert. If omitted, the change is applied in a fresh edit and committed automatically (when PLAY_AUTO_COMMIT_EDITS is on).
- `language` (string): BCP-47 language tag, e.g. en-US.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): Listing: title, shortDescription, fullDescription, video

### `play_images` (~314 tokens)

Play Store listing images

List, upload, and delete graphic assets (screenshots, icon, feature graphic, etc.) for a localized store listing.

Set `action` to one of:
• list: List images of a given type for a language. — requires: packageName, language, imageType
• upload [write]: Upload a new image of a given type for a language. — requires: packageName, language, imageType, media
• delete [write]: Delete a single image by id. — requires: packageName, language, imageType, imageId
• delete_all [write]: Delete all images of a given type for a language. — requires: packageName, language, imageType

Input parameters:

- `action` (string, required): The operation to perform.
- `editId` (string): Open edit ID from play_edit.insert. If omitted, the change is applied in a fresh edit and committed automatically (when PLAY_AUTO_COMMIT_EDITS is on).
- `imageId` (string): The id of the image to delete.
- `imageType` (string): e.g. phoneScreenshots, sevenInchScreenshots, tenInchScreenshots, tvScreenshots, wearScreenshots, icon, featureGraphic, tvBanner
- `language` (string): BCP-47 language tag, e.g. en-US.
- `media` (object): File source: provide either `filePath` or `base64`.
- `packageName` (string): App package name, e.g. com.example.app

### `play_inappproducts` (~393 tokens)

In-app products

Manage legacy in-app products (managed products and subscriptions keyed by SKU).

Set `action` to one of:
• list: List in-app products for an app, paginated. — requires: packageName
• get: Get a single in-app product by SKU. — requires: packageName, sku
• insert [write]: Create a new in-app product. — requires: packageName, requestBody
• patch [write]: Patch (partial update) an in-app product. — requires: packageName, sku, requestBody
• update [write]: Update (replace) an in-app product. — requires: packageName, sku, requestBody
• delete [write]: Delete an in-app product by SKU. — requires: packageName, sku
• batch_get: Get multiple in-app products by SKU in one request. — requires: packageName
• batch_update [write]: Create or update multiple in-app products in one request. — requires: packageName, requestBody
• batch_delete [write]: Delete multiple in-app products in one request. — requires: packageName, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `allowMissing` (boolean): If true, create the product when it does not already exist (upsert).
- `autoConvertMissingPrices` (boolean): Auto-convert prices to all other regions' currencies when missing.
- `maxResults` (integer): Maximum number of results to return.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): InAppProduct resource (sku, status, defaultPrice, prices, listings, etc.).
- `sku` (string): The product SKU / unique identifier.
- `startIndex` (integer): Index of the first result to return.
- `token` (string): Pagination token from a previous response.

### `play_subscriptions` (~367 tokens)

Subscriptions

Manage subscription products and their listings via the monetization API.

Set `action` to one of:
• list: List subscriptions for an app, paginated. — requires: packageName
• get: Get a single subscription by product id. — requires: packageName, productId
• create [write]: Create a new subscription. — requires: packageName, productId, requestBody
• update [write]: Patch a subscription (also used to create/edit base plans via updateMask 'basePlans'). — requires: packageName, productId, updateMask, requestBody
• delete [write]: Delete a subscription (only allowed if it has never had any base plan). — requires: packageName, productId
• batch_get: Get multiple subscriptions by product id in one request. — requires: packageName
• batch_update [write]: Create or update multiple subscriptions in one request. — requires: packageName, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `allowMissing` (boolean): If true, create the subscription when it does not already exist (upsert).
- `packageName` (string): App package name, e.g. com.example.app
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.
- `productId` (string): Product / SKU identifier.
- `productIds` (array): Product ids to fetch.
- `requestBody` (object): Subscription resource (productId, basePlans, listings, etc.).
- `showArchived` (boolean): Deprecated: include archived subscriptions.
- `updateMask` (string): Comma-separated field mask; include 'basePlans' to create/edit base plans.

### `play_subscription_baseplans` (~326 tokens)

Subscription base plans

Manage the lifecycle and pricing of subscription base plans. To create or edit a base plan, use play_subscriptions.update with updateMask including 'basePlans' (there is no separate create/patch here).

Set `action` to one of:
• delete [write]: Delete a base plan (only allowed if it has never been activated). — requires: packageName, productId, basePlanId
• activate [write]: Activate a base plan, making it available to new subscribers. — requires: packageName, productId, basePlanId
• deactivate [write]: Deactivate a base plan, making it unavailable to new subscribers. — requires: packageName, productId, basePlanId
• migrate_prices [write]: Migrate subscribers on a base plan to newer prices in the specified regions. — requires: packageName, productId, basePlanId, requestBody
• batch_migrate_prices [write]: Migrate prices for multiple base plans of a subscription in one request. — requires: packageName, productId, requestBody
• batch_update_states [write]: Activate or deactivate multiple base plans of a subscription in one request. — requires: packageName, productId, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `basePlanId` (string): The base plan id.
- `packageName` (string): App package name, e.g. com.example.app
- `productId` (string): Product / SKU identifier.
- `requestBody` (object): ActivateBasePlanRequest (optional; usually empty).

### `play_subscription_offers` (~498 tokens)

Subscription offers

Manage offers (intro/free-trial/developer-determined) attached to subscription base plans.

Set `action` to one of:
• list: List offers for a base plan, paginated. — requires: packageName, productId, basePlanId
• get: Get a single subscription offer. — requires: packageName, productId, basePlanId, offerId
• create [write]: Create a new subscription offer. — requires: packageName, productId, basePlanId, offerId, requestBody
• update [write]: Patch (partial update) a subscription offer. — requires: packageName, productId, basePlanId, offerId, updateMask, requestBody
• delete [write]: Delete a subscription offer (only allowed if it has never been activated). — requires: packageName, productId, basePlanId, offerId
• activate [write]: Activate a subscription offer. — requires: packageName, productId, basePlanId, offerId
• deactivate [write]: Deactivate a subscription offer. — requires: packageName, productId, basePlanId, offerId
• batch_get: Get multiple subscription offers under a base plan in one request. — requires: packageName, productId, basePlanId, requestBody
• batch_update [write]: Create or update multiple subscription offers in one request. — requires: packageName, productId, basePlanId, requestBody
• batch_update_states [write]: Activate or deactivate multiple subscription offers in one request. — requires: packageName, productId, basePlanId, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `allowMissing` (boolean): If true, create the offer when it does not already exist (upsert).
- `basePlanId` (string): The base plan id.
- `offerId` (string): The offer id.
- `packageName` (string): App package name, e.g. com.example.app
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.
- `productId` (string): Product / SKU identifier.
- `requestBody` (object): SubscriptionOffer resource (phases, eligibility, regionalConfigs, etc.).
- `updateMask` (string): Comma-separated field mask of fields to update.

### `play_onetimeproducts` (~458 tokens)

One-time products

Manage one-time products and their purchase options. Create/edit one-time products via the patch-based create/update actions (updateMask + allowMissing).

Set `action` to one of:
• list: List one-time products for an app, paginated. — requires: packageName
• get: Get a single one-time product by product id. — requires: packageName, productId
• create [write]: Create a one-time product (patch with allowMissing). — requires: packageName, productId, requestBody
• update [write]: Patch (partial update) a one-time product. — requires: packageName, productId, updateMask, requestBody
• delete [write]: Delete a one-time product. — requires: packageName, productId
• batch_get: Get multiple one-time products by product id in one request. — requires: packageName
• batch_update [write]: Create or update multiple one-time products in one request. — requires: packageName, requestBody
• batch_delete [write]: Delete multiple one-time products in one request. — requires: packageName, requestBody
• batch_update_purchase_option_states [write]: Activate or deactivate multiple purchase options of a one-time product in one request. — requires: packageName, productId, requestBody
• batch_delete_purchase_options [write]: Delete multiple purchase options of a one-time product in one request. — requires: packageName, productId, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `allowMissing` (boolean): If true, create the product when it does not already exist (upsert).
- `packageName` (string): App package name, e.g. com.example.app
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.
- `productId` (string): Product / SKU identifier.
- `productIds` (array): Product ids to fetch.
- `requestBody` (object): OneTimeProduct resource (productId, listings, purchaseOptions, etc.).
- `updateMask` (string): Comma-separated field mask of fields to set on create.

### `play_onetimeproduct_offers` (~420 tokens)

One-time product offers

Manage offers attached to one-time product purchase options: list, lifecycle (activate/deactivate/cancel), and batch operations.

Set `action` to one of:
• list: List offers for a purchase option, paginated. — requires: packageName, productId, purchaseOptionId
• activate [write]: Activate a one-time product offer. — requires: packageName, productId, purchaseOptionId, offerId
• deactivate [write]: Deactivate a one-time product offer. — requires: packageName, productId, purchaseOptionId, offerId
• cancel [write]: Cancel a one-time product offer (e.g. pre-order lifecycle). — requires: packageName, productId, purchaseOptionId, offerId
• batch_get: Get multiple one-time product offers in one request. — requires: packageName, productId, purchaseOptionId, requestBody
• batch_update [write]: Create or update multiple one-time product offers in one request. — requires: packageName, productId, purchaseOptionId, requestBody
• batch_update_states [write]: Activate, deactivate, or cancel multiple one-time product offers in one request. — requires: packageName, productId, purchaseOptionId, requestBody
• batch_delete [write]: Delete multiple one-time product offers in one request. — requires: packageName, productId, purchaseOptionId, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `offerId` (string): The offer id.
- `packageName` (string): App package name, e.g. com.example.app
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.
- `productId` (string): Product / SKU identifier.
- `purchaseOptionId` (string): The purchase option id (may be '-' for all).
- `requestBody` (object): ActivateOneTimeProductOfferRequest (optional; usually empty).

### `play_pricing` (~110 tokens)

Region price conversion

Convert a price into the equivalent price in every other supported region's currency.

Set `action` to one of:
• convert_region_prices: Convert a price to all other regions' currencies. — requires: packageName, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): ConvertRegionPricesRequest: { price: { currencyCode, units, nanos } }.

### `play_purchases_products` (~194 tokens)

One-time product purchases

Verify, acknowledge, and consume one-time (in-app) product purchases by purchase token.

Set `action` to one of:
• get: Get the state of a one-time product purchase by purchase token. — requires: packageName, productId, token
• acknowledge [write]: Acknowledge a one-time product purchase. — requires: packageName, productId, token
• consume [write]: Consume a one-time product purchase so it can be re-purchased. — requires: packageName, productId, token

Input parameters:

- `action` (string, required): The operation to perform.
- `packageName` (string): App package name, e.g. com.example.app
- `productId` (string): Product / SKU identifier.
- `requestBody` (object): ProductPurchasesAcknowledgeRequest object.
- `token` (string): The token provided to the user's device when the product was purchased.

### `play_purchases_subscriptions` (~210 tokens)

Subscription purchases

Verify and manage subscription purchases (Purchases.subscriptionsv2), with optional legacy v1 actions when enabled.

Set `action` to one of:
• get: Get the state of a subscription purchase (v2) by purchase token. — requires: packageName, token
• cancel [write]: Cancel a subscription purchase (v2). — requires: packageName, token
• revoke [write]: Revoke a subscription purchase (v2), optionally issuing a refund. — requires: packageName, token
• defer [write]: Defer a subscription purchase (v2) to a later expiry/renewal time. — requires: packageName, token, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): CancelSubscriptionPurchaseRequest object.
- `token` (string): The token provided to the user's device when the subscription was purchased.

### `play_voided_purchases` (~229 tokens)

Voided purchases

List purchases that were cancelled, refunded, or charged back so entitlements can be revoked.

Set `action` to one of:
• list: List voided purchases within an optional time window. — requires: packageName

Input parameters:

- `action` (string, required): The operation to perform.
- `endTime` (string): Upper bound (exclusive) on void time, in epoch milliseconds.
- `includeQuantityBasedPartialRefund` (boolean): Whether to include voided purchases of quantity-based partial refunds.
- `maxResults` (integer): Maximum number of results to return.
- `packageName` (string): App package name, e.g. com.example.app
- `startIndex` (integer): Index of the first result to return.
- `startTime` (string): Lower bound (inclusive) on void time, in epoch milliseconds.
- `token` (string): Pagination token from a previous response.
- `type` (integer): Type of voided purchases to return: 0 = voided in-app product purchases only (default); 1 = both voided in-app product and subscription purchases.

### `play_orders` (~184 tokens)

Orders

Look up orders and issue refunds for Google Play transactions.

Set `action` to one of:
• get: Get a single order by order id. — requires: packageName, orderId
• batch_get: Get multiple orders in a single request by order ids. — requires: packageName
• refund [write]: Refund an order, optionally revoking the user's entitlement. — requires: packageName, orderId

Input parameters:

- `action` (string, required): The operation to perform.
- `orderId` (string): The order ID provided to the user when the purchase was made.
- `orderIds` (array): The list of order IDs to retrieve (up to 1000).
- `packageName` (string): App package name, e.g. com.example.app
- `revoke` (boolean): Whether to revoke the purchased item from the user in addition to refunding.

### `play_reviews` (~217 tokens)

Play Store reviews

List, read, and reply to user reviews of an app on Google Play.

Set `action` to one of:
• list: List reviews (most recent first), paginated. — requires: packageName
• get: Get a single review (with its comment thread) by id. — requires: packageName, reviewId
• reply [write]: Reply to a review, or update an existing developer reply. — requires: packageName, reviewId, replyText

Input parameters:

- `action` (string, required): The operation to perform.
- `maxResults` (integer): Maximum number of results to return.
- `packageName` (string): App package name, e.g. com.example.app
- `replyText` (string): The developer reply text.
- `reviewId` (string): The review id.
- `startIndex` (integer): Index of the first result to return.
- `token` (string): Pagination token from a previous response.
- `translationLanguage` (string): Translate review text to this BCP-47 language.

### `play_reviews_export` (~301 tokens)

Play Store reviews export (historical)

Read the full historical reviews CSV export that Google writes monthly to your private Cloud Storage reports bucket (gs://pubsite_prod_rev_<n>/reviews/). Use this for older reviews and per-month history — play_reviews only returns the last ~7 days. Set PLAY_REPORTS_BUCKET to the value from Play Console → Download reports → Reviews → 'Copy Cloud Storage URI' (or pass `bucket`). These buckets are Google-owned and usually can't be granted to a service account, so storage auth uses the Play account owner's credentials: `gcloud auth application-default login` locally, or PLAY_STORAGE_CREDENTIALS pointing at a credentials JSON (e.g. in Docker).

Set `action` to one of:
• list: List available monthly reviews CSV files (optionally filtered by package).
• get: Download and parse one month's reviews CSV for an app (newest months are the highest YYYYMM from list). — requires: packageName, yearMonth

Input parameters:

- `action` (string, required): The operation to perform.
- `bucket` (string): Override the reports bucket (bare name or gs:// URI).
- `limit` (integer): Cap the number of parsed review rows returned.
- `packageName` (string): Filter to one app's CSV files. Omit to list all.
- `raw` (boolean): Return the raw CSV text instead of parsed rows.
- `yearMonth` (string): Report month as YYYYMM, e.g. 202604.

### `play_users` (~325 tokens)

Play Console users & grants

Manage the users who can access your Play developer account and the per-app permission grants assigned to them.

Set `action` to one of:
• list: List users with access to the developer account, paginated.
• create [write]: Grant a user access to the developer account. — requires: requestBody
• patch [write]: Update an existing user's access / permissions. — requires: email, requestBody
• delete [write]: Remove a user's access to the developer account. — requires: email
• create_grant [write]: Grant a user app-level permissions for a specific app. — requires: email, requestBody
• patch_grant [write]: Update a user's app-level permissions for a specific app. — requires: email, packageName, requestBody
• delete_grant [write]: Revoke a user's app-level access to a specific app. — requires: email, packageName

Input parameters:

- `action` (string, required): The operation to perform.
- `email` (string): Email address of the user to update.
- `packageName` (string): App package name, e.g. com.example.app
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.
- `requestBody` (object): User object: email plus account-level access grants/permissions, e.g. { email, developerAccountPermissions: [...] }.
- `updateMask` (string): Comma-separated list of fields to update, e.g. developerAccountPermissions.

### `play_device_tier_configs` (~217 tokens)

Device tier configs

List, read, and create device tier configurations for an app on Google Play.

Set `action` to one of:
• list: List device tier configs (most recent first), paginated. — requires: packageName
• get: Get a single device tier config by id. — requires: packageName, deviceTierConfigId
• create [write]: Create a new device tier config. — requires: packageName, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `allowUnknownDevices` (boolean): Whether the device tier config matches devices that are unknown to Google Play.
- `deviceTierConfigId` (string): The device tier config id.
- `packageName` (string): App package name, e.g. com.example.app
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.
- `requestBody` (object): DeviceTierConfig object describing device groups and tiers.

### `play_generated_apks` (~302 tokens)

Generated & system APKs

Inspect and download the APKs Play generates from an app bundle, and manage system-image APK variants.

Set `action` to one of:
• list_generated: List the APKs Play generated for an app bundle version. — requires: packageName, versionCode
• download_generated: Download a generated APK/asset slice to a local file. — requires: packageName, versionCode, downloadId, destPath
• list_system_variants: List system-image APK variants for a bundle version. — requires: packageName, versionCode
• get_system_variant: Get a single system APK variant by id. — requires: packageName, versionCode, variantId
• create_system_variant [write]: Create a new system APK variant for a device spec. — requires: packageName, versionCode, requestBody
• download_system_variant: Download a system APK variant to a local file. — requires: packageName, versionCode, variantId, destPath

Input parameters:

- `action` (string, required): The operation to perform.
- `destPath` (string): local file path to write to
- `downloadId` (string): Download id from list_generated.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): Variant: deviceSpec
- `variantId` (string): System APK variant id.
- `versionCode` (integer): Bundle version code whose generated APKs to list.

### `play_internal_app_sharing` (~136 tokens)

Internal app sharing

Upload APKs and app bundles to Internal App Sharing and get a shareable download URL.

Set `action` to one of:
• upload_apk [write]: Upload an APK to Internal App Sharing. — requires: packageName, media
• upload_bundle [write]: Upload an app bundle (.aab) to Internal App Sharing. — requires: packageName, media

Input parameters:

- `action` (string, required): The operation to perform.
- `media` (object): File source: provide either `filePath` or `base64`.
- `packageName` (string): App package name, e.g. com.example.app

### `play_app_recovery` (~235 tokens)

App recovery

Create, deploy, target, and cancel app recovery actions used to remotely roll out fixes for problematic releases.

Set `action` to one of:
• list: List recovery actions, optionally filtered to one version code. — requires: packageName
• create [write]: Create a draft app recovery action. — requires: packageName, requestBody
• deploy [write]: Deploy a draft recovery action so it begins rolling out. — requires: packageName, appRecoveryId
• cancel [write]: Cancel an in-progress recovery action. — requires: packageName, appRecoveryId
• add_targeting [write]: Add targeting (e.g. more version codes) to a recovery action. — requires: packageName, appRecoveryId, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `appRecoveryId` (string): Recovery action id to deploy.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): CreateDraftAppRecoveryRequest
- `versionCode` (integer): Only list recovery actions for this version code.

### `play_external_transactions` (~158 tokens)

External transactions

Report, read, and refund external (alternative-billing) transactions for an app.

Set `action` to one of:
• create [write]: Report a new external transaction. — requires: packageName, externalTransactionId, requestBody
• get: Get a previously reported external transaction. — requires: packageName, externalTransactionId
• refund [write]: Refund (fully or partially) an external transaction. — requires: packageName, externalTransactionId

Input parameters:

- `action` (string, required): The operation to perform.
- `externalTransactionId` (string): Caller-chosen unique external transaction id.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): ExternalTransaction

### `play_data_safety` (~101 tokens)

Data safety

Set the app's Data safety form (safety labels) on the Play Console.

Set `action` to one of:
• set [write]: Update the app's Data safety labels. — requires: packageName, requestBody

Input parameters:

- `action` (string, required): The operation to perform.
- `packageName` (string): App package name, e.g. com.example.app
- `requestBody` (object): SafetyLabelsUpdateRequest: safetyLabels

### `play_vitals_crash_anr` (~231 tokens)

Crash & ANR rate vitals

Query and inspect the crash-rate and ANR-rate metric sets for an app.

Set `action` to one of:
• query_crash_rate: Query the crash-rate metric set (time series of metrics over dimensions). — requires: appId, requestBody
• get_crash_rate_set: Get the crash-rate metric set metadata (freshness, supported dimensions/metrics). — requires: appId
• query_anr_rate: Query the ANR-rate metric set (time series of metrics over dimensions). — requires: appId, requestBody
• get_anr_rate_set: Get the ANR-rate metric set metadata (freshness, supported dimensions/metrics). — requires: appId

Input parameters:

- `action` (string, required): The operation to perform.
- `appId` (string): Reporting app id, e.g. the package name. Find it with play_reporting_apps.search.
- `requestBody` (object): Query<Metric>MetricSetRequest: { timelineSpec:{aggregationPeriod, startTime/interval}, dimensions[], metrics[], pageSize, pageToken, filter }

### `play_vitals_errors` (~260 tokens)

Error reports & issues vitals

Query the error-count metric set and search for error issues and individual error reports.

Set `action` to one of:
• query_error_counts: Query the error-count metric set (time series of error counts over dimensions). — requires: appId, requestBody
• get_error_count_set: Get the error-count metric set metadata (freshness, supported dimensions/metrics). — requires: appId
• search_issues: Search for clustered error issues affecting the app. — requires: appId
• search_reports: Search for individual error reports (stack traces) for the app. — requires: appId

Input parameters:

- `action` (string, required): The operation to perform.
- `appId` (string): Reporting app id, e.g. the package name. Find it with play_reporting_apps.search.
- `filter` (string): AIP-160 filter expression to narrow results.
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.
- `requestBody` (object): Query<Metric>MetricSetRequest: { timelineSpec:{aggregationPeriod, startTime/interval}, dimensions[], metrics[], pageSize, pageToken, filter }

### `play_vitals_performance` (~274 tokens)

Performance vitals

Query and inspect performance metric sets: slow cold start, slow rendering (frame-rate), and low-memory-kill (LMK) rate.

Set `action` to one of:
• query_slow_start: Query the slow-start-rate metric set. — requires: appId, requestBody
• get_slow_start_set: Get the slow-start-rate metric set metadata. — requires: appId
• query_slow_rendering: Query the slow-rendering-rate metric set. — requires: appId, requestBody
• get_slow_rendering_set: Get the slow-rendering-rate metric set metadata. — requires: appId
• query_lmk_rate: Query the low-memory-kill (LMK) rate metric set. — requires: appId, requestBody
• get_lmk_rate_set: Get the low-memory-kill (LMK) rate metric set metadata. — requires: appId

Input parameters:

- `action` (string, required): The operation to perform.
- `appId` (string): Reporting app id, e.g. the package name. Find it with play_reporting_apps.search.
- `requestBody` (object): Query<Metric>MetricSetRequest: { timelineSpec:{aggregationPeriod, startTime/interval}, dimensions[], metrics[], pageSize, pageToken, filter }

### `play_vitals_battery` (~221 tokens)

Battery vitals

Query and inspect battery-related metric sets: excessive wakeups and stuck background wakelocks.

Set `action` to one of:
• query_excessive_wakeups: Query the excessive-wakeup-rate metric set. — requires: appId, requestBody
• get_excessive_wakeups_set: Get the excessive-wakeup-rate metric set metadata. — requires: appId
• query_stuck_wakelocks: Query the stuck-background-wakelock-rate metric set. — requires: appId, requestBody
• get_stuck_wakelocks_set: Get the stuck-background-wakelock-rate metric set metadata. — requires: appId

Input parameters:

- `action` (string, required): The operation to perform.
- `appId` (string): Reporting app id, e.g. the package name. Find it with play_reporting_apps.search.
- `requestBody` (object): Query<Metric>MetricSetRequest: { timelineSpec:{aggregationPeriod, startTime/interval}, dimensions[], metrics[], pageSize, pageToken, filter }

### `play_vitals_anomalies` (~142 tokens)

Vitals anomalies

List detected anomalies (significant metric changes) across an app's vitals.

Set `action` to one of:
• list: List anomalies detected for the app, paginated. — requires: appId

Input parameters:

- `action` (string, required): The operation to perform.
- `appId` (string): Reporting app id, e.g. the package name. Find it with play_reporting_apps.search.
- `filter` (string): AIP-160 filter expression to narrow results.
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.

### `play_reporting_apps` (~147 tokens)

Reporting apps

Discover apps accessible via Play Developer Reporting and fetch their available release-quality filter options.

Set `action` to one of:
• search: Search for apps the caller can access in Play Developer Reporting.
• fetch_release_filter_options: Fetch the release (track/version) filter options available for an app's reports. — requires: appId

Input parameters:

- `action` (string, required): The operation to perform.
- `appId` (string): Reporting app id, e.g. the package name. Find it with play_reporting_apps.search.
- `pageSize` (integer): Maximum number of items to return per page.
- `pageToken` (string): Pagination token from a previous response's nextPageToken.

### `play_stats_export` (~420 tokens)

Play Console statistics export (historical)

Read the historical statistics & acquisition CSV exports Google writes monthly to your private Cloud Storage reports bucket: installs (by country/language/app_version/device/…), store performance (store acquisitions by country/traffic_source), ratings, crashes, and acquisition (retained_installers, buyers_7d). Per-day rows within each monthly file. Set PLAY_REPORTS_BUCKET to the value from Play Console → Download reports → 'Copy Cloud Storage URI' (or pass `bucket`). These buckets are Google-owned and usually can't be granted to a service account, so storage auth uses the Play account owner's credentials: `gcloud auth application-default login` locally, or PLAY_STORAGE_CREDENTIALS pointing at a credentials JSON. Note: at low volume Google may suppress small per-country counts (bucketed as 'Other').

Set `action` to one of:
• list: List available monthly CSV files for a report (months × dimensions), newest first. — requires: report
• get: Download and parse one report file (report + packageName + yearMonth + dimension). — requires: report, packageName, yearMonth, dimension

Input parameters:

- `action` (string, required): The operation to perform.
- `bucket` (string): Override the reports bucket (bare name or gs:// URI).
- `dimension` (string): Dimension (the trailing filename segment). Common: installs/ratings/crashes → overview, country, language, app_version, device, os_version, carrier; store_performance → country, traffic_source; acqui…
- `limit` (integer): Cap the number of parsed rows returned.
- `packageName` (string): Filter to one app's files. Omit to list all.
- `raw` (boolean): Return the raw CSV text instead of parsed rows.
- `report` (string): Report family to list.
- `yearMonth` (string): Report month as YYYYMM, e.g. 202605.

### `play_publish_release` (~255 tokens)

Publish a release

Upload an Android App Bundle and roll it out on a track in a single operation.

Set `action` to one of:
• run [write]: Upload an AAB and create/patch a release on the given track. — requires: packageName, track, media

Input parameters:

- `action` (string, required): The operation to perform.
- `editId` (string): Open edit ID from play_edit.insert. If omitted, the change is applied in a fresh edit and committed automatically (when PLAY_AUTO_COMMIT_EDITS is on).
- `media` (object): the AAB to upload
- `packageName` (string): App package name, e.g. com.example.app
- `releaseNotes` (array): Per-language release notes.
- `rolloutFraction` (number): user fraction for staged rollout (use with status inProgress/halted)
- `status` (string): Release status. Use inProgress/halted with rolloutFraction for staged rollout.
- `track` (string): Release track, e.g. production, beta, alpha, internal, or a form-factor track like wear:production.
- `validateOnly` (boolean): validate the edit instead of committing
- `versionName` (string): Human-readable release name.

### `play_promote_release` (~200 tokens)

Promote a release

Copy the active release from one track to another (e.g. promote beta to production).

Set `action` to one of:
• run [write]: Copy the active release's version codes from one track onto another. — requires: packageName, fromTrack, toTrack

Input parameters:

- `action` (string, required): The operation to perform.
- `editId` (string): Open edit ID from play_edit.insert. If omitted, the change is applied in a fresh edit and committed automatically (when PLAY_AUTO_COMMIT_EDITS is on).
- `fromTrack` (string): Source track to copy the active release from.
- `packageName` (string): App package name, e.g. com.example.app
- `rolloutFraction` (number): user fraction for staged rollout (use with status inProgress/halted)
- `status` (string): Release status on the destination track.
- `toTrack` (string): Destination track to promote the release onto.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/wiseappsai-play-console-mcp/wiseappsai-play-console-mcp#diagnostics

## Score history

- 2026-08-04: 70
- 2026-08-03: 70
- 2026-08-02: 66
- 2026-08-01: 0
- 2026-07-31: 12
- 2026-07-30: 0
- 2026-07-28: 36
- 2026-07-27: 36

## Links

- npm package: https://www.npmjs.com/package/@wiseappsai/play-console-mcp
- Socket report: https://socket.dev/npm/package/@wiseappsai/play-console-mcp
- Changelog RSS feed: https://verifymcp.io/servers/wiseappsai-play-console-mcp/wiseappsai-play-console-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/wiseappsai-play-console-mcp/wiseappsai-play-console-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/wiseappsai-play-console-mcp/wiseappsai-play-console-mcp
