# App Console: Google Play, App Store Connect, AdMob (oci · ghcr.io/alekla0126/app-console-mcp)

Google Play Console, App Store Connect and AdMob via official APIs: releases, reviews, vitals, ads

- Trust score: 39/100 (low)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- oci · `ghcr.io/alekla0126/app-console-mcp`: 39/100 (this document), [markdown](https://verifymcp.io/servers/alekla0126-app-console-mcp/ghcr-io-alekla0126-app-console-mcp.md), [page](https://verifymcp.io/servers/alekla0126-app-console-mcp/ghcr-io-alekla0126-app-console-mcp)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/alekla0126/app-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-11-05.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 44/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 273 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 63/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 5924 tokens (~128/item across 46 items; 46 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 67/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 47 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the App Console: Google Play, App Store Connect, AdMob MCP server?

App Console: Google Play, App Store Connect, AdMob runs locally as a container image, launched with docker run --rm -i -e GOOGLE_PLAY_SERVICE_ACCOUNT -e ASC_KEY_ID -e ASC_ISSUER_ID -e ASC_PRIVATE_KEY_PATH -e ASC_VENDOR_NUMBER -e ADMOB_PUBLISHER_ID ghcr.io/alekla0126/app-console-mcp:0.3.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add alekla0126-app-console-mcp -- docker run --rm -i -e GOOGLE_PLAY_SERVICE_ACCOUNT -e ASC_KEY_ID -e ASC_ISSUER_ID -e ASC_PRIVATE_KEY_PATH -e ASC_VENDOR_NUMBER -e ADMOB_PUBLISHER_ID ghcr.io/alekla0126/app-console-mcp:0.3.0
```

This image reads GOOGLE_PLAY_SERVICE_ACCOUNT, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY_PATH, ASC_VENDOR_NUMBER and ADMOB_PUBLISHER_ID. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Cursor

```json
{
  "mcpServers": {
    "alekla0126-app-console-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_PLAY_SERVICE_ACCOUNT",
        "-e",
        "ASC_KEY_ID",
        "-e",
        "ASC_ISSUER_ID",
        "-e",
        "ASC_PRIVATE_KEY_PATH",
        "-e",
        "ASC_VENDOR_NUMBER",
        "-e",
        "ADMOB_PUBLISHER_ID",
        "ghcr.io/alekla0126/app-console-mcp:0.3.0"
      ]
    }
  }
}
```

This image reads GOOGLE_PLAY_SERVICE_ACCOUNT, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY_PATH, ASC_VENDOR_NUMBER and ADMOB_PUBLISHER_ID. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### VS Code

```json
{
  "servers": {
    "alekla0126-app-console-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_PLAY_SERVICE_ACCOUNT",
        "-e",
        "ASC_KEY_ID",
        "-e",
        "ASC_ISSUER_ID",
        "-e",
        "ASC_PRIVATE_KEY_PATH",
        "-e",
        "ASC_VENDOR_NUMBER",
        "-e",
        "ADMOB_PUBLISHER_ID",
        "ghcr.io/alekla0126/app-console-mcp:0.3.0"
      ]
    }
  }
}
```

This image reads GOOGLE_PLAY_SERVICE_ACCOUNT, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY_PATH, ASC_VENDOR_NUMBER and ADMOB_PUBLISHER_ID. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Codex

```bash
codex mcp add alekla0126-app-console-mcp -- docker run --rm -i -e GOOGLE_PLAY_SERVICE_ACCOUNT -e ASC_KEY_ID -e ASC_ISSUER_ID -e ASC_PRIVATE_KEY_PATH -e ASC_VENDOR_NUMBER -e ADMOB_PUBLISHER_ID ghcr.io/alekla0126/app-console-mcp:0.3.0
```

This image reads GOOGLE_PLAY_SERVICE_ACCOUNT, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY_PATH, ASC_VENDOR_NUMBER and ADMOB_PUBLISHER_ID. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "alekla0126-app-console-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_PLAY_SERVICE_ACCOUNT",
        "-e",
        "ASC_KEY_ID",
        "-e",
        "ASC_ISSUER_ID",
        "-e",
        "ASC_PRIVATE_KEY_PATH",
        "-e",
        "ASC_VENDOR_NUMBER",
        "-e",
        "ADMOB_PUBLISHER_ID",
        "ghcr.io/alekla0126/app-console-mcp:0.3.0"
      ],
      "enabled": true
    }
  }
}
```

This image reads GOOGLE_PLAY_SERVICE_ACCOUNT, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY_PATH, ASC_VENDOR_NUMBER and ADMOB_PUBLISHER_ID. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Hermes

```yaml
mcp_servers:
  alekla0126-app-console-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "-e", "GOOGLE_PLAY_SERVICE_ACCOUNT", "-e", "ASC_KEY_ID", "-e", "ASC_ISSUER_ID", "-e", "ASC_PRIVATE_KEY_PATH", "-e", "ASC_VENDOR_NUMBER", "-e", "ADMOB_PUBLISHER_ID", "ghcr.io/alekla0126/app-console-mcp:0.3.0"]
```

This image reads GOOGLE_PLAY_SERVICE_ACCOUNT, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY_PATH, ASC_VENDOR_NUMBER and ADMOB_PUBLISHER_ID. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Netclaw

```json
{
  "McpServers": {
    "alekla0126-app-console-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_PLAY_SERVICE_ACCOUNT",
        "-e",
        "ASC_KEY_ID",
        "-e",
        "ASC_ISSUER_ID",
        "-e",
        "ASC_PRIVATE_KEY_PATH",
        "-e",
        "ASC_VENDOR_NUMBER",
        "-e",
        "ADMOB_PUBLISHER_ID",
        "ghcr.io/alekla0126/app-console-mcp:0.3.0"
      ]
    }
  }
}
```

This image reads GOOGLE_PLAY_SERVICE_ACCOUNT, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY_PATH, ASC_VENDOR_NUMBER and ADMOB_PUBLISHER_ID. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Other

```json
{
  "mcpServers": {
    "alekla0126-app-console-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "GOOGLE_PLAY_SERVICE_ACCOUNT",
        "-e",
        "ASC_KEY_ID",
        "-e",
        "ASC_ISSUER_ID",
        "-e",
        "ASC_PRIVATE_KEY_PATH",
        "-e",
        "ASC_VENDOR_NUMBER",
        "-e",
        "ADMOB_PUBLISHER_ID",
        "ghcr.io/alekla0126/app-console-mcp:0.3.0"
      ]
    }
  }
}
```

This image reads GOOGLE_PLAY_SERVICE_ACCOUNT, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY_PATH, ASC_VENDOR_NUMBER and ADMOB_PUBLISHER_ID. Set them in your client's env block for this server; docker run -e passes each one through to the container.

## 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-11-05 (score 39, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 38, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-01 (score 37, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-29 (score 36)

First indexed and scored.

## MCP tools (46)

### `play_apps` (~43 tokens)

List the apps this service account can see (package name and title).

    Uses the Play Developer Reporting API, which must be enabled in the key's Google Cloud project.

### `play_listing` (~84 tokens)

Store listing saved in Play Console for one language (title, short and full description).

    Args:
        package: Android package name, e.g. com.example.app
        language: BCP-47 code as used by Play, e.g. en-US, es-419, pt-BR

Input parameters:

- `language` (string)
- `package` (string, required)

### `play_update_listing` (~177 tokens)

Change the title, short or full description of one listing language (creates the language if new).

    Without confirm it is a dry run: Google validates the texts inside a draft edit that is then discarded.

    Args:
        package: Android package name
        language: listing language, e.g. en-US
        title: new title (max 30), empty keeps the current one
        short_description: new short description (max 80), empty keeps it
        full_description: new full description (max 4000), empty keeps it
        confirm: true to save and send to review

Input parameters:

- `confirm` (boolean)
- `full_description` (string)
- `language` (string, required)
- `package` (string, required)
- `short_description` (string)
- `title` (string)

### `play_tracks` (~40 tokens)

Releases on every track (production, beta, alpha, internal, custom): name, version codes, status, rollout %.

Input parameters:

- `package` (string, required)

### `play_upload` (~243 tokens)

Upload an .aab (or .apk) and release it on a track.

    Without confirm nothing is uploaded: it checks the file and shows the plan.
    Apps that were never published only accept draft releases (draft=true).

    Args:
        package: Android package name
        file: path to the .aab or .apk
        track: internal, alpha, beta, production or a custom track name
        release_notes: "What's new" text for `language` (max 500)
        language: language of the release notes
        rollout_percent: below 100 starts a staged rollout (production)
        draft: create the release as a draft instead of rolling it out
        release_name: optional name shown in Play Console (defaults to the version name)
        confirm: true to upload and commit

Input parameters:

- `confirm` (boolean)
- `draft` (boolean)
- `file` (string, required)
- `language` (string)
- `package` (string, required)
- `release_name` (string)
- `release_notes` (string)
- `rollout_percent` (number)
- `track` (string)

### `play_promote` (~183 tokens)

Promote the latest release of one track to another (e.g. internal → production), keeping its notes.

    Without confirm the change is built and validated by Google in a draft edit, then discarded.

    Args:
        package: Android package name
        from_track: source track, e.g. internal
        to_track: target track, e.g. production
        rollout_percent: below 100 starts a staged rollout
        release_notes: replace the release notes for `language` (empty keeps the source notes)
        language: language of release_notes
        confirm: true to commit

Input parameters:

- `confirm` (boolean)
- `from_track` (string, required)
- `language` (string)
- `package` (string, required)
- `release_notes` (string)
- `rollout_percent` (number)
- `to_track` (string, required)

### `play_rollout` (~144 tokens)

Change a staged rollout: set a new percentage, finish it (100), halt it or resume a halted one.

    Args:
        package: Android package name
        track: track with the staged rollout, usually production
        rollout_percent: new percentage; 100 completes the rollout
        halt: stop the rollout for new users
        resume: resume a halted rollout at rollout_percent (or its previous percentage)
        confirm: true to commit

Input parameters:

- `confirm` (boolean)
- `halt` (boolean)
- `package` (string, required)
- `resume` (boolean)
- `rollout_percent` (number)
- `track` (string)

### `play_reviews` (~118 tokens)

Recent Google Play reviews with text (the API only returns about the last 7 days).

    Each line ends with the review id needed to reply.

    Args:
        package: Android package name
        limit: maximum number of reviews
        unanswered_only: hide reviews that already have a developer reply
        translate_to: optional language code to translate the reviews into, e.g. en

Input parameters:

- `limit` (integer)
- `package` (string, required)
- `translate_to` (string)
- `unanswered_only` (boolean)

### `play_reply` (~93 tokens)

Reply publicly to a Google Play review as the developer (max 350 characters; replaces an earlier reply).

    Args:
        package: Android package name
        review_id: id from play_reviews
        text: reply text
        confirm: true to publish the reply

Input parameters:

- `confirm` (boolean)
- `package` (string, required)
- `review_id` (string, required)
- `text` (string, required)

### `play_vitals` (~92 tokens)

Android vitals: user-perceived crash and ANR rates (28-day, as Google judges them) and the worst versions.

    Google's bad-behavior thresholds: crashes 1.09 %, ANR 0.47 %.

    Args:
        package: Android package name
        days: window for the per-version breakdown

Input parameters:

- `days` (integer)
- `package` (string, required)

### `play_products` (~67 tokens)

Subscriptions (with base plans and price in one region) and one-time in-app products.

    Args:
        package: Android package name
        region: region code for prices, e.g. US, MX

Input parameters:

- `package` (string, required)
- `region` (string)

### `play_images` (~68 tokens)

How many images each graphic type has in one listing language (screenshots, icon, feature graphic, TV banner).

    Args:
        package: Android package name
        language: listing language, e.g. en-US

Input parameters:

- `language` (string)
- `package` (string, required)

### `play_upload_images` (~200 tokens)

Upload screenshots or graphics to one listing language, in the order given.

    Without confirm the images go into a draft edit that Google validates and then discards.

    Args:
        package: Android package name
        language: listing language, e.g. en-US
        image_type: phoneScreenshots, sevenInchScreenshots, tenInchScreenshots, tvScreenshots, wearScreenshots,
            icon, featureGraphic or tvBanner
        files: PNG or JPEG files (one for icon, featureGraphic and tvBanner; up to 8 screenshots per type)
        replace: delete the current screenshots of that type first (otherwise new ones go after them)
        confirm: true to save and send to review

Input parameters:

- `confirm` (boolean)
- `files` (array, required)
- `image_type` (string, required)
- `language` (string, required)
- `package` (string, required)
- `replace` (boolean)

### `play_users` (~67 tokens)

Users and service accounts of the Play developer account, with account-wide permissions and per-app grants.

    Needs GOOGLE_PLAY_DEVELOPER_ID and a key with "Manage users and permissions".

    Args:
        package: only people with access to this app

Input parameters:

- `package` (string)

### `play_grant` (~127 tokens)

Give a person or service account permissions on one app, inviting them to the account first if needed.

    Args:
        email: their Google account or service account email
        package: Android package name
        permissions: preset read, deploy (releases on every track, listing, testers) or full, or permission names
            comma-separated (e.g. reply_to_reviews,view_financial_data)
        confirm: true to save

Input parameters:

- `confirm` (boolean)
- `email` (string, required)
- `package` (string, required)
- `permissions` (string)

### `play_revoke` (~84 tokens)

Remove someone's access to one app, or (without package) remove them from the developer account.

    Args:
        email: their email
        package: the app to remove them from; empty removes them from the whole account
        confirm: true to remove

Input parameters:

- `confirm` (boolean)
- `email` (string, required)
- `package` (string)

### `play_data_safety` (~121 tokens)

Replace an app's Data safety answers with a CSV in Play Console's format.

    Get the CSV once from Play Console (App content > Data safety > Export to CSV), edit it, and reuse it for similar
    apps. Google offers no way to read the current answers back through the API.

    Args:
        package: Android package name
        csv_file: path to the CSV
        confirm: true to send it

Input parameters:

- `confirm` (boolean)
- `csv_file` (string, required)
- `package` (string, required)

### `play_search_rank` (~94 tokens)

Position of an app in public Google Play search (top 30) for several keywords. No credentials needed.

    Args:
        package: Android package name
        keywords: search terms to check
        country: two-letter country code
        language: two-letter language code

Input parameters:

- `country` (string)
- `keywords` (array, required)
- `language` (string)
- `package` (string, required)

### `appstore_apps` (~29 tokens)

List every app in the App Store Connect account: Apple ID, bundle id, name and SKU.

### `appstore_versions` (~101 tokens)

Latest App Store versions with their state (e.g. READY_FOR_SALE, WAITING_FOR_REVIEW, REJECTED) and build.

    Args:
        app: Apple ID, bundle id or part of the name
        platform: IOS, MAC_OS, TV_OS or VISION_OS
        limit: how many versions to show

Input parameters:

- `app` (string, required)
- `limit` (integer)
- `platform` (string)

### `appstore_create_version` (~139 tokens)

Create a new App Store version (the editable 'Prepare for Submission' version).

    Args:
        app: Apple ID, bundle id or part of the name
        version: version string, e.g. 1.4.0
        platform: IOS, MAC_OS, TV_OS or VISION_OS
        release_type: MANUAL, AFTER_APPROVAL or SCHEDULED (empty keeps Apple's default)
        confirm: true to create it

Input parameters:

- `app` (string, required)
- `confirm` (boolean)
- `platform` (string)
- `release_type` (string)
- `version` (string, required)

### `appstore_listing` (~132 tokens)

App Store listing for one locale: name, subtitle, description, keywords, promotional text, what's new.

    Args:
        app: Apple ID, bundle id or part of the name
        locale: e.g. en-US, es-MX, pt-BR
        version: '' (editable version if any, else live), 'live', 'editable' or a version string
        platform: IOS, MAC_OS, TV_OS or VISION_OS

Input parameters:

- `app` (string, required)
- `locale` (string)
- `platform` (string)
- `version` (string)

### `appstore_update_listing` (~263 tokens)

Change listing texts for one locale. Empty fields are left as they are; a missing locale is created.

    Name, subtitle, description, keywords and what's new go to the editable version (they ship with the
    next review). Promotional text can change any time: with no editable version it goes to the live one.

    Args:
        app: Apple ID, bundle id or part of the name
        locale: e.g. en-US
        name: app name (max 30)
        subtitle: subtitle (max 30)
        description: description (max 4000)
        keywords: comma-separated keywords (max 100)
        promotional_text: promotional text (max 170)
        whats_new: release notes of the editable version (max 4000)
        platform: IOS, MAC_OS, TV_OS or VISION_OS
        confirm: true to save

Input parameters:

- `app` (string, required)
- `confirm` (boolean)
- `description` (string)
- `keywords` (string)
- `locale` (string, required)
- `name` (string)
- `platform` (string)
- `promotional_text` (string)
- `subtitle` (string)
- `whats_new` (string)

### `appstore_reviews` (~138 tokens)

Latest App Store customer reviews (newest first). Each line ends with the id needed to reply.

    Args:
        app: Apple ID, bundle id or part of the name
        limit: maximum number of reviews (up to 200 per page)
        unanswered_only: only reviews without a published developer response
        territory: optional three-letter territory, e.g. USA, MEX
        rating: optional star filter, 1-5

Input parameters:

- `app` (string, required)
- `limit` (integer)
- `rating` (integer)
- `territory` (string)
- `unanswered_only` (boolean)

### `appstore_reply` (~76 tokens)

Publish (or replace) the developer response to an App Store review. It is public.

    Args:
        review_id: id from appstore_reviews
        text: response text
        confirm: true to publish

Input parameters:

- `confirm` (boolean)
- `review_id` (string, required)
- `text` (string, required)

### `appstore_builds` (~89 tokens)

Recent builds (TestFlight and App Store) with processing state and export-compliance flag.

    Args:
        app: Apple ID, bundle id or part of the name
        limit: how many builds
        platform: IOS, MAC_OS, TV_OS or VISION_OS

Input parameters:

- `app` (string, required)
- `limit` (integer)
- `platform` (string)

### `appstore_submit` (~133 tokens)

Attach a build to the editable version and submit it to App Review.

    Without confirm it only checks: editable version, chosen build, missing what's new, export compliance.

    Args:
        app: Apple ID, bundle id or part of the name
        build: build number (CFBundleVersion); empty picks the newest valid build of that version
        platform: IOS, MAC_OS, TV_OS or VISION_OS
        confirm: true to submit for review

Input parameters:

- `app` (string, required)
- `build` (string)
- `confirm` (boolean)
- `platform` (string)

### `appstore_release` (~93 tokens)

Release an approved version that is waiting for manual release (PENDING_DEVELOPER_RELEASE).

    Args:
        app: Apple ID, bundle id or part of the name
        platform: IOS, MAC_OS, TV_OS or VISION_OS
        confirm: true to release it to the App Store

Input parameters:

- `app` (string, required)
- `confirm` (boolean)
- `platform` (string)

### `appstore_screenshots` (~120 tokens)

Screenshot sets of one locale (device type, how many, processing state).

    Args:
        app: Apple ID, bundle id or part of the name
        locale: e.g. en-US
        version: '' (editable version if any, else live), 'live', 'editable' or a version string
        platform: IOS, MAC_OS, TV_OS or VISION_OS

Input parameters:

- `app` (string, required)
- `locale` (string)
- `platform` (string)
- `version` (string)

### `appstore_upload_screenshots` (~214 tokens)

Upload screenshots for one device type and locale of the editable version, in the order given.

    Args:
        app: Apple ID, bundle id or part of the name
        locale: e.g. en-US
        display_type: e.g. APP_IPHONE_67 (6.7"/6.9"), APP_IPHONE_65, APP_IPHONE_55, APP_IPAD_PRO_3GEN_129, APP_DESKTOP
        files: PNG or JPEG files at that device's size (up to 10 per set)
        replace: delete the set's current screenshots first (otherwise new ones go after them)
        platform: IOS, MAC_OS, TV_OS or VISION_OS
        confirm: true to upload

Input parameters:

- `app` (string, required)
- `confirm` (boolean)
- `display_type` (string, required)
- `files` (array, required)
- `locale` (string, required)
- `platform` (string)
- `replace` (boolean)

### `appstore_products` (~77 tokens)

Subscription groups and subscriptions (state, period, price in one territory) and in-app purchases.

    Args:
        app: Apple ID, bundle id or part of the name
        territory: three-letter territory for prices, e.g. USA, MEX

Input parameters:

- `app` (string, required)
- `territory` (string)

### `appstore_sales` (~89 tokens)

Downloads, in-app purchase units and proceeds per app for the last days (daily sales reports).

    Needs ASC_VENDOR_NUMBER (App Store Connect > Payments and Financial Reports) and a key with Sales access.
    Apple publishes each day's report the next day, so the newest day may be missing.

    Args:
        days: number of days back from yesterday

Input parameters:

- `days` (integer)

### `appstore_search_rank` (~88 tokens)

Approximate position of an iOS app in App Store search (public iTunes Search API, top 200). No key needed.

    Args:
        app: numeric Apple ID or bundle id
        keywords: search terms to check
        country: two-letter country code

Input parameters:

- `app` (string, required)
- `country` (string)
- `keywords` (array, required)

### `admob_accounts` (~26 tokens)

AdMob publisher accounts this Google user can read, with currency and reporting time zone.

### `admob_apps` (~95 tokens)

AdMob apps (platform, store id, approval state) and their ad units (id, format, name).

    Useful to check that the ad unit ids in your code exist before a release.

    Args:
        search: part of an app name, app id or store id
        ad_units: also list each app's ad units

Input parameters:

- `ad_units` (boolean)
- `search` (string)

### `admob_ad_sources` (~103 tokens)

Ad sources (networks) available for mediation, and optionally their adapters with the settings an ad unit
    mapping needs (adapter id, platform, formats, required keys).

    Args:
        search: part of a source name or its id, e.g. meta, applovin
        adapters: also list each source's adapters (needs search when more than 10 sources match)

Input parameters:

- `adapters` (boolean)
- `search` (string)

### `admob_report` (~224 tokens)

AdMob earnings, impressions, eCPM, match, show rate and CTR, with the change against the previous period.

    Args:
        days: number of full days ending yesterday (or end_date)
        by: grouping, comma-separated: app, ad_unit, country, format, platform, date, week, month, ad_type,
            app_version, sdk_version, os_version, serving_restriction (why ads are limited), or the mediation
            groupings ad_source, ad_source_instance, mediation_group
        currency: report currency, e.g. USD (empty uses the account currency)
        rows: maximum rows to show
        app_id: optional AdMob app id (ca-app-pub-...~...) to limit the report to one app
        end_date: optional last day, YYYY-MM-DD

Input parameters:

- `app_id` (string)
- `by` (string)
- `currency` (string)
- `days` (integer)
- `end_date` (string)
- `rows` (integer)

### `admob_campaign_report` (~125 tokens)

AdMob app promotion campaigns: impressions, clicks, CTR, installs, estimated cost and cost per install.

    Args:
        days: number of full days ending yesterday (or end_date), at most 30
        by: grouping, comma-separated: campaign, ad, placement, platform, country, format, date
        rows: maximum rows to show
        end_date: optional last day, YYYY-MM-DD

Input parameters:

- `by` (string)
- `days` (integer)
- `end_date` (string)
- `rows` (integer)

### `admob_mediation_groups` (~76 tokens)

Mediation groups with their targeting (platform, format, ad units, regions), state, A/B test and lines
    (ad source, CPM, state). Limited access: Google must enable the publisher.

    Args:
        search: part of a group name or its id

Input parameters:

- `search` (string)

### `admob_ad_unit_mappings` (~62 tokens)

Ad unit mappings of one ad unit: which third-party adapter it uses and its settings. Limited access.

    Args:
        ad_unit_id: ca-app-pub-.../... ad unit id

Input parameters:

- `ad_unit_id` (string, required)

### `admob_create_app` (~131 tokens)

Add an app to AdMob, linked to its store listing (app_store_id) or by name only. Limited access.

    Args:
        platform: ANDROID or IOS
        display_name: name for an app that isn't in a store yet (max 80)
        app_store_id: package name (Android) or numeric App Store id (iOS) to link it to its store
        confirm: true to create it

Input parameters:

- `app_store_id` (string)
- `confirm` (boolean)
- `display_name` (string)
- `platform` (string, required)

### `admob_create_ad_unit` (~209 tokens)

Create an ad unit in one of the account's apps. Limited access.

    Args:
        app_id: AdMob app id, ca-app-pub-...~...
        display_name: ad unit name (max 80)
        ad_format: APP_OPEN, BANNER, BANNER_INTERSTITIAL, INTERSTITIAL, NATIVE, REWARDED or REWARDED_INTERSTITIAL
        ad_types: comma-separated RICH_MEDIA, VIDEO (empty: RICH_MEDIA for banners, both otherwise)
        reward_amount: reward per view, REWARDED only
        reward_item: reward name, e.g. coins, REWARDED only
        confirm: true to create it

Input parameters:

- `ad_format` (string, required)
- `ad_types` (string)
- `app_id` (string, required)
- `confirm` (boolean)
- `display_name` (string, required)
- `reward_amount` (integer)
- `reward_item` (string)

### `admob_map_ad_unit` (~169 tokens)

Map an ad unit to a third-party network's adapter, so mediation lines can use it. Limited access.

    Find the adapter id and the settings it needs with admob_ad_sources(search=..., adapters=true).

    Args:
        ad_unit_id: ca-app-pub-.../... ad unit id
        adapter_id: adapter id from admob_ad_sources
        settings: the adapter's settings as id=value, e.g. 118=1234567890_987654321
        display_name: optional name for the mapping
        confirm: true to create it

Input parameters:

- `ad_unit_id` (string, required)
- `adapter_id` (string, required)
- `confirm` (boolean)
- `display_name` (string)
- `settings` (array, required)

### `admob_create_mediation_group` (~245 tokens)

Create a mediation group for some ad units, with lines for other ad sources. Created disabled unless
    enable=true. Limited access.

    Args:
        display_name: group name (max 120)
        platform: ANDROID or IOS
        ad_format: BANNER, INTERSTITIAL, REWARDED, NATIVE, APP_OPEN or REWARDED_INTERSTITIAL
        ad_unit_ids: ad units the group targets
        lines: comma-separated SOURCE_ID@live or SOURCE_ID@CPM (manual CPM, account currency, min 0.01);
            third-party sources use each ad unit's existing mapping (admob_map_ad_unit)
        regions: optional comma-separated country codes to target, e.g. US,MX (empty: all)
        enable: serve it right away
        confirm: true to create it

Input parameters:

- `ad_format` (string, required)
- `ad_unit_ids` (array, required)
- `confirm` (boolean)
- `display_name` (string, required)
- `enable` (boolean)
- `lines` (string)
- `platform` (string, required)
- `regions` (string)

### `admob_update_mediation_group` (~216 tokens)

Change a mediation group: turn it on or off, rename it, change its ad units, or change one line's state or
    manual CPM. Limited access.

    Args:
        group_id: mediation group id from admob_mediation_groups
        state: ENABLED or DISABLED
        display_name: new name (max 120)
        ad_unit_ids: comma-separated ad unit ids that replace the targeted ones
        line_id: id of the line to change
        line_state: ENABLED, DISABLED or REMOVED for line_id
        line_cpm: new manual CPM for line_id (switches it to manual)
        confirm: true to save

Input parameters:

- `ad_unit_ids` (string)
- `confirm` (boolean)
- `display_name` (string)
- `group_id` (string, required)
- `line_cpm` (number)
- `line_id` (string)
- `line_state` (string)
- `state` (string)

### `admob_ab_experiment` (~192 tokens)

Start a mediation A/B experiment on a group (its lines vs. treatment lines), or stop it keeping the winner.
    Limited access.

    Args:
        group_id: mediation group id
        action: start or stop
        treatment_lines: for start, comma-separated SOURCE_ID@live or SOURCE_ID@CPM for variant B
        traffic_percent: for start, share of traffic for variant B (1-99)
        display_name: for start, experiment name
        winner: for stop, a (keep the current lines) or b (keep the treatment)
        confirm: true to start or stop it

Input parameters:

- `action` (string)
- `confirm` (boolean)
- `display_name` (string)
- `group_id` (string, required)
- `traffic_percent` (integer)
- `treatment_lines` (string)
- `winner` (string)

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/alekla0126-app-console-mcp/ghcr-io-alekla0126-app-console-mcp#diagnostics

## Score history

- 2026-11-05: 39
- 2026-11-04: 38
- 2026-11-03: 38
- 2026-11-02: 37
- 2026-11-01: 37
- 2026-10-31: 36
- 2026-10-30: 36
- 2026-10-29: 36

## Common questions

### What is the App Console: Google Play, App Store Connect, AdMob MCP server?

App Console: Google Play, App Store Connect, AdMob is an MCP server listed in the public MCP registry as io.github.Alekla0126/app-console-mcp. Google Play Console, App Store Connect and AdMob via official APIs: releases, reviews, vitals, ads. This page covers its container image (ghcr.io/alekla0126/app-console-mcp).

### Is the App Console: Google Play, App Store Connect, AdMob MCP server safe to use?

App Console: Google Play, App Store Connect, AdMob scores 39 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the App Console: Google Play, App Store Connect, AdMob MCP server expose?

App Console: Google Play, App Store Connect, AdMob exposes 46 tools: play_apps, play_listing, play_update_listing, play_tracks, play_upload, and 41 more. Their descriptions and schemas cost roughly 5,699 tokens of context every time the server is loaded.

### Is the App Console: Google Play, App Store Connect, AdMob MCP server still maintained?

App Console: Google Play, App Store Connect, AdMob is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the App Console: Google Play, App Store Connect, AdMob MCP server under?

App Console: Google Play, App Store Connect, AdMob declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the App Console: Google Play, App Store Connect, AdMob MCP server?

VerifyMCP ran 12 checks on App Console: Google Play, App Store Connect, AdMob, covering Source repository, Provenance, License, Maintenance and 8 more. 4 items could not be completed, a gap on our side rather than a finding about App Console: Google Play, App Store Connect, AdMob: Malware scan, Known CVEs, Install scripts and Dependency health. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to a container image, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- GitHub Container Registry: https://ghcr.io/alekla0126/app-console-mcp
- Repository: https://github.com/Alekla0126/app-console-mcp
- Changelog RSS feed: https://verifymcp.io/servers/alekla0126-app-console-mcp/ghcr-io-alekla0126-app-console-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/alekla0126-app-console-mcp/ghcr-io-alekla0126-app-console-mcp/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/alekla0126-app-console-mcp/ghcr-io-alekla0126-app-console-mcp.json
- HTML version of this page: https://verifymcp.io/servers/alekla0126-app-console-mcp/ghcr-io-alekla0126-app-console-mcp
