A Google Analytics 4 MCP server with read AND write access: reports, realtime, custom dimensions/metrics, key events, audiences, and Measurement Protocol.
GA4 MCP server has 8 tools with complete input schemas and descriptions. Naming follows verb_noun convention (list_, get_, run_, create_, archive_). Descriptions are present and contextual (avg ~120 chars), exceeding the 10-char minimum but below the 50-200 char LLM-optimized range. Parameter descriptions are present but terse. Output schemas are not explicitly documented in the source, responses are inferred from Google API client calls. Error handling is minimal; no recovery guidance or actionable error messages visible. Security: credentials injected via GOOGLE_APPLICATION_CREDENTIALS env var (correct pattern). No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE). Composition is sound, each tool has one responsibility, and discovery tools (list_account_summaries) guide multi-step workflows.
Archive (delete) a custom dimension. custom_dimension_id may be the numeric id or the full 'properties/NNN/customDimensions/MMM' name.
Create a custom dimension. parameter_name is the event parameter / user property key; scope is 'EVENT', 'USER' or 'ITEM'. display_name may contain only letters, numbers, underscores and spaces.
Get configuration details for one GA4 property (name, time zone, currency, industry, create time).
List every GA4 account and its properties the service account can see. Returns account name/id plus each property's display name and numeric id. Call this first to discover property ids for the other tools.
List custom dimensions defined on a GA4 property.
Output schemas not documented. Tools return Google API objects (Property, DataStream, etc.) but LLMs cannot see what fields to expect. Responses should document returned field names, types, and which fields are safe to chain into downstream tools.
No tool annotations despite clear risk levels. create_custom_dimension and archive_custom_dimension are marked WRITE/DESTRUCTIVE but lack readOnlyHint/destructiveHint annotations. Agents cannot distinguish safe reads from irreversible operations.
Minimal error handling. No recovery guidance visible. If a property_id is invalid or credentials fail, the LLM receives a raw exception. Should return actionable errors like 'Property not found. Call list_account_summaries() to discover valid property IDs.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
List the data streams (web/app) on a GA4 property. The stream id (last path segment of 'name') is needed by the Measurement Protocol secret tools.
Run a GA4 realtime report (last ~30 minutes). Example: metrics ['activeUsers'], dimensions ['country','unifiedScreenName'].
Run a GA4 report. metrics/dimensions are GA4 API names (e.g. metrics ['activeUsers','conversions'], dimensions ['date','sessionDefaultChannelGroup']). Dates accept YYYY-MM-DD or relative forms like '28daysAgo' / 'today'.
Parameter descriptions are terse (avg ~40 chars). 'The GA4 property ID' lacks format guidance. Should specify: 'The GA4 property ID (numeric like 123456789 or full resource name like properties/123456789)' to prevent LLM confusion.
run_report and run_realtime_report accept free-form metric/dimension strings. No enum constraints or validation. LLMs will hallucinate invalid GA4 API names. Should document valid metric/dimension names or provide a discovery tool.