# Google Analytics 4 MCP (pypi · scalably-ga4-mcp)

Google Analytics 4 MCP: reports, realtime, funnels, pivots, metadata, admin lists. 17 tools.

- Trust score: 58/100 (low)
- Change this week: +5
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- mcpb · `ga4-mcp.mcpb`: 17/100, [markdown](https://verifymcp.io/servers/io-scalably-ga4-mcp/https-github-com-scalably-io-ga4-mcp-releases-download-v1-0-1-ga4-mcp-mcpb.md), [page](https://verifymcp.io/servers/io-scalably-ga4-mcp/https-github-com-scalably-io-ga4-mcp-releases-download-v1-0-1-ga4-mcp-mcpb)
- pypi · `scalably-ga4-mcp`: 58/100 (this document), [markdown](https://verifymcp.io/servers/io-scalably-ga4-mcp/scalably-ga4-mcp.md), [page](https://verifymcp.io/servers/io-scalably-ga4-mcp/scalably-ga4-mcp)

## Channel facts

- Registry: `pypi`
- Package: `scalably-ga4-mcp`
- Version: `1.0.1`
- 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-09-20.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it.
  - 0 of 46 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 10 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 72/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2383 tokens (~140/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 37/100
  - Stability observed for 11 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/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.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 17 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 17 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 Analytics 4 MCP server?

Google Analytics 4 MCP runs locally as a PyPI package, launched with uvx scalably-ga4-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 io-scalably-ga4-mcp -- uvx scalably-ga4-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "io-scalably-ga4-mcp": {
      "command": "uvx",
      "args": [
        "scalably-ga4-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-scalably-ga4-mcp": {
      "command": "uvx",
      "args": [
        "scalably-ga4-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add io-scalably-ga4-mcp -- uvx scalably-ga4-mcp
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add io-scalably-ga4-mcp --command uvx --arg scalably-ga4-mcp
```

### Hermes

```yaml
mcp_servers:
  io-scalably-ga4-mcp:
    command: "uvx"
    args: ["scalably-ga4-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "io-scalably-ga4-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "scalably-ga4-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-scalably-ga4-mcp -t stdio -c uvx -a scalably-ga4-mcp
```

### Other

```json
{
  "mcpServers": {
    "io-scalably-ga4-mcp": {
      "command": "uvx",
      "args": [
        "scalably-ga4-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-09-20 (score 58, +1)

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

### 2026-09-18 (score 57, +1)

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

### 2026-09-17 (score 56, +3)

- [functional improvement] Stability: unverified → 0.27

### 2026-09-09 (score 53)

First indexed and scored.

## MCP tools (17)

### `ga4_list_account_summaries` (~97 tokens)

List every GA4 account and its child properties accessible to this service account.

CALL THIS FIRST to discover which property_id to pass into other tools. The SA
only sees accounts/properties where its email has been explicitly added as a user.

Response: {"accounts": [{account, display_name, property_summaries: [...], ...}]}.
Each property_summary has property, display_name, property_type, parent.

Output parameters:

- `result` (string)

### `ga4_get_property_details` (~91 tokens)

Full metadata for a single GA4 property.

Returns display_name, property_type, parent account, time_zone, currency_code,
industry_category, service_level, delete_time, expire_time, account reference,
create_time, update_time.

property_id: numeric (e.g. "123456789") or resource (e.g. "properties/123456789").

Input parameters:

- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_list_data_streams` (~69 tokens)

List all data streams (web, iOS, Android) on a GA4 property.

Useful for finding the Measurement ID (web), firebase_app_id (mobile),
or the hostname of a web stream. Each stream has its creation/update timestamps.

Input parameters:

- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_list_custom_dimensions` (~87 tokens)

List custom dimensions configured on a GA4 property.

Each entry contains the parameter_name (how you query it, use prefix
'customEvent:' or 'customUser:' when passing to get_metadata / run_report),
display_name, scope (EVENT|USER|ITEM), and description. Essential grounding
before running reports that reference custom fields.

Input parameters:

- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_list_custom_metrics` (~47 tokens)

List custom metrics configured on a GA4 property.

Each entry: parameter_name, display_name, measurement_unit, scope, restricted_metric_type.

Input parameters:

- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_list_key_events` (~59 tokens)

List key events (formerly conversions) on a GA4 property.

These are the events the client has marked as conversion-worthy. Query
conversion metrics via `conversions` dimension or direct metric names.

Input parameters:

- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_list_audiences` (~94 tokens)

List audiences defined on a GA4 property.

Each audience has name, display_name, description, membership_duration_days,
ads_personalization_enabled, event_trigger, exclusion_duration_mode, filter_clauses.
Reference audienceId as a dimension in run_report for audience-based breakdowns.

NOTE: Uses Admin v1alpha since audiences are still alpha in April 2026.

Input parameters:

- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_list_google_ads_links` (~79 tokens)

List Google Ads links attached to a GA4 property.

Returns customer_id (the Ads account), can_manage_clients, ads_personalization_enabled,
and creator_email. Useful to confirm Ads ↔ GA4 cross-reporting availability before
querying Ads-related dimensions like sessionGoogleAdsCampaignId.

Input parameters:

- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_list_property_annotations` (~111 tokens)

List reporting annotations on a GA4 property.

Annotations are markers (user-added or Google-system) flagging important
events on a timeline: product launches, outages, marketing pushes, so
downstream analysis can correlate metric swings with known events.

Each annotation has: name, title, description, annotation_date,
annotation_date_range, color, creator_email, system_generated.

NOTE: Uses Admin v1alpha since annotations are still alpha in April 2026.

Input parameters:

- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_run_access_report` (~121 tokens)

Audit log of who-read-what on a GA4 property (last 12 months).

dimensions (common): userEmail, accessedPropertyName.
metrics: accessCount.
date_ranges: list of {start_date, end_date} (YYYY-MM-DD or relative). Defaults to last 7d.

Use cases: identify usage of GA4 data by staff, confirm SA activity, compliance audits.

Input parameters:

- `date_ranges`
- `dimensions`
- `limit` (integer)
- `metrics`
- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_get_metadata` (~131 tokens)

Fetch the full GA4 dimension + metric catalog for a property.

If property_id is omitted, returns the universal catalog (excludes
property-specific custom fields). Pass a property_id to include custom
dimensions and metrics like 'customEvent:foo' and 'customUser:signup_plan'.

Response: {"dimensions": [...], "metrics": [...]}. Each entry has api_name,
ui_name, description, category, custom_definition.

Call this before run_report when the agent is uncertain about field names:
GA4's catalog is large and custom fields require the property to resolve.

Input parameters:

- `property_id`

Output parameters:

- `result` (string)

### `ga4_run_report` (~481 tokens)

Run a GA4 standard report. The workhorse tool.

Args:
  property_id: numeric or 'properties/NNN'.
  dimensions: list of dimension api_names (e.g. ["country", "deviceCategory", "date"]).
    Custom dims require 'customEvent:' or 'customUser:' prefixes.
  metrics: list of metric api_names (e.g. ["activeUsers", "sessions", "totalRevenue"]).
  date_ranges: list of {start_date, end_date, name?}. Accepts 'YYYY-MM-DD',
    'NdaysAgo', 'today', 'yesterday'. Up to 4 ranges.
  dimension_filter / metric_filter: filter expression dicts. Shapes:
    {"filter": {"field_name": "country", "string_filter": {"value": "US"}}}
    {"and_group": {"expressions": [...]}}
    {"or_group": {"expressions": [...]}}
    {"not_expression": {...}}
  order_bys: list of {metric: {metric_name}, desc} or {dimension: {...}}.
  metric_aggregations: list of TOTAL|MINIMUM|MAXIMUM|COUNT.
  limit: max rows (hard cap 250000 per response).
  offset: pagination offset.
  keep_empty_rows: include rows where all metrics are zero.
  currency_code: override property default for revenue metrics.
  cohort_spec / comparisons: advanced specs (see REST docs).

Gotchas surfaced in response.metadata:
  \- samplingMetadatas: present if query was sampled (&gt; 10M events scanned)
  \- dataLossFromOtherRow: true if high-cardinality dims collapsed into "(other)"
  \- schemaRestrictionResponse: active thresholding rules
  \- subjectToThresholding: true if user-privacy thresholding dropped rows

propertyQuota always included so the agent can self-throttle.

Input parameters:

- `cohort_spec`
- `comparisons`
- `currency_code`
- `date_ranges`
- `dimension_filter`
- `dimensions`
- `keep_empty_rows` (boolean)
- `limit` (integer)
- `metric_aggregations`
- `metric_filter`
- `metrics`
- `offset` (integer)
- `order_bys`
- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_batch_run_reports` (~143 tokens)

Run up to 5 GA4 reports in a single round-trip.

requests: list of run_report-shaped dicts. Same top-level parameters as
ga4_run_report (minus property_id, inferred from the batch). Each entry
accepts: dimensions, metrics, date_ranges, dimension_filter, metric_filter,
order_bys, metric_aggregations, limit, offset, keep_empty_rows, currency_code.

Useful when the agent needs paired views (e.g. landing pages + referrers
for the same window) and wants them atomically + under one quota call.

Input parameters:

- `property_id` (string, required)
- `requests` (array, required)

Output parameters:

- `result` (string)

### `ga4_run_pivot_report` (~182 tokens)

Run a GA4 pivot report.

pivots: list of pivot specs, each with:
  \- field_names: list of dimension names to pivot on
  \- limit: max rows per pivot
  \- offset: pagination offset
  \- order_bys: list of OrderBy dicts (same shape as run_report's order_bys)
  \- metric_aggregations: list of TOTAL|MINIMUM|MAXIMUM|COUNT

Use when you want a 2D view: e.g. rows=date, columns=device, values=sessions.

Input parameters:

- `currency_code`
- `date_ranges`
- `dimension_filter`
- `dimensions`
- `keep_empty_rows` (boolean)
- `metric_filter`
- `metrics`
- `pivots`
- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_run_realtime_report` (~216 tokens)

Run a GA4 real-time report. Covers the last 30 minutes only.

IMPORTANT: realtime uses a SEPARATE, smaller dimension/metric catalog. Do NOT
pass 'date', 'totalRevenue', etc: they don't exist in realtime. Common dims:
'minutesAgo', 'country', 'deviceCategory', 'unifiedScreenName', 'eventName'.
Common metrics: 'activeUsers', 'screenPageViews', 'eventCount'.

minute_ranges: list of {start_minutes_ago, end_minutes_ago, name?}. Max 2
ranges. Values are 0-29 (0 = now, 29 = 30 min ago).

For historical / batch reports use ga4_run_report instead.

Input parameters:

- `dimension_filter`
- `dimensions`
- `limit` (integer)
- `metric_aggregations`
- `metric_filter`
- `metrics`
- `minute_ranges`
- `order_bys`
- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_check_compatibility` (~129 tokens)

Validate whether a dim/metric combo can be queried together. Cheap pre-flight.

compatibility_filter: 'COMPATIBLE' (default, returns only fields that work
with the provided selection) or 'INCOMPATIBLE' (returns only fields that
would conflict).

Use before run_report when composing exploratory queries, cheaper than
catching a GoogleAdsException after a big failed report.

Input parameters:

- `compatibility_filter` (string)
- `dimension_filter`
- `dimensions`
- `metric_filter`
- `metrics`
- `property_id` (string, required)

Output parameters:

- `result` (string)

### `ga4_run_funnel_report` (~246 tokens)

Run a GA4 funnel report. v1alpha, API surface may change.

funnel: {
  is_open_funnel: bool,
  steps: [
    {
      name: str,
      is_directly_followed_by: bool,
      filter_expression: FunnelFilterExpression,
      within_duration_from_prior_step: {seconds: int},
    }, ...
  ]
}
funnel_breakdown: {dimension_name, limit}, optional per-step breakdown.
funnel_next_action: {dimension_name, limit}, optional "what came after".

Use for drop-off analysis across a sequence of events. Behind an alpha flag
because Google can change the shape, check the Feb 2026 release notes if
this fails with a validation error.

Ref: https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1alpha/properties/runFunnelReport

Input parameters:

- `date_ranges`
- `dimension_filter`
- `funnel` (object, required)
- `funnel_breakdown`
- `funnel_next_action`
- `limit` (integer)
- `property_id` (string, required)
- `return_property_quota` (boolean)

Output parameters:

- `result` (string)

## Diagnostics

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

## Score history

- 2026-09-20: 58
- 2026-09-19: 57
- 2026-09-18: 57
- 2026-09-17: 56
- 2026-09-16: 53
- 2026-09-15: 53
- 2026-09-14: 53
- 2026-09-13: 53
- 2026-09-12: 53
- 2026-09-11: 53
- 2026-09-10: 53
- 2026-09-09: 53

## Common questions

### What is the Google Analytics 4 MCP server?

Google Analytics 4 MCP is listed in the public MCP registry as io.scalably/ga4-mcp. Google Analytics 4 MCP: reports, realtime, funnels, pivots, metadata, admin lists. 17 tools. This page covers its PyPI package (scalably-ga4-mcp).

### Is the Google Analytics 4 MCP server safe to use?

Google Analytics 4 MCP scores 58 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. 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 Analytics 4 MCP server expose?

Google Analytics 4 MCP exposes 17 tools: ga4_list_account_summaries, ga4_get_property_details, ga4_list_data_streams, ga4_list_custom_dimensions, ga4_list_custom_metrics, and 12 more. Their descriptions and schemas cost roughly 2,383 tokens of context every time the server is loaded.

### Is the Google Analytics 4 MCP server still maintained?

Google Analytics 4 MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 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 Analytics 4 MCP server under?

Google Analytics 4 MCP 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/scalably-ga4-mcp/
- Socket report: https://socket.dev/pypi/package/scalably-ga4-mcp
- Repository: https://github.com/scalably-io/ga4-mcp
- Website: https://scalably.io/mcp/ga4-mcp
- Changelog RSS feed: https://verifymcp.io/servers/io-scalably-ga4-mcp/scalably-ga4-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-scalably-ga4-mcp/scalably-ga4-mcp.json
- HTML version of this page: https://verifymcp.io/servers/io-scalably-ga4-mcp/scalably-ga4-mcp
