Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
GOOGLE_PLAY_PACKAGE_NAMENoDefault app package name, so tools can omit package_name
GOOGLE_SERVICE_ACCOUNT_KEYNoThe service account JSON key inline, as a raw JSON string
GOOGLE_SERVICE_ACCOUNT_KEY_PATHNoPath to the downloaded service account JSON key

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_reviewsA

List recent user reviews for an app, newest first. Each review has reviewId, authorName and comments[] containing the userComment (text, starRating 1-5, device, androidOsVersion, appVersionCode/Name, thumbsUp/DownCount, lastModified) and any developerComment already posted. Note the Google Play API only returns reviews created or modified in the last 7 days, only reviews that include written text, and only for production releases. Use the returned reviewId with get_review or reply_to_review.

get_reviewA

Get a single user review by its reviewId, including the full comment thread (user comment and any developer reply). Get review IDs from list_reviews.

reply_to_reviewA

Post a public developer reply to a user review. Replies are limited to 350 characters and are shown publicly on the Play Store under the review. Replying to a review that already has a reply edits the existing reply; the user is only notified about the first reply. Get review IDs from list_reviews.

list_tracksA

List all release tracks for an app (internal, alpha, beta, production and any custom closed tracks) with their releases: name, versionCodes, status (draft/inProgress/halted/completed), userFraction for staged rollouts, and releaseNotes. Start here to see what is live before using promote_release, update_rollout or halt_rollout.

get_trackA

Get a single release track with its releases (name, versionCodes, status, userFraction, releaseNotes). Use list_tracks first if you do not know the track name.

list_releasesA

List the releases on a track, including ones that are not live yet. Each entry has releaseName, track, activeArtifacts (version codes) and releaseLifecycleState: DRAFT, NOT_SENT_FOR_REVIEW, IN_REVIEW, APPROVED_NOT_PUBLISHED, NOT_APPROVED or PUBLISHED. This is the only tool that shows review state, so use it to check whether a submitted release is still being reviewed; get_track shows rollout details (userFraction, release notes) instead. Reads the track directly without opening an edit. Obsolete releases are excluded and Google returns at most 20.

promote_releaseA

Promote the active release of one track to another (e.g. beta -> production), keeping its version codes. Omit user_fraction for a full rollout (status 'completed'); pass user_fraction for a staged rollout (status 'inProgress'). This replaces the destination track's release list, matching how promoting works in the Play Console. Use validate_only first to check the change without committing.

update_rolloutA

Change the staged rollout percentage of the in-progress release on a track. Pass user_fraction 1 to complete the rollout to all users (status becomes 'completed'). Updating a halted release resumes it. Use get_track to see the current userFraction first.

halt_rolloutA

Halt the in-progress staged rollout on a track, stopping delivery to new users while keeping the current userFraction. Use update_rollout afterwards to resume or complete it.

create_releaseA

Create a release on a track from explicit version codes, replacing whatever releases that track currently has. Use this to ship an already-uploaded bundle: get the version codes from list_bundles or list_apks first. Use promote_release instead when moving an existing release between tracks. Use validate_only first to check the change without committing.

update_release_notesA

Replace the localized release notes ('what's new' text) of the active release on a track, leaving its version codes, status and rollout fraction untouched. Use get_track first to see the current notes and which locales exist. Notes are capped at 500 characters per locale by Google.

create_trackA

Create a new custom closed testing track. The built-in tracks (internal, alpha, beta, production) already exist and do not need creating. After creating a track, use update_testers to give Google Groups access and create_release to ship to it.

get_country_availabilityA

Get the countries a track is available in, including whether the app is restricted to a country list and which countries are included. Read-only; change targeting with the country_targeting argument of create_release or promote_release.

get_testersA

Get the Google Groups that have access to a closed testing track, returned as googleGroups. Only applies to closed tracks (alpha and custom tracks), not to internal or production.

update_testersA

Set the Google Groups that have access to a closed testing track. This replaces the full list, so include every group you want to keep — use get_testers first. Only applies to closed tracks (alpha and custom tracks).

list_listingsA

List every localized store listing for an app, each with language, title, shortDescription, fullDescription and video. Start here to see which locales the app is published in before using update_listing.

get_listingA

Get the store listing for one locale: title, shortDescription, fullDescription and video. Use list_listings first if you do not know which locales exist.

update_listingA

Update the store listing text for one locale. Only the fields you pass are changed, so you can edit just the title without touching the description. Creates the listing if that locale does not exist yet. Google's limits: title 30 characters, short description 80, full description 4000. Use validate_only first to check the change without committing.

get_app_detailsA

Get app-level details that are not per-locale: contactEmail, contactPhone, contactWebsite and defaultLanguage.

update_app_detailsA

Update app-level contact details and default language. Only the fields you pass are changed. Use validate_only first to check the change without committing.

list_listing_imagesA

List the store images of one type for one locale, each with id, url, sha1 and sha256. Use the returned ids with delete_listing_image.

list_bundlesA

List the app bundles (AABs) uploaded for an app, each with versionCode, sha1 and sha256. Use the versionCode values with create_release to ship a bundle to a track. This server does not upload bundles — upload them from CI or the Play Console first.

list_apksA

List the APKs uploaded for an app, each with versionCode and binary hashes. Most apps ship bundles instead — use list_bundles for those. Use the versionCode values with create_release.

list_generated_apksA

List the APKs Google Play generated from an uploaded bundle for a given version code, grouped by signing key, including split, standalone and universal APKs with their download ids. Use list_bundles to find version codes.

get_expansion_fileA

Get the OBB expansion file attached to an APK version code, returning fileSize and referencesVersion. Legacy APK-only feature: apps shipping app bundles use asset packs instead and will get an error here.

list_device_tier_configsA

List the device tier configs of an app, newest first. A device tier config groups devices into tiers by RAM, system-on-chip and other selectors so one app bundle can serve different assets per tier. Each entry has a deviceTierConfigId plus its deviceGroups, deviceTierSet and userCountrySets; pass an id to get_device_tier_config for the full definition. Returns 10 by default, 100 at most; pass page_token from nextPageToken to continue. Device tier configs are read-only here — create them in the Play Console or with bundletool.

get_device_tier_configA

Get one device tier config by id, with its deviceGroups (each a named set of device selectors — a device belongs to the group if it matches any selector), deviceTierSet and userCountrySets. Get ids from list_device_tier_configs. Bundles using Play Asset Delivery target these groups and tiers.

list_recovery_actionsA

List the app recovery actions targeting a version code, each with appRecoveryId, status (DRAFT, ACTIVE, CANCELED, GENERATION_IN_PROGRESS, GENERATION_FAILED), targeting and timestamps. Recovery actions push a remote in-app update to users stuck on a broken release — use query_crash_rate and search_error_issues first to confirm which version is broken.

query_crash_rateA

Query the crash rate of an app over time from Android vitals: crashRate (share of distinct users who experienced a crash) and userPerceivedCrashRate (crashes while the user was interacting). Optionally break down by version code, device model, country and more. Data is aggregated daily in America/Los_Angeles, lags about one day, and slices with too few users are omitted by Google.

query_anr_rateA

Query the ANR (Application Not Responding) rate of an app over time from Android vitals: anrRate and userPerceivedAnrRate. Optionally break down by version code, device model, country and more. Data is aggregated daily in America/Los_Angeles and lags about one day.

query_error_countsA

Query absolute counts of error reports (crashes and ANRs) over time: errorReportCount and distinctUsers. Rows are always broken down by reportType (CRASH/ANR/NON_FATAL), which the API requires; add issueId to see which issues drive the volume, then use search_error_issues for details.

query_slow_start_rateA

Query how often the app started slowly: slowStartRate (share of distinct users that had a slow Activity start) plus distinctUsers. Rows are always broken down by startType (COLD/WARM/HOT), which the API requires, since the thresholds differ per start type. Ask for slowStartRate7dUserWeighted or slowStartRate28dUserWeighted in metrics for the user-weighted rolling averages the Play Console shows. Daily aggregation only.

query_slow_rendering_rateA

Query the slow rendering rate of a game: slowRenderingRate20Fps and slowRenderingRate30Fps (share of distinct users whose sessions missed the target frame rate on more than 25% of frames) plus distinctUsers. Google only collects this for games — other apps get an error or empty rows. Ask for the *7dUserWeighted / *28dUserWeighted variants in metrics for rolling averages. Daily aggregation only.

query_excessive_wakeup_rateA

Query the excessive wakeup rate: excessiveWakeupRate (share of distinct users that had more than 10 AlarmManager wakeups per hour) plus distinctUsers. This is a battery-drain metric and counts users doing background work, not just foreground usage. Ask for excessiveWakeupRate7dUserWeighted or excessiveWakeupRate28dUserWeighted in metrics for rolling averages. Daily aggregation only.

query_stuck_wakelock_rateA

Query the stuck background wakelock rate: stuckBgWakelockRate (share of distinct users that held a PowerManager wakelock in the background for more than one hour) plus distinctUsers. Another battery-drain metric, counted over users doing any work on the device. Ask for stuckBgWakelockRate7dUserWeighted or stuckBgWakelockRate28dUserWeighted in metrics for rolling averages. Daily aggregation only.

query_lmk_rateA

Query the low-memory-kill rate: userPerceivedLmkRate (share of distinct users whose app was killed by the system for memory pressure while they were actively using it) plus distinctUsers. Read it next to query_crash_rate and query_anr_rate — an LMK is a stability failure users see as the app disappearing, but it is not reported as a crash. Ask for userPerceivedLmkRate7dUserWeighted or userPerceivedLmkRate28dUserWeighted in metrics for rolling averages. Daily aggregation only.

query_bitmap_memory_usageA

Query bitmap memory usage percentiles: bitmapMemoryUsageP50/P90/P99 (bytes) plus distinctUsers. Also supports P75 and P95 via metrics, and the processName and appState dimensions (e.g. FOREGROUND) on top of the usual device dimensions. Pair with query_lmk_rate when investigating memory pressure. Daily aggregation only.

query_memory_usageA

Query overall app memory usage percentiles (anonymous RSS plus swap, the figure Android vitals reports as memory usage): anonRssAndSwapMemoryUsageP50/P90/P99 in bytes plus distinctUsers. Also supports P75 and P95 via metrics, and the processName and appState dimensions. Use query_bitmap_memory_usage to see how much of it is bitmaps. Daily aggregation only.

list_anomaliesA

List anomalies Google detected in this app's vitals metrics — datapoints that fall outside the expected range derived from historical data, flagged only when a metric got worse. Each anomaly has name, metricSet (which metric set it was found in), dimensions (the slice it applies to, e.g. a single versionCode or deviceModel), metric (the anomalous value) and timelineSpec (the period it covers). Feed those into the matching query_* tool to pull the full timeline for context. Returns 10 by default, 100 at most; pass page_token from nextPageToken for more. Start here to check whether anything is currently wrong instead of guessing date ranges.

get_vitals_freshnessA

Check how fresh Android vitals data is before querying it. Returns each requested metric set with freshnessInfo.freshnesses[], giving the latest end time available per aggregation period (DAILY, HOURLY) — use it to pick an end_date the query_* tools will actually return rows for, since vitals data typically lags about a day. Defaults to the crash, ANR and error count metric sets. A metric set with no data for this app (slowRenderingRateMetricSet is games-only, for example) comes back with an error field instead of freshnessInfo rather than failing the whole call.

search_error_issuesA

Search grouped crash/ANR issues for an app (deduplicated stack traces). Each issue has a name containing its issue ID, type (CRASH/ANR), cause, location, errorReportCount, distinctUsers, affected versions, and an issueUri linking to the Play Console. Use the issue name with search_error_reports to read individual stack traces.

search_error_reportsA

Search individual crash/ANR error reports for an app, including reportText with the raw stack trace, device info and app version. Filter to one issue with a filter like "issue = 'apps/com.acme.app/errorIssues/'" using an issue name from search_error_issues.

list_appsA

List the apps this service account can access, each with packageName, displayName and a resource name. Use it to discover package names when GOOGLE_PLAY_PACKAGE_NAME is not set or when working across several apps — pass a packageName as the package_name argument of any other tool. Note displayName is the latest title set in the Play Console, which may not match the Play Store yet. Returns 50 apps by default, 1000 at most; pass page_token from nextPageToken to continue.

get_release_filter_optionsA

List the tracks and releases that vitals metrics can be filtered by. Returns tracks[] with displayName, type and servingReleases[] (each with displayName and the versionCodes it contains). Use those version codes to build the filter argument of query_crash_rate, query_anr_rate and the other query_* tools, e.g. "versionCode = 415". Only releases currently serving users are listed, so use list_tracks or list_releases for the full release picture.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/OrellBuehler/play-console-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server