accounts_list
List every Play Console account registered with the MCP server (names + key-file paths, no secrets).
無需輸入參數。

io.github.devinwang由 GitHub 帳號 devinwang 發布v0.2.0更新於 Oct 29, 2026
MCP server for Google Play: full Android Publisher API v3 and Play Developer Reporting API.
本機 MCP 伺服器,透過 Android Publisher API v3 與 Play Developer Reporting API 連接 Google Play 管理中心,讓助理管理發布、商店資訊、付費商品與當機報告。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
參照 儲存庫 中的啟動說明。
The complete Model Context Protocol (MCP) server for Google Play. 157 tools. Full Android Publisher API v3 + Play Developer Reporting API v1beta1. No deprecated endpoints. Works with Claude, Cursor, VS Code Copilot, Gemini CLI, or any MCP client.
[npm version] [npm downloads] [CI] [License: MIT] [Node] [Tools: 157] [API: v3] [Reporting: v1beta1] [MCP] [TypeScript]
See also: app-store-connect-mcp — the same philosophy for Apple's App Store Connect.
Google Play Console has an API, but its surface is wide and moves fast. Existing community MCPs each cover a slice — one does store listings, another does releases, a third does reviews — and all lag behind Google's deprecations.
google-play-developer-mcp is the one that covers everything.
If you drive Google Play Console with an AI assistant — release automation, review triage, subscription catalog management, crash triage — this gives the assistant a full toolbox in one install.
157 tools across 33 groups. Every non-deprecated endpoint in both APIs.
Then in your MCP client config (e.g. ~/.config/claude/config.json, Cursor MCP config, or VS Code mcp.json):
Next, tell the server which Play Console account to use — see the setup guide below.
~/.config/google-play-developer-mcp/service-account.json.[email protected]).PERMISSION_DENIED, this is usually why.Launch any MCP client that has the server configured, then run:
(Or manually create ~/.google-play-developer-mcp/accounts.json — see the file format below.)
Should return { ok: true, email: "..." }.
Lists the apps the service account can see.
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%/Claude/claude_desktop_config.json
Or edit ~/.claude.json:
Settings → MCP → Add new MCP server:
.vscode/mcp.json:
Any MCP-compliant client accepts the same command entry — point it at the globally installed google-play-developer-mcp binary (or at node /path/to/dist/index.js if running from source).
Then in your MCP client config:
All tools use snake_case names following the resource_action convention, consistent with the Android Publisher URL structure. See the Feature matrix for the full group breakdown.
Each tool accepts a JSON object of arguments — inspect the schema from your MCP client (Claude Code: /mcp tools, Claude Desktop: show tool list in chat, Cursor: MCP panel) to see the exact shape.
Complex body arguments (e.g. subscription, offer, appRecoveryAction, subscription releases) accept the Google-documented JSON schema directly — see the official reference.
This repo ships with zero credentials. You bring a service-account JSON key; the server records only the path.
What is and isn't on disk:
.gitignore blocks*.json.key, *service-account*.json, *service_account*.json, *-sa.json, *-sa-key.jsongcp-key*.json, google-credentials*.json, play-credentials*.json.env, .env.* (but keeps .env.example)accounts.json, credentials/, keys/, secrets/*.pem, *.p12, *.pfx, *.key, id_rsa*accounts_update --keyFile <newPath>.auth_status never returns the actual token; only a boolean and the service-account email.Every write operation on the Android Publisher API is logged by Google Cloud IAM under the service account's identity. If you ever suspect misuse, IAM → Audit Logs in the Cloud Console will show which endpoints were called.
edits_insert / edits_commit / edits_delete directly so you can hold an edit open across many tool calls — the most common multi-step flow. If you forget to commit, nothing ships. Safe by default.accounts_switch. State lives in ~/.google-play-developer-mcp/accounts.json.monetization.onetimeproducts (not the deprecated inappproducts). Purchase verification uses purchasesV2 / subscriptionsV2.googleapis TypeScript typings, we cast through publisherAny() / reportingAny(). The HTTP calls are identical — only TypeScript's static check is skipped on the known-drifting surfaces.PRs welcome. Before you submit:
npm run typecheck passes (CI will also run this)X-Goog-Api-Client: ...REDACTED...).resource_action naming convention.orders_review_refund, purchases_products_acknowledge, purchases_products_consume, reports_anon_rss_swap_memory_{get,query}, reports_bitmap_memory_{get,query}.googleapis 171 → 187.monetization.onetimeproducts (replaces deprecated inappproducts), purchases.productsv2 / subscriptionsv2 (replaces v1).SubscriptionPurchaseV2.offerPhase, purchases.subscriptionsv2.cancel/defer, orders.batchGet, offerPhaseDetails, price step-up consent, outOfAppPurchaseContext..gitignore.monetization.onetimeproducts referencepurchases.subscriptionsv2 referenceMIT — see LICENSE.
來源:README.md,提交 ffe25df
List every Play Console account registered with the MCP server (names + key-file paths, no secrets).
無需輸入參數。
Show which account is currently active. All subsequent API calls target this account.
無需輸入參數。
Register a new Play Console account. Provide a local filesystem path to a Google Cloud service-account JSON key. The key stays on disk — the MCP only records its path.
name必填keyFile必填descriptionRemove an account from the local registry. Does NOT delete the key file.
name必填Make an existing registered account the active one.
name必填Change the key-file path or description of an existing account.
name必填keyFiledescriptionVerify that the active account can acquire a Google OAuth token. Returns the service-account email plus whether a token was obtained.
無需輸入參數。
List every Android app the active service account can access. Uses the Play Developer Reporting API's apps.search.
pageSizepageTokenOpen a fresh edit and return the details resource (contact email/phone/website + default language) for one app.
packageName必填Open a new edit session for an app. Returns the edit id plus its expiry. Subsequent edits.* tool calls must pass this id.
packageName必填Fetch an existing edit — useful to check expiry before work.
editId必填packageName必填Validate an edit without committing. Catches schema/media errors before you publish.
editId必填packageName必填Commit and publish all changes in the edit. Pass changesNotSentForReview=true to skip automatic review submission.
editId必填packageName必填changesNotSentForReviewAbandon an edit. All pending changes are discarded.
editId必填packageName必填Get app-level details (contact email/phone/website + default language).
editId必填packageName必填Overwrite app-level details. Full replacement — unspecified fields are cleared.
editId必填packageName必填contactEmailcontactPhonecontactWebsitedefaultLanguagePartial update — only the provided fields change.
editId必填packageName必填contactEmailcontactPhonecontactWebsitedefaultLanguageFetch per-country availability for a given track within an edit.
track必填editId必填packageName必填List every locale listing within an edit.
editId必填packageName必填Get one locale's listing.
editId必填language必填packageName必填Full replacement update of a locale listing. Fields: title (30), shortDescription (80), fullDescription (4000), video (YouTube URL).
titlevideoeditId必填language必填packageName必填fullDescriptionshortDescriptionPartial update — unspecified fields preserved.
titlevideoeditId必填language必填packageName必填fullDescriptionshortDescriptionDelete the listing for one locale.
editId必填language必填packageName必填Delete ALL locale listings in this edit. Irreversible within the edit.
editId必填packageName必填List uploaded images for a specific type and locale.
editId必填language必填imageType必填packageName必填Upload a new image. `file` is a local filesystem path. MIME is auto-detected from extension (png/jpg).
file必填editId必填language必填imageType必填packageName必填Delete a single image by id.
editId必填imageId必填language必填imageType必填packageName必填Delete every image of a given type in one locale.
editId必填language必填imageType必填packageName必填List all AAB uploads in the current edit.
editId必填packageName必填Upload a new App Bundle (.aab). Returns versionCode and sha256. Commit the edit separately to publish to a track.
file必填editId必填packageName必填deviceTierConfigIdackBundleInstallationWarningList all APK uploads in the edit.
editId必填packageName必填Upload a new APK. Prefer AAB via `bundles_upload`.
file必填editId必填packageName必填Register an APK that is hosted outside Google Play (enterprise-only, requires allowlist).
editId必填packageName必填externallyHostedApk必填Upload a ProGuard mapping file for a specific version code. Use deobfuscationFileType='proguard' or 'nativeCode'.
file必填editId必填packageName必填apkVersionCode必填deobfuscationFileType必填Get expansion file metadata for a version code.
editId必填packageName必填apkVersionCode必填expansionFileType必填Upload expansion file contents (OBB).
file必填editId必填packageName必填apkVersionCode必填expansionFileType必填Full update of expansion file metadata.
editId必填fileSizepackageName必填apkVersionCode必填expansionFileType必填referencesVersionPartial update of expansion file metadata.
editId必填fileSizepackageName必填apkVersionCode必填expansionFileType必填referencesVersionList every track visible in this edit (includes default internal/alpha/beta/production + any custom closed-testing tracks).
editId必填packageName必填Get one track — includes all releases currently staged.
track必填editId必填packageName必填Full replacement of track state. `releases` is an array of release objects — versionCodes, status (draft|inProgress|halted|completed), userFraction (0-1 for staged rollout), inAppUpdatePriority (0-5), countryTargeting, and releaseNotes.
track必填editId必填releases必填packageName必填Partial update of track state.
track必填editId必填releases必填packageName必填Create a brand-new custom closed-testing track. The new id is set on the server. Type can only be closedTesting.
typetrack必填editId必填packageName必填trackConfigurationsGet the current tester allowlist for a track.
track必填editId必填packageName必填Full replacement of the tester allowlist.
track必填editId必填packageName必填googleGroupsPartial update of the tester allowlist.
track必填editId必填packageName必填googleGroupsList all one-time products.
pageSizepageTokenpackageName必填Get a single one-time product.
productId必填packageName必填Create a one-time product. Pass the full OneTimeProduct body.
product必填productId必填packageName必填regionsVersionUpdate a one-time product (patch semantics, with updateMask).
product必填productId必填updateMaskpackageName必填regionsVersionlatencyToleranceDelete a one-time product.
productId必填packageName必填latencyToleranceFetch up to 100 one-time products in one call.
productIds必填packageName必填Update up to 100 one-time products in one call.
requests必填packageName必填Delete up to 100 one-time products in one call.
requests必填packageName必填Update or create up to 100 purchase options for a one-time product.
requests必填productId必填packageName必填Activate or deactivate up to 100 purchase options in one call.
requests必填productId必填packageName必填Delete up to 100 purchase options.
requests必填productId必填packageName必填List offers attached to a purchase option. `purchaseOptionId` is required — use '-' to list across all options.
pageSizepageTokenproductId必填packageName必填purchaseOptionId必填Get one offer on a purchase option.
offerId必填productId必填packageName必填purchaseOptionId必填Batch-get up to 100 offers.
requests必填productId必填packageName必填purchaseOptionId必填Batch-update up to 100 offers (creates or updates).
requests必填productId必填packageName必填purchaseOptionId必填Activate/deactivate/cancel up to 100 offers.
requests必填productId必填packageName必填purchaseOptionId必填Delete up to 100 offers.
requests必填productId必填packageName必填purchaseOptionId必填List all subscriptions.
pageSizepageTokenpackageName必填showArchivedGet a single subscription.
productId必填packageName必填Create a subscription.
productId必填packageName必填subscription必填regionsVersionPatch-update a subscription. Pass `updateMask` to limit the fields updated.
productId必填updateMaskpackageName必填allowMissingsubscription必填regionsVersionlatencyToleranceDelete a subscription. Only works on subscriptions with no active base plans/offers.
productId必填packageName必填latencyToleranceArchive a subscription. Archived subscriptions are hidden from new purchases but existing subscribers keep access.
productId必填packageName必填Get up to 100 subscriptions in one call.
productIds必填packageName必填Update up to 100 subscriptions in one call.
requests必填packageName必填Activate a base plan — starts making it available for purchase.
productId必填basePlanId必填packageName必填Deactivate a base plan — no new purchases; existing subscribers unaffected.
productId必填basePlanId必填packageName必填Delete a base plan (must be inactive).
productId必填basePlanId必填packageName必填Apply a price change to existing subscribers of a base plan in specific regions.
productId必填basePlanId必填packageName必填regionsVersionlatencyToleranceregionalPriceMigrations必填Migrate prices on up to 100 base plans in one call.
requests必填productId必填packageName必填Upsert up to 100 base plans.
requests必填productId必填packageName必填Activate/deactivate up to 100 base plans.
requests必填productId必填packageName必填List offers for a base plan. `basePlanId` supports '-' wildcard to list across all.
pageSizepageTokenproductId必填basePlanId必填packageName必填Get a single offer.
offerId必填productId必填basePlanId必填packageName必填Create an offer on a base plan (free trial, intro pricing, etc.).
offer必填offerId必填productId必填basePlanId必填packageName必填regionsVersionPatch-update an offer.
offer必填offerId必填productId必填basePlanId必填updateMaskpackageName必填allowMissingregionsVersionlatencyToleranceDelete an offer.
offerId必填productId必填basePlanId必填packageName必填Activate an offer — starts making it available for purchase.
offerId必填productId必填basePlanId必填packageName必填Deactivate an offer.
offerId必填productId必填basePlanId必填packageName必填Batch-get up to 100 offers.
requests必填productId必填basePlanId必填packageName必填Upsert up to 100 offers.
requests必填productId必填basePlanId必填packageName必填Activate/deactivate up to 100 offers.
requests必填productId必填basePlanId必填packageName必填Utility: convert a price in one region to comparable prices in every other region. Use before setting prices on a base plan.
price必填packageName必填Get current state of a one-time product purchase. Supports multiple purchase options + offers (replaces legacy purchases.products).
token必填packageName必填Acknowledge a one-time product purchase. Unacknowledged purchases are refunded by Play after 3 days.
token必填productId必填packageName必填developerPayloadConsume a consumable one-time product so the user can buy it again. Consuming also acknowledges the purchase.
token必填productId必填packageName必填Get full state of a subscription purchase (SubscriptionPurchaseV2). Includes OfferPhase (2026), outOfAppPurchaseContext, latestSuccessfulOrderId, priceChangeState, priceStepUpConsentDetails.
token必填packageName必填Revoke a subscription (refund + terminate access). 2025-05 added `itemBasedRefund` option for per-item refunds.
token必填packageName必填revocationContextCancel a subscription (2025-09+). `cancellationType`: USER_REQUESTED, DEVELOPER_REQUESTED, or SYSTEM_INITIATED.
token必填packageName必填cancellationTypecancelSurveyReasonDefer billing for a subscription (2026-01 supports subscriptions with add-ons too). Pass DeferralInfo with expectedExpiryTime + desiredExpiryTime.
token必填packageName必填deferralInfo必填Acknowledge a subscription purchase. 2025-11+ accepts optional `externalAccountId` for account-linking. (v1 endpoint retained for compatibility.)
token必填packageName必填subscriptionIddeveloperPayloadexternalAccountIdList voided purchases (refunded/charged-back). Supports filtering by time range + voided source.
typetokenendTimestartTimemaxResultsstartIndexpackageName必填includeQuantityBasedPartialRefundsList orders within a time window. Returns OrderId, productId, purchase state, quantity, offerPhaseDetails.
endTimeorderIdspageTokenstartTimemaxResultspackageName必填Get one order by order id.
orderId必填packageName必填Get up to 100 orders in one call.
orderIds必填packageName必填Refund an order. Pass `revoke=true` to also cancel the entitlement (subscription) or consumable.
revokeorderId必填packageName必填Respond to a pending refund review (collaborative chargeback, 2026-07). Call within 24 hours of a PendingRefundReviewNotification. Supply `refundPreference` and optional usage evidence so Play can dispute the chargeback.
orderId必填packageName必填refundPreference必填pendingRefundToken必填sampleContentProvided必填consumptionUsageEventsconsumptionPercentageMilliunitsGet an external transaction (Alternative Billing).
parent必填externalTransactionId必填Register a new external transaction (Alternative Billing).
parent必填transaction必填externalTransactionId必填Report a refund on an external transaction.
parent必填refund必填externalTransactionId必填List reviews from the last 7 days. Use token from the previous page for pagination. Optional filters: language, translationLanguage, device.
tokenmaxResultsstartIndexpackageName必填translationLanguageGet a single review by id.
reviewId必填packageName必填translationLanguagePost a public reply to a review. Replies can be edited by calling this again.
reviewId必填replyText必填packageName必填List all users on a developer account. `parent` is the developer account id in the form `developers/{developerId}` (find it in the Play Console URL).
parent必填pageSizepageTokenAdd a new team member to the developer account. Pass the user resource with email + roles + optional expirationTime.
user必填parent必填Patch-update a team member (roles, access level).
name必填user必填updateMaskRemove a user from the developer account.
name必填Grant a user access to one app. `parent` is developers/{dev}/users/{user}. Grant body contains packageName + appLevelPermissions.
grant必填parent必填Patch a grant (change appLevelPermissions).
name必填grant必填updateMaskRevoke a grant.
name必填List all device-tier configs for an app.
pageSizepageTokenpackageName必填Create a new device-tier config.
packageName必填deviceTierConfig必填allowUnknownDevicesGet a device-tier config by id.
packageName必填deviceTierConfigId必填List app recovery actions for a versionCode.
packageName必填versionCode必填Create an app recovery action.
packageName必填appRecoveryAction必填Deploy an app recovery action to users.
packageName必填appRecoveryId必填Cancel an in-flight app recovery action.
packageName必填appRecoveryId必填Add targeting (country/locale/version) to an in-progress recovery action.
packageName必填appRecoveryId必填targetingUpdate必填List generated (split + standalone) APKs for a given bundle versionCode.
packageName必填versionCode必填Download a specific generated APK. `downloadId` is the id from `generated_apks_list`. Returns the binary as a base64 string.
downloadId必填packageName必填versionCode必填List system APK variants created for a given versionCode.
packageName必填versionCode必填Create a new system APK variant for a versionCode.
variant必填packageName必填versionCode必填Get a system APK variant.
variantId必填packageName必填versionCode必填Download a built system APK variant. Returns base64.
variantId必填packageName必填versionCode必填Upload an APK for internal app sharing. Returns a link you can distribute internally.
file必填packageName必填Upload an AAB for internal app sharing.
file必填packageName必填List every app the service account can access.
pageSizepageTokenList the release-filter dimensions available for an app (version codes, track, staged rollout).
name必填List detected anomalies across metric sets for an app.
filterparent必填pageSizepageTokenGet crash-rate metric-set metadata (available dimensions, metrics, freshness).
name必填Query crash-rate timeline with dimensions, metrics, filter.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet ANR-rate metric-set metadata.
name必填Query ANR-rate timeline.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet anonymous RSS + swap memory usage metric-set metadata. Format: apps/{packageName}/anonRssAndSwapMemoryUsageMetricSet
name必填Query anonymous RSS + swap memory usage timeline.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet bitmap memory usage metric-set metadata. Format: apps/{packageName}/bitmapMemoryUsageMetricSet
name必填Query bitmap memory usage timeline.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet slow-start-rate metadata.
name必填Query slow-start-rate timeline.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet slow-rendering-rate metadata.
name必填Query slow-rendering-rate timeline.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet excessive-wake-up-rate metadata.
name必填Query excessive-wake-up-rate timeline.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet stuck-background-wake-lock-rate metadata.
name必填Query stuck-background-wake-lock-rate timeline.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet Low-Memory-Killer (LMK) rate metadata.
name必填Query LMK-rate timeline.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecGet error-counts metric-set metadata.
name必填Query aggregated error-count timelines.
name必填filtermetricspageSizepageTokendimensionsuserCohorttimelineSpecSearch grouped error issues (ErrorIssue).
filterparent必填intervalpageSizepageTokenSearch raw error reports (ErrorReport) within an issue or time window.
filterparent必填intervalpageSizepageToken已滿足適用檢查項的 90%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
npm install -g google-play-developer-mcp{ "mcpServers": { "google-play-developer": { "command": "google-play-developer-mcp" } }}accounts_add --name my-app \ --keyFile /Users/you/.config/google-play-developer-mcp/service-account.json \ --description "My company's Play Console"auth_statusapps_list{ "mcpServers": { "google-play-developer": { "command": "google-play-developer-mcp" } }}claude mcp add google-play-developer google-play-developer-mcp{ "mcpServers": { "google-play-developer": { "command": "google-play-developer-mcp" } }}{ "google-play-developer": { "command": "google-play-developer-mcp" }}{ "servers": { "google-play-developer": { "type": "stdio", "command": "google-play-developer-mcp" } }}git clone https://github.com/devinwang/google-play-developer-mcp.gitcd google-play-developer-mcpnpm installnpm run build{ "mcpServers": { "google-play-developer": { "command": "node", "args": ["/absolute/path/to/google-play-developer-mcp/dist/index.js"] } }}accounts_switch --name my-app
# Open an edit, upload bundle, route it to the internal track, commit.edits_insert --packageName com.example.app# → { id: "EDIT_ID", expiryTimeSeconds: "..." }
bundles_upload --packageName com.example.app --editId EDIT_ID \ --file /path/to/app-release.aab# → { versionCode: 47, sha256: "..." }
tracks_update --packageName com.example.app --editId EDIT_ID \ --track internal \ --releases '[{"versionCodes":["47"],"status":"completed","releaseNotes":[{"language":"en-US","text":"Fixes a crash on startup."}]}]'
edits_commit --packageName com.example.app --editId EDIT_IDedits_insert --packageName com.example.app# → EDIT_ID
# Promote the beta versionCodes to production with 10% staged rollout.tracks_update --packageName com.example.app --editId EDIT_ID \ --track production \ --releases '[{"versionCodes":["47"],"status":"inProgress","userFraction":0.1}]'
edits_commit --packageName com.example.app --editId EDIT_IDreviews_list --packageName com.example.app --maxResults 50# → { reviews: [{ reviewId, authorName, comments, ... }] }
reviews_reply --packageName com.example.app --reviewId REVIEW_ID \ --replyText "Thanks for the feedback! The crash is fixed in v1.2 — please update."# 1. Create the subscription (product)subscriptions_create --packageName com.example.app --productId plus_monthly \ --subscription '{"listings":[{"languageCode":"en-US","title":"Plus","benefits":["All premium features"]}],"taxAndComplianceSettings":{"taxTier":"TAX_TIER_UNSPECIFIED"}}'
# 2. Create a base plansubscription_base_plans_batch_update --packageName com.example.app --productId plus_monthly \ --requests '[{"basePlan":{"basePlanId":"monthly","autoRenewingBasePlanType":{"billingPeriodDuration":"P1M","accountHoldDuration":"P30D"},"state":"DRAFT","regionalConfigs":[{"regionCode":"US","price":{"currencyCode":"USD","units":"9","nanos":990000000}}]},"updateMask":"autoRenewingBasePlanType,regionalConfigs"}]'
# 3. Activate the base plansubscription_base_plans_activate --packageName com.example.app \ --productId plus_monthly --basePlanId monthly
# 4. Create a 7-day free-trial offersubscription_offers_create --packageName com.example.app --productId plus_monthly \ --basePlanId monthly --offerId new-user-trial \ --offer '{"phases":[{"duration":"P7D","regionalConfigs":[{"regionCode":"US","free":true}]}],"state":"DRAFT"}'
subscription_offers_activate --packageName com.example.app \ --productId plus_monthly --basePlanId monthly --offerId new-user-trial# For a one-time product (consumable or non-consumable)purchases_products_v2_get --packageName com.example.app --token PURCHASE_TOKEN
# For a subscription — includes 2026 OfferPhase, priceChangeState, etc.purchases_subscriptions_v2_get --packageName com.example.app --token PURCHASE_TOKENreports_crash_rate_query \ --name "apps/com.example.app/crashRateMetricSet" \ --dimensions '["versionCode","countryCode"]' \ --metrics '["crashRate","distinctUsers"]' \ --timelineSpec '{"aggregationPeriod":"DAILY","startTime":{"year":2026,"month":4,"day":1},"endTime":{"year":2026,"month":4,"day":8}}'
reports_errors_issues_search --parent "apps/com.example.app" \ --filter "errorIssueType = \"CRASH\""