# Google E-commerce (GA4, Search Console, Merchant Center) (pypi · google-ecommerce-mcp)

Read-only GA4, Search Console, Merchant Center, Tag Manager, Indexing and PageSpeed for shops.

- Trust score: 85/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-16

## Components

- pypi · `google-ecommerce-mcp`: 85/100 (this document), [markdown](https://verifymcp.io/servers/mooneyes-google-ecommerce-mcp/google-ecommerce-mcp.md), [page](https://verifymcp.io/servers/mooneyes-google-ecommerce-mcp/google-ecommerce-mcp)

## Channel facts

- Registry: `pypi`
- Package: `google-ecommerce-mcp`
- Version: `0.4.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-10-16.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 4 of 52 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to MoonEyes/google-ecommerce-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 65/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4572 tokens (~207/item across 22 items; 22 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 40/100
  - Stability observed for 12 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.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 23 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Google E-commerce (GA4, Search Console, Merchant Center) MCP server?

Google E-commerce (GA4, Search Console, Merchant Center) runs locally as a PyPI package, launched with uvx google-ecommerce-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add mooneyes-google-ecommerce-mcp -- uvx google-ecommerce-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "mooneyes-google-ecommerce-mcp": {
      "command": "uvx",
      "args": [
        "google-ecommerce-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "mooneyes-google-ecommerce-mcp": {
      "command": "uvx",
      "args": [
        "google-ecommerce-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add mooneyes-google-ecommerce-mcp -- uvx google-ecommerce-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mooneyes-google-ecommerce-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "google-ecommerce-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add mooneyes-google-ecommerce-mcp --command uvx --arg google-ecommerce-mcp
```

### Hermes

```yaml
mcp_servers:
  mooneyes-google-ecommerce-mcp:
    command: "uvx"
    args: ["google-ecommerce-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "mooneyes-google-ecommerce-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "google-ecommerce-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add mooneyes-google-ecommerce-mcp -t stdio -c uvx -a google-ecommerce-mcp
```

### Other

```json
{
  "mcpServers": {
    "mooneyes-google-ecommerce-mcp": {
      "command": "uvx",
      "args": [
        "google-ecommerce-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-10-16 (score 85, −2)

- [security regression] Stability: 0.37 → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Schema quality: 120 → 207
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Package version: 0.3.1 → 0.4.0

### 2026-10-15 (score 87, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-10-14 (score 71, +21)

- [security regression] Malware scan: pass → unverified
- [security improvement] Injection markers: unverified → pass
- [functional regression] Schema quality: pass → fail
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Stability: unverified → 0.33
- [functional improvement] MCP protocol: unverified → pass

### 2026-10-13 (score 50, +26)

- [security improvement] Malware scan: unverified → pass
- [security improvement] Known CVEs: unverified → pass
- [functional improvement] Dependency health: unverified → 0.96

### 2026-10-12 (score 24, −58)

- [security regression] Malware scan: pass → unverified
- [security regression] Known CVEs: pass → unverified
- [security regression] Tool safety: pass → unverified
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Dependency health: 0.96 → unverified
- [functional] First check of Schema quality: unverified
- [functional] Package version: 0.2.0 → 0.3.1

### 2026-10-04 (score 82)

First indexed and scored.

## MCP tools (22)

### `server_status` (~71 tokens)

Server status

Which Google services are configured for this server, and whether the stored OAuth token works.
Call it first when another tool answers not_configured or not_authenticated. Returns one boolean per
service, the token storage (os-keyring or file), "token": "ok" or the error, and the package version.

### `ga4_report` (~300 tokens)

GA4 report

Run a Google Analytics 4 report (Data API runReport): traffic, conversions or revenue split by any dimensions
over a date range. Returns the top rows ({"rows": [{dimension: value, metric: number}]}), "totals" over every
row, "row_count" and "truncated", the unit and definition of each metric under "metrics", the currency, and a
"date_range" resolved to calendar dates in the property's timezone with "data_complete". Use ga4_realtime for the
last 30 minutes.

Input parameters:

- `channel_group` (string): Optional exact filter on sessionDefaultChannelGroup, e.g. 'Organic Search'; empty for all channels
- `dimensions` (array): GA4 API dimension names, e.g. sessionDefaultChannelGroup, landingPage, sessionSource, yearMonth, itemName
- `end_date` (string): YYYY-MM-DD, NdaysAgo, yesterday or today
- `limit` (integer): Maximum rows returned (1 to 1000); totals always cover every row
- `metrics` (array): GA4 API metric names, e.g. sessions, totalUsers, ecommercePurchases, purchaseRevenue, keyEvents
- `property_id` (string): Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID
- `start_date` (string): YYYY-MM-DD, NdaysAgo, yesterday or today

### `ga4_realtime` (~142 tokens)

GA4 realtime

GA4 realtime report for the last 30 minutes. Useful to check a tracking change, for example that one page
view is counted once and not twice. Returns {"rows": [...], "row_count": n, "totals": {...}, "metrics": {...}}.

Input parameters:

- `dimensions` (array): GA4 realtime dimensions, e.g. unifiedScreenName, country, deviceCategory
- `metrics` (array): GA4 realtime metrics, e.g. activeUsers, screenPageViews, eventCount
- `property_id` (string): Numeric GA4 property id, as listed by ga4_properties; empty uses the configured GA4_PROPERTY_ID

### `ga4_properties` (~112 tokens)

GA4 properties

GA4 accounts and properties the authorized Google account can read (Admin API accountSummaries), so the
assistant can find a property id itself and pass it as property_id to ga4_report or ga4_realtime. Returns
{"properties": [{property_id, property_name, property_type, account_id, account_name, configured}],
"configured_property_id"}. Needs the Google Analytics Admin API enabled; no extra OAuth scope.

Input parameters:

- `max_pages` (integer): Pages of 200 accounts to read at most

### `gsc_performance` (~196 tokens)

Search Console performance

Google Search Console search performance for the configured property: clicks, impressions, CTR and average
position, split by query, page, country, device or date. Returns the top rows, "totals" for the whole period
(same filter, no split), "truncated", the unit and definition of each metric under "metrics", and a
"date_range" in Pacific Time (Search Console's timezone) with "data_complete".

Input parameters:

- `dimensions` (array): How to split the results
- `end_date` (string): YYYY-MM-DD; empty means 2 days ago (Search Console data lag)
- `limit` (integer): Maximum rows returned (1 to 1000); totals always cover the whole property
- `page_contains` (string): Optional: keep only pages whose URL contains this text
- `start_date` (string): YYYY-MM-DD; empty means 30 days ago (Pacific Time)

### `gsc_inspect_url` (~77 tokens)

Search Console URL inspection

Google index status of one URL (URL Inspection API): verdict, coverage state, user and Google-selected
canonical, robots.txt state, page fetch state and last crawl time. Quota: 2,000 inspections per day.

Input parameters:

- `url` (string, required): Full URL to inspect; must belong to the configured Search Console property

### `gsc_sitemaps` (~30 tokens)

Search Console sitemaps

Sitemaps declared in Search Console, with last submission, last download, errors and warnings.

### `merchant_data_sources` (~25 tokens)

Merchant Center data sources

Merchant Center data sources (feeds): labels, countries, languages, fetch URLs.

### `merchant_product_issues` (~147 tokens)

Merchant Center product issues

Merchant Center products with their item-level issues (disapprovals, demotions, warnings) per destination,
with the attribute to fix. Scans every page of products up to max_pages. Returns {"products": [{offer_id,
feed_label, title, link, issues: [{code, severity, description, attribute, destination}]}], "scanned": n,
"truncated": bool}.

Input parameters:

- `limit` (integer): Maximum products returned (1 to 1000)
- `max_pages` (integer): Pages of 250 products to scan at most
- `only_with_issues` (boolean): True: only products with at least one issue; False: every product

### `merchant_report_query` (~84 tokens)

Merchant Center report query

Run a Merchant Center report (Merchant API reports:search) with an MCQL query, for example product status
or free-listing performance. Returns Google's raw result rows.

Input parameters:

- `query` (string): Merchant Center Query Language (MCQL) statement. Tables include product_view (must select id) and product_performance_view (clicks, impressions by date or offer)

### `gtm_inventory` (~65 tokens)

Tag Manager inventory

Tags (type, paused, firing triggers, parameters), triggers and variables of the configured Google Tag Manager
container's default workspace, plus the id of the live published version. Built-in trigger ids are translated,
e.g. All Pages. Useful to spot a tag configured twice.

### `indexing_status` (~59 tokens)

Indexing API status

Latest Indexing API notifications (URL_UPDATED / URL_DELETED) Google holds for a URL. Read only: nothing is
submitted. Most URLs were never notified, which is reported as such.

Input parameters:

- `url` (string, required): Full URL to look up

### `pagespeed` (~83 tokens)

PageSpeed Insights

Lighthouse performance and SEO scores (0 to 100) plus LCP, CLS and TBT for a URL, and the Chrome UX Report
field category when Google has real-user data. Set PAGESPEED_API_KEY to avoid the shared anonymous quota.

Input parameters:

- `strategy` (string): Device profile Lighthouse emulates
- `url` (string, required): Full public URL to test

### `gads_accounts` (~98 tokens)

Google Ads accounts

Google Ads customer accounts the Google Ads token can read directly (customers:listAccessibleCustomers),
with the configured GADS_CUSTOMER_ID and GADS_LOGIN_CUSTOMER_ID (manager account), to pick a customer_id for
gads_performance or gads_query. Returns {"customers": [{"id"}], "configured_customer_id",
"login_customer_id", "cached"} (cached: true when the list comes from the 5-minute discovery cache).

### `gads_performance` (~297 tokens)

Google Ads performance

Google Ads performance by account, campaign or ad group over a date range: spend, impressions, clicks,
conversions, conversion value, CTR, CPC, CPA and ROAS, optionally split by date, device or network. Built from
fixed aggregated GAQL templates (searchStream), highest spend first. Returns "rows", "totals" (ROAS = sum of
values / sum of spends) with "totals_complete". start_date and end_date are required (empty -> invalid_dates), the "currency" (looked up when no row), a "date_range" in the
account timezone with "data_complete", the unit and definition of each metric, and the "attribution" used.

Input parameters:

- `customer_id` (string): Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the configured GADS_CUSTOMER_ID
- `end_date` (string): Required: last day, YYYY-MM-DD (account timezone)
- `level` (string): Row level: account, campaign or ad_group
- `limit` (integer): Maximum rows returned (1 to 1000), highest spend first; totals cover up to 10,000 rows (see totals_complete)
- `segment` (string): Optional split of each row: none, date, device or network
- `start_date` (string): Required: first day, YYYY-MM-DD (account timezone)

### `gads_query` (~560 tokens)

Google Ads GAQL query

Run a free read-only Google Ads Query Language (GAQL) SELECT on one customer (searchStream), for fields the
fixed gads_performance templates do not cover. Refused without any network call unless it is a single SELECT
with no ';' and no '--' or '/*' (refused even inside a string literal). The read is bounded: without LIMIT,
LIMIT 10001 is added (before PARAMETERS); a larger LIMIT is lowered to 10001; the answer is capped at 20 MB.
One SELECT and one FROM only, no JOIN, no backslash, ASCII only outside string literals. FROM and every dotted
name prefix in SELECT, WHERE and ORDER BY (besides metrics and segments) must be a reporting resource: customer, campaign, campaign_budget, ad_group, ad_group_ad,
ad_group_criterion, keyword_view, shopping_performance_view, product_group_view, asset_group,
asset_group_listing_group_filter, asset_group_asset, asset, ad_group_ad_asset_view, campaign_criterion,
geographic_view, gender_view, age_range_view, landing_page_view, expanded_landing_page_view,
display_keyword_view, topic_view, bidding_strategy, conversion_action, location_view, distance_view, with
customer.* limited to id, descriptive_name, currency_code, time_zone, status, manager, test_account and
resource_name; anything else is refused with resource_not_allowed. Names exposing personal data (change_event,
click_view, call_view, search term views, leads, user_*, payments_*, billing_*, customer_user_access, invoices,
account links, placements...) are
refused anywhere in the query with sensitive_resource. Setting GADS_ALLOW_SENSITIVE_QUERIES=1 in the server env
lifts both lists (personal data possible). Rows are flattened to GAQL field
names (campaign.name, metrics.clicks); micros fields are converted to currency units: *_micros renamed without
the suffix (metrics.cost_micros -> metrics.cost), metrics.average_cpc, average_cpm, average_cost and
cost_per_* kept under their name.

Input parameters:

- `customer_id` (string): Google Ads customer id (digits, dashes allowed), as listed by gads_accounts; empty uses the configured GADS_CUSTOMER_ID
- `gaql` (string, required): One read-only GAQL statement starting with SELECT, e.g. SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS; no ';', '--' or '/*' anywhere, even in a string
- `limit` (integer): Maximum rows returned (1 to 1000); Google is asked for at most 10,001 rows (LIMIT added or lowered)

### `meta_ad_accounts` (~55 tokens)

Meta ad accounts

List the Meta ad accounts the access token can read (id act_..., name, status, currency, timezone).

Use it to find the account id for META_AD_ACCOUNT_ID or for the account_id argument of meta_insights.

### `meta_insights` (~381 tokens)

Meta Ads insights

Meta Ads performance (spend, impressions, clicks, reach, purchases, purchase value, ROAS) by level.

ctr is recomputed as a ratio 0..1, ROAS = purchase value / spend (totals: sum of values / sum of spends),
Meta's own purchase_roas is kept raw in meta_reported_roas. Currency is the ad account's, never converted.

Input parameters:

- `account_id` (string): Ad account id (digits or act_<digits>); empty means META_AD_ACCOUNT_ID
- `attribution_windows` (array): Optional attribution windows for purchases (e.g. 7d_click); empty means Meta's default 7-day click + 1-day view; several windows give one figure per window, no single total
- `breakdowns` (array): Optional extra split of each row, from a fixed list: age, gender, country, region, publisher_platform, platform_position, device_platform, impression_device
- `date_preset` (string): Meta relative period (e.g. last_7d, last_month), exclusive with start_date/end_date; all three empty means last_28d
- `end_date` (string): YYYY-MM-DD, last day included; leave empty with start_date to use date_preset
- `level` (string): Row level: account (one row per period), campaign, adset or ad
- `limit` (integer): Maximum rows returned (1 to 500), highest spend first (daily rows too); totals cover up to 5 pages of 500 rows
- `start_date` (string): YYYY-MM-DD, first day in the ad account's timezone; leave empty with end_date to use date_preset
- `time_increment` (string): all_days: one row for the whole period; 1: one row per day

### `openai_ads_account` (~85 tokens)

OpenAI Ads account

OpenAI Ads (ChatGPT ads) ad account of the configured OPENAI_ADS_API_KEY (GET /v1/ad_account): only id,
name, status, currency and timezone when present; every other key is dropped and listed in raw_fields_dropped.
Use it as a connection test before openai_ads_insights. Cached 300 s ("cached": true).

### `openai_ads_insights` (~761 tokens)

OpenAI Ads insights

OpenAI Ads (ChatGPT ads) performance over a date range: impressions, clicks, spend, ctr, conversions and
attributed sales for the ad account or one campaign, ad group or ad. Returns "rows" as reported (flat keys such as
campaign_id; null kept, null_means "non calculable"), recomputed "totals" (roas = sum of sales / sum of spend),
"currency" (from order_created_attributed_sales_currency, else None), "date_range" in the timezone returned by
the API, "next_after" while has_more (reads up to max_rows rows over at most 5 pages), units (spend in major
currency units, ctr ratio) and "attribution". No automatic retry.

Input parameters:

- `after` (string): next_after (last_id) of a previous call to read the next rows; empty to start
- `aggregation_level` (string): Row entity inside the endpoint scope: ad_account, campaign, ad_group or ad; empty uses the endpoint level
- `attribution_time_basis` (string): ad_event_time (API default) or conversion_time; empty sends nothing
- `attribution_window_days` (integer): Click attribution window in days: 7, 14 or 30
- `before` (string): first_id of a previous call to read the rows before it (one page); not with after
- `end_date` (string, required): Last day, YYYY-MM-DD (inclusive)
- `entity_id` (string): Id of the campaign, ad group or ad (letters, digits, _ and -); empty for level account
- `fields`: Canonical field names, e.g. impressions, clicks, spend, ctr, cpc, cpm, conversions, cpa, post_click_cvr, order_created_attributed_sales, order_created_attributed_sales_currency, order_created_roas, c…
- `filters`: Optional filters, combined with AND: {"field": "campaign.id", "operator": "IN", "value": ["cmpn_1"]} or {"field": "ad.clicks", "operator": "GREATER_THAN" or "LESS_THAN", "value": 10} (at most 10)
- `include_zero_impression_items` (boolean): True: also return entities with zero impressions (only without a segment)
- `level` (string): Which endpoint: account = the whole ad account; campaign, ad_group or ad = one entity given by entity_id
- `max_rows` (integer): Maximum rows returned by this call (1 to 6000), over at most 5 pages
- `page_size` (integer): Rows per API page (1 to 2000)
- `segment` (string): Optional single segment: product, country, device or platform (request segment fields such as country.clicks)
- `sort`: Optional sort criteria in order: [{"field": "spend", "direction": "desc"}] (at most 5)
- `start_date` (string, required): First day, YYYY-MM-DD
- `time_granularity` (string): none: one row per entity for the period; daily, monthly or hourly (hourly: about 30 days of history, not with a segment)
- `timezone` (string): Optional IANA timezone of the day boundaries; empty uses the ad account timezone (keep empty for conversion or sales metrics, which require whole days in the account timezone)
- `view_through_attribution_window_days` (integer): View-through attribution window in days: 0 or 1

### `openai_ads_conversions` (~531 tokens)

OpenAI Ads conversions

OpenAI Ads (ChatGPT ads) conversion insights (POST /v1/conversions/insights, a read query): goal conversions
(click-through and view-through) and attributed order value per campaign, ad group or ad (entity_ids), or for the
whole account (group_by_entity false), over whole days in the account timezone. Returns "rows" (null kept),
recomputed "totals", "currency" (account_currency), "attribution" and "date_range". No pagination: more than
2000 rows answers too_many_rows (fewer entities, shorter period or fewer event_names). Warning: attributed event
details may contain order or user identifiers; only documented aggregate fields are kept.

Input parameters:

- `account_timezone` (string, required): IANA timezone of the ad account, e.g. Europe/Paris (the timezone column of openai_ads_insights): the API counts whole days in it
- `aggregation_level` (string, required): Required row entity: campaign, ad_group or ad
- `attribution_time_basis` (string): ad_event_time (API default) or conversion_time; empty sends nothing
- `attribution_window_days` (integer): Click attribution window in days: 7, 14 or 30
- `breakdown` (string): Optional breakdown: country or device; empty for none
- `end_date` (string, required): Last day, YYYY-MM-DD (inclusive)
- `entity_ids`: Ids of the entities of aggregation_level (1 to 100). Required when group_by_entity is true; must be empty when it is false
- `event_names`: Optional exact event names for the event details (requires include_attributed_events; here at most 20 names of 64 characters among letters, digits, _ . : -, stricter than the API)
- `group_by_entity` (boolean): True (API default): one row per entity of entity_ids; false: one row for the whole ad account (no entity_ids)
- `include_attributed_events` (boolean): True: add per-event aggregates (event_name, counts, value); may expose order or user identifiers, so only aggregate fields are kept
- `include_zero_rows` (boolean): True (API default): keep rows without conversions
- `start_date` (string, required): First day, YYYY-MM-DD (whole days, 365 days at most)
- `time_granularity` (string): none: period totals; daily: one row per day
- `view_through_attribution_window_days` (integer): View-through attribution window in days: 0 or 1

### `ads_overview` (~175 tokens)

Ads overview (all platforms)

Google Ads, Meta and OpenAI Ads totals side by side for one period: spend, impressions, clicks, conversions
and conversion value as reported by each platform, the platform's own ROAS, currency, attribution windows and
date range. A platform not configured or failing gets its own block without blocking the others (partial).
combined adds spends only when every currency is the same (else null with combined_reason; a platform without
activity adds zeros and needs no currency) and computes ROAS
as total value / total spend. Conversions overlap between platforms: their sum is not deduplicated (warning).

Input parameters:

- `end_date` (string, required): Last day, YYYY-MM-DD, on or after start_date
- `start_date` (string, required): First day, YYYY-MM-DD (each platform counts in its own account timezone)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/mooneyes-google-ecommerce-mcp/google-ecommerce-mcp#diagnostics

## Score history

- 2026-10-16: 85
- 2026-10-15: 87
- 2026-10-14: 71
- 2026-10-13: 50
- 2026-10-12: 24
- 2026-10-04: 82

## Common questions

### What is the Google E-commerce (GA4, Search Console, Merchant Center) MCP server?

Google E-commerce (GA4, Search Console, Merchant Center) is an MCP server listed in the public MCP registry as io.github.MoonEyes/google-ecommerce-mcp. Read-only GA4, Search Console, Merchant Center, Tag Manager, Indexing and PageSpeed for shops. This page covers its PyPI package (google-ecommerce-mcp).

### Is the Google E-commerce (GA4, Search Console, Merchant Center) MCP server safe to use?

Google E-commerce (GA4, Search Console, Merchant Center) scores 85 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 16 October 2026. Its build provenance is signed and verified. 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 Google E-commerce (GA4, Search Console, Merchant Center) MCP server expose?

Google E-commerce (GA4, Search Console, Merchant Center) exposes 22 tools: server_status, ga4_report, ga4_realtime, ga4_properties, gsc_performance, and 17 more. Their descriptions and schemas cost roughly 4,334 tokens of context every time the server is loaded.

### Is the Google E-commerce (GA4, Search Console, Merchant Center) MCP server still maintained?

Google E-commerce (GA4, Search Console, Merchant Center) is still listed as active in the MCP registry. We last reached this channel on 16 October 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 Google E-commerce (GA4, Search Console, Merchant Center) MCP server under?

Google E-commerce (GA4, Search Console, Merchant Center) declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/google-ecommerce-mcp/
- Socket report: https://socket.dev/pypi/package/google-ecommerce-mcp
- Repository: https://github.com/MoonEyes/google-ecommerce-mcp
- Changelog RSS feed: https://verifymcp.io/servers/mooneyes-google-ecommerce-mcp/google-ecommerce-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/mooneyes-google-ecommerce-mcp/google-ecommerce-mcp.json
- HTML version of this page: https://verifymcp.io/servers/mooneyes-google-ecommerce-mcp/google-ecommerce-mcp
