Skip to main content
Glama
leonardosepulvedat

MCP Google Analytics Server

MCP Google Analytics Server

A Model Context Protocol (MCP) server for Google Analytics 4, providing comprehensive integration with both the Google Analytics Data API (for reading reports) and Measurement Protocol v2 (for sending events).

The GA4 MCP that reads AND writes. Most GA4 MCP servers (including Google's official one) are read-only. This one gives your AI agent the full loop: run reports and funnels, audit your setup (custom dimensions, key events, compatibility checks), send ecommerce and conversion events server-side, and verify them in the realtime report — 26 tools in one npx command.

Built for agencies too: every read tool accepts an optional propertyId, so one conversation can query all your clients' properties — no reconfiguration between clients. See Multi-Property Mode.

npm version npm downloads CI License: MIT

⚡ One-Click Install

You only need two values to start (same as any other GA4 MCP): the service account JSON and your property ID. Sending events is an optional extra.

Install MCP Server

Click Install in Cursor, then paste:

  1. GA_SERVICE_ACCOUNT_JSON — path to the downloaded key file, or the JSON itself

  2. GA_PROPERTY_ID — the numeric ID in GA4 Admin → Property Settings (e.g. 123456789)

That is enough to ask “users by country this week”. To also send events, add two more keys later (see Send events (optional)).

Related MCP server: GA4 MCP Server

💡 Keep reports small

Reports can get large. This server is designed with token optimization in mind:

  • All read tools default to 10 results - Adjust the limit parameter as needed

  • Use specific date ranges - Avoid querying years of data at once

  • Select only needed dimensions/metrics - Don't request everything

  • Check TOKEN_OPTIMIZATION.md for detailed best practices

See the dedicated Token Optimization Guide for strategies to minimize token usage.

🚀 Quick Start

See QUICKSTART.md for a 5-minute setup guide, or follow the installation steps below.

📦 Installation

Option 1: Install globally via npm

npm install -g mcp-google-analytics

Option 2: Use with npx (no installation needed)

npx mcp-google-analytics

🔧 Configuration

Start with two values. That unlocks reports, funnels, realtime, and property audits — everything most people need, and the same setup every other GA4 MCP asks for.

1. Service account key

  1. In Google Cloud Console, enable Google Analytics Data API.

  2. IAM & Admin → Service Accounts → Create. Download a JSON key.

  3. In GA4: Admin → Property Access Management → add the service account email as Viewer.

Use the file path or paste the JSON into GA_SERVICE_ACCOUNT_JSON.

2. Property ID

GA4 Admin → Property Settings → Property ID (numbers only, e.g. 123456789).

{
  "mcpServers": {
    "google-analytics": {
      "command": "npx",
      "args": ["-y", "mcp-google-analytics"],
      "env": {
        "GA_SERVICE_ACCOUNT_JSON": "/path/to/service-account.json",
        "GA_PROPERTY_ID": "123456789"
      }
    }
  }
}

You can now ask: “Show me active users by country this week.”

Send events (optional)

Only if you want the agent to record events (purchases, signups, custom events). Most GA4 MCPs cannot do this; it is extra, not required.

  1. GA4 Admin → Data Streams → your stream → copy Measurement ID (G-XXXXXXXXXX).

  2. Measurement Protocol API secrets → Create → copy the secret.

Add them next to the two values you already have:

"GA_MEASUREMENT_ID": "G-XXXXXXXXXX",
"GA_API_SECRET": "your-api-secret"

🏢 Multi-Property Mode (Agencies)

Every read tool accepts an optional propertyId argument that overrides the configured GA_PROPERTY_ID — so a single conversation can query any property the service account can access, with no reconfiguration between clients.

  1. Grant your service account "Viewer" access on each client's GA4 property (or at account level).

  2. Set only GA_SERVICE_ACCOUNT_JSON (GA_PROPERTY_ID becomes optional — if set, it acts as the default).

  3. Discover properties, then query any of them:

Show me all my accounts and properties          → ga_get_account_summaries
Compare last week's active users between the    → ga_run_report with propertyId "111111"
Acme property and the Globex property             and again with propertyId "222222"

propertyId accepts both 123456789 and properties/123456789. Event sending (Measurement Protocol) remains tied to the configured GA_MEASUREMENT_ID/GA_API_SECRET, since each data stream has its own secret.

🔌 Integration with Claude Desktop

Add to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "google-analytics": {
      "command": "npx",
      "args": ["-y", "mcp-google-analytics"],
      "env": {
        "GA_SERVICE_ACCOUNT_JSON": "/path/to/service-account.json",
        "GA_PROPERTY_ID": "123456789"
      }
    }
  }
}

Or if installed globally:

{
  "mcpServers": {
    "google-analytics": {
      "command": "mcp-google-analytics",
      "env": {
        "GA_SERVICE_ACCOUNT_JSON": "/path/to/service-account.json",
        "GA_PROPERTY_ID": "123456789"
      }
    }
  }
}

Restart Claude Desktop after updating the configuration.

🎯 Integration with Cursor

Add to your Cursor MCP settings file:

macOS/Linux: ~/.cursor/mcp.json Windows: %USERPROFILE%\.cursor\mcp.json

{
  "mcpServers": {
    "google-analytics": {
      "command": "npx",
      "args": ["-y", "mcp-google-analytics"],
      "env": {
        "GA_SERVICE_ACCOUNT_JSON": "/path/to/service-account.json",
        "GA_PROPERTY_ID": "123456789"
      }
    }
  }
}

Restart Cursor after updating the configuration.

🛠️ Available Tools

At a Glance

Reading data (Google Analytics Data API) — all read tools default to 10 rows to save tokens:

Tool

Purpose

Notes

ga_run_report

Custom reports with dimensions and metrics

Adjust limit as needed

ga_run_realtime_report

Real-time data (last 30 minutes)

Great for verifying sent events

ga_get_metadata

All available dimensions and metrics

Large response (500+ items), use sparingly

ga_list_accounts

List accessible GA accounts

ga_list_properties

List GA4 properties

Aggregates all accounts if no accountId

ga_get_property

Details of the configured property

ga_list_data_streams

Data streams of the property

Useful to find measurement IDs

ga_run_pivot_report

Pivot table reports

Responses can be very large

ga_run_funnel_report

Funnel analysis across event steps

Uses Data API v1alpha

ga_batch_run_reports

Multiple reports in one request

2–5 reports per batch recommended

ga_get_account_summaries

All accounts and properties in one call

Fastest way to discover IDs

ga_list_custom_dimensions

Custom dimensions of the property

Discover API names for reports

ga_list_custom_metrics

Custom metrics of the property

Discover API names for reports

ga_list_key_events

Key events (conversions) of the property

Know what counts as a conversion

ga_list_google_ads_links

Google Ads accounts linked to the property

ga_check_compatibility

Validate dimension/metric combos before reporting

Avoids wasted requests and error loops

Sending events (Measurement Protocol):

Tool

Purpose

ga_send_event

Any custom GA4 event with parameters

ga_validate_event

Test an event against the debug endpoint without recording it

ga_send_pageview

Page/screen views

ga_send_purchase

Ecommerce purchases with transaction and items

ga_send_login

User logins

ga_send_signup

User registrations

ga_send_view_item

Product/item detail views

ga_send_add_to_cart

Add-to-cart events

ga_send_begin_checkout

Checkout initiations

ga_send_refund

Full or partial refunds

Google Analytics Data API (Reading Data)

ga_run_report

Run custom reports with dimensions and metrics.

Common Dimensions: date, city, country, deviceCategory, browser, pagePath, eventName, sessionSource, sessionMedium, sessionCampaignName

Common Metrics: activeUsers, sessions, screenPageViews, conversions, totalRevenue, engagementRate, averageSessionDuration

Example:

{
  "dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
  "dimensions": [{"name": "city"}],
  "metrics": [{"name": "activeUsers"}],
  "limit": 10
}

ga_run_realtime_report

Get real-time data (last 30 minutes).

Example:

{
  "metrics": [{"name": "activeUsers"}],
  "dimensions": [{"name": "country"}],
  "limit": 10
}

ga_get_metadata

Get all available dimensions and metrics for your property.

Warning: Returns 500+ items. Use sparingly.

ga_list_accounts

List all GA accounts accessible to the service account.

ga_list_properties

List GA4 properties, optionally filtered by account ID.

ga_get_property

Get details about the configured property.

ga_list_data_streams

List data streams for the configured property.

ga_run_pivot_report

Run pivot table reports with row/column dimensions.

Example:

{
  "dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
  "dimensions": [{"name": "country"}, {"name": "deviceCategory"}],
  "metrics": [{"name": "activeUsers"}],
  "pivots": [{"fieldNames": ["deviceCategory"], "limit": 5}]
}

ga_run_funnel_report

Run funnel analysis to track user progression.

Note: Funnel reporting uses the Data API v1alpha channel (the only channel where Google exposes it). Each step matches an event: set eventName per step, or omit it to use the step's name as the event name. For advanced matching, pass a full filterExpression.

Example:

{
  "dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
  "funnelSteps": [
    {"name": "page_view"},
    {"name": "add_to_cart"},
    {"name": "begin_checkout"},
    {"name": "Purchase", "eventName": "purchase"}
  ]
}

ga_batch_run_reports

Run multiple reports in a single request.

Warning: Can return large datasets. Limit to 2-5 reports per batch.

ga_get_account_summaries

Get all accessible accounts with their properties in a single compact call. The fastest way to discover account and property IDs.

ga_list_custom_dimensions / ga_list_custom_metrics

List the custom dimensions and metrics defined for the property, including their API names (e.g., customEvent:plan_type) so you can use them in reports.

ga_list_key_events

List the key events (conversions) configured for the property — useful before building conversion reports or deciding which events to send.

List Google Ads accounts linked to the property.

ga_check_compatibility

Check whether a dimension/metric combination is valid before running a report, avoiding wasted requests and token-heavy error loops.

Example:

{
  "dimensions": [{"name": "city"}],
  "metrics": [{"name": "activeUsers"}],
  "compatibilityFilter": "COMPATIBLE"
}

Measurement Protocol (Sending Events)

Good to know:

  • Events take a few minutes to appear in standard reports, but show up almost immediately in the realtime report (ga_run_realtime_report).

  • Use ga_validate_event to test new events without recording them.

  • If you omit client_id, one is auto-generated per call. To have GA group several events (e.g., a cart-to-purchase flow) into the same session and user, pass the same client_id to every call.

ga_send_event

Send custom events to GA4.

Example:

{
  "events": [{
    "name": "button_click",
    "params": {
      "button_id": "cta_signup",
      "page": "/landing"
    }
  }],
  "user_id": "user123"
}

ga_validate_event

Validate events before sending (uses debug endpoint).

ga_send_pageview

Send page view events.

Example:

{
  "page_location": "https://example.com/products",
  "page_title": "Products",
  "user_id": "user123"
}

ga_send_purchase

Send ecommerce purchase events.

Example:

{
  "transaction_id": "T12345",
  "value": 99.99,
  "currency": "USD",
  "items": [{
    "item_id": "SKU123",
    "item_name": "Product Name",
    "price": 99.99,
    "quantity": 1
  }]
}

ga_send_login

Send login events.

ga_send_signup

Send user registration events.

ga_send_view_item

Send product/item detail view events. Completes the standard ecommerce funnel: view_itemadd_to_cartbegin_checkoutpurchase.

ga_send_add_to_cart

Send add-to-cart events.

ga_send_begin_checkout

Send checkout initiation events.

ga_send_refund

Send full or partial refund events. Use the same transaction_id as the original purchase; omit items for a full refund, include them for a partial one.

Example (partial refund):

{
  "transaction_id": "T12345",
  "currency": "USD",
  "value": 49.99,
  "items": [{"item_id": "SKU123", "quantity": 1}]
}

📖 Usage Examples

See EXAMPLES.md for practical usage examples in Spanish.

Example: Get users by country (last 7 days)

Show me active users by country for the last 7 days

Claude will use ga_run_report:

{
  "dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
  "dimensions": [{"name": "country"}],
  "metrics": [{"name": "activeUsers"}],
  "limit": 10,
  "orderBys": [{"metric": {"metricName": "activeUsers"}, "desc": true}]
}

Example: Track a purchase

Send a purchase event for order #12345, $99.99 USD

Claude will use ga_send_purchase:

{
  "transaction_id": "12345",
  "value": 99.99,
  "currency": "USD",
  "items": [{
    "item_id": "product_1",
    "item_name": "Example Product",
    "price": 99.99,
    "quantity": 1
  }]
}

Example: Validate an event before sending it

Recommended before wiring up any new event: the debug endpoint checks the payload without recording anything.

Validate this tutorial_complete event before we send it for real

Claude will use ga_validate_event:

{
  "client_id": "test.123",
  "events": [{
    "name": "tutorial_complete",
    "params": {"tutorial_id": "onboarding", "duration_seconds": 120}
  }]
}

The response lists validation messages; an empty list means the event is well-formed.

Example: Server-side conversion tracking

Track signups or logins that happen in your backend, where no JavaScript tag runs:

A user just registered with Google OAuth, record the signup in Analytics

Claude will use ga_send_signup:

{
  "user_id": "user_789",
  "method": "Google"
}

Example: Full ecommerce funnel from an agent

Send the same client_id on each call so GA groups the events into one session:

Track this user's journey: they added a $49 course to the cart, started checkout, and completed the purchase

Claude will chain ga_send_add_to_cartga_send_begin_checkoutga_send_purchase, reusing the client ID:

{
  "client_id": "555.1717000000",
  "currency": "USD",
  "value": 49,
  "items": [{"item_id": "course_101", "item_name": "Intro Course", "price": 49, "quantity": 1}]
}

Example: Custom events from automations

Measure things GA never sees natively, like AI agent activity or scheduled jobs:

Log that the weekly report generator ran successfully

Claude will use ga_send_event:

{
  "events": [{
    "name": "automation_run",
    "params": {"job": "weekly_report", "status": "success", "duration_ms": 5400}
  }]
}

Example: Send and verify in one conversation

Combine both APIs to confirm your tracking works end to end:

Send a test event and confirm Analytics received it

Claude will call ga_send_event, then check with ga_run_realtime_report:

{
  "dimensions": [{"name": "eventName"}],
  "metrics": [{"name": "eventCount"}],
  "limit": 10
}

Measurement Protocol events appear in the realtime report within seconds, while standard reports can take a few minutes.

🔍 Debugging

Enable debug logging by setting:

export DEBUG=mcp-google-analytics:*

For Measurement Protocol, use ga_validate_event to check events before sending them live.

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

📄 License

MIT License - see LICENSE file for details.

🆘 Support

For issues and questions:

📝 Changelog

See CHANGELOG.md for version history.


Available Tools

26 tools
ga_batch_run_reportsA
Read-onlyIdempotent

Run multiple reports in a single request.

⚠️ TOKEN OPTIMIZATION: Can return LARGE amounts of data. Limit to 2-5 reports per batch. Each report should have small limits.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestsYesArray of report requests (same format as ga_run_report)
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by warning that responses can be LARGE and recommending batch-size limits. However, it does not disclose response format, error behavior, or rate limits, so it stays at a moderate transparency level.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately short: a clear purpose statement followed by a focused warning. The core action is front-loaded, and every sentence earns its place without repeating schema or annotation content. This is exemplary conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description leaves the batch response shape unspecified and does not explain how partial failures or errors across multiple reports behave. It covers the main invocation constraints—batching, limits, and token safety—so an agent can call it, but it is not fully complete for an unfamiliar agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning beyond the schema by advising that each batch should contain 2-5 reports and that each report should have small limits to avoid excessive data. This is genuinely useful parameter-level guidance that the input schema does not provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Run multiple reports in a single request." This clearly distinguishes the tool from single-report siblings like ga_run_report, ga_run_realtime_report, ga_run_pivot_report, and ga_run_funnel_report. The batch nature is explicit and leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the primary use case—batching multiple report requests—but it does not explicitly contrast with ga_run_report for single reports or other report variants. The token optimization warning provides practical guidance (limit to 2-5 reports, keep limits small), but there is no explicit when/when-not or alternative-selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_check_compatibilityA
Read-onlyIdempotent

Check whether a combination of dimensions and metrics is valid for this property BEFORE running a report.

Avoids wasted report requests and token-heavy error loops. Also lists which other fields remain compatible with the given combination.

ParametersJSON Schema
NameRequiredDescriptionDefault
metricsNoMetrics to check (e.g., [{name: "activeUsers"}])
dimensionsNoDimensions to check (e.g., [{name: "city"}])
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.
compatibilityFilterNoOnly return fields with this compatibility (recommended: COMPATIBLE)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, open-world, and non-destructive behavior. The description adds useful behavioral context: it avoids wasted report requests and error loops, and it lists which other fields remain compatible. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences that front-load the primary purpose and then add a concrete benefit plus an extra output behavior. Every sentence earns its place with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential selection and invocation context: property validity, dimensions, metrics, compatibility filter, and the benefit of avoiding failed report requests. It mentions the extra output of compatible fields, but with no output schema, the response format is not detailed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already includes a helpful description with examples. The tool description itself adds no parameter-level semantics beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Check whether a combination of dimensions and metrics is valid for this property'. It also explicitly positions itself as a pre-report validation step, which clearly differentiates it from ga_run_report and other report-related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit timing guidance with 'BEFORE running a report', making the intended use case clear. It does not name sibling alternatives directly or state when not to use it, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_get_account_summariesA
Read-onlyIdempotent

Get a compact overview of all accessible GA accounts and their properties in a single call.

The fastest way to discover account IDs, property IDs, and property names.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful context about the 'compact overview' scope and single-call efficiency, though it does not detail response shape, ordering, or whether results are paginated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no wasted words. The first sentence states exactly what the tool does, and the second reinforces its primary use case and output value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only discovery tool, the description is complete: it names the resource scope, the single-call nature, and the key output fields. The annotations cover safety and idempotence, so no critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so there are no parameter semantics to explain. The description correctly avoids inventing parameter guidance, matching the baseline for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get a compact overview of all accessible GA accounts and their properties in a single call.' It also clarifies the concrete value delivered: 'account IDs, property IDs, and property names.' This clearly distinguishes it from siblings like ga_list_accounts and ga_list_properties by emphasizing a compact, single-call aggregate view.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description frames usage as the fastest way to discover account and property IDs/names, which gives clear context on when to call it. It does not explicitly name alternatives or say when not to use it, but the intended discovery use case is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_get_metadataA
Read-onlyIdempotent

Get available dimensions and metrics metadata for your GA4 property.

⚠️ TOKEN OPTIMIZATION: This returns ALL available dimensions and metrics. Response can be large (~500+ items). Use sparingly and cache results when possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive. The description adds meaningful behavioral context beyond that: the response is intentionally complete ('ALL available dimensions and metrics'), can be around 500+ items, and should be cached/sparingly used. This is valuable operational disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short blocks: a one-sentence purpose followed by a focused warning. It is front-loaded, contains no filler, and every sentence contributes either to selecting the tool or using it responsibly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter read-only tool with fully documented schema, the description gives the essential context: what the tool returns, that the response is large, and that results should be cached. The absence of an output schema means some return-format details are unspecified, but this is a minor gap given the simplicity of the operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents propertyId thoroughly, including accepted formats and a discovery hint via ga_get_account_summaries, and schema coverage is 100%. The description itself adds no parameter-level detail, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Get available dimensions and metrics metadata for your GA4 property.' It clearly distinguishes this from siblings such as ga_list_custom_dimensions and ga_list_custom_metrics, which concern custom definitions, and ga_run_report, which executes queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The token-optimization note tells the agent when to be cautious and to cache results, which is useful operational guidance. However, it does not explicitly state when to choose this tool over alternatives or when not to use it, so selection guidance is only implied by the purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_get_propertyA
Read-onlyIdempotent

Get details about a GA4 property (the configured one, or any accessible property via propertyId).

ParametersJSON Schema
NameRequiredDescriptionDefault
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds the useful scope behavior (configured default vs. propertyId override), but no further behavioral details such as response shape or access requirements. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single concise sentence that front-loads the action and immediately clarifies both default and override behavior. No filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only, one-optional-parameter tool with rich annotations and full schema coverage, the description is nearly complete. It explains the default target and override mechanism, though it leaves the exact content of 'details' unspecified, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage of the single optional propertyId parameter, including the default override behavior and accepted formats. The description itself only mentions propertyId in passing, so it adds no semantic value beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb-resource pair: 'Get details about a GA4 property'. It also signals the scope (configured property or any accessible one via propertyId), which helps distinguish it from list-oriented siblings like ga_list_properties, though it does not name them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful context: the tool fetches the configured GA4 property by default or a specific property via propertyId. However, it does not explicitly state when to prefer this over alternatives such as ga_list_properties or ga_get_account_summaries, nor does it mention exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_list_accountsA
Read-onlyIdempotent

List all Google Analytics accounts accessible to the service account.

Use this to find account IDs for listing properties.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and idempotent behavior. The description adds useful context by clarifying that the listing is scoped to the service account's accessible accounts and that 'all' accounts are returned. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The core behavior is front-loaded before the usage pointer, and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with comprehensive annotations, this is complete. It conveys the output intent (account IDs) and the workflow context, and no missing detail would prevent an agent from calling it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the schema is complete by default. The description's mention of account IDs is about output intent and workflow, not input semantics, so the baseline score of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List all Google Analytics accounts accessible to the service account.' This clearly defines the tool's scope at the account level and even explains its purpose (finding account IDs for listing properties), distinguishing it from property/data-stream/reporting siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when this tool fits: to find account IDs before listing properties. It does not name alternatives or exclusions, such as ga_get_account_summaries, so it falls short of a 5, but the usage context is unmistakable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_list_custom_dimensionsA
Read-onlyIdempotent

List all custom dimensions defined for the configured GA4 property.

Use this to discover custom dimension API names (e.g., "customEvent:plan_type") for reports.

ParametersJSON Schema
NameRequiredDescriptionDefault
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds a useful purpose hint (API-name discovery for reports) but does not disclose return shape, ordering, or pagination, which leaves some behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the primary action first and the practical use case second. Every sentence earns its place; there is no repetitive or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-optional-parameter read-only listing tool, the description covers the resource, scope, and practical purpose. It does not detail return values beyond the API-name example, but the simple read-only nature and full schema make this a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, propertyId, is fully documented in the schema (format, override behavior, and discovery via ga_get_account_summaries), so schema description coverage is 100%. The tool description itself adds little parameter-level meaning beyond the example output value, hence the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb-resource pairing: 'List all custom dimensions defined for the configured GA4 property.' It clearly distinguishes the tool's scope from sibling tools such as ga_list_custom_metrics by naming the exact GA4 resource being listed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to discover custom dimension API names (e.g., "customEvent:plan_type") for reports' gives a concrete reason to invoke the tool. It does not say when not to use it or point to alternatives, so it stops short of a full routing guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_list_custom_metricsA
Read-onlyIdempotent

List all custom metrics defined for the configured GA4 property.

Use this to discover custom metric API names for reports.

ParametersJSON Schema
NameRequiredDescriptionDefault
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds some context about the configured property and the API-name output, but it does not disclose pagination, limits, or other behavioral quirks; this is acceptable but not exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The action and scope are front-loaded, and the use-case sentence earns its place by explaining why an agent would call the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional, well-documented parameter, the description is nearly complete. Without an output schema, it helpfully states that the result surfaces custom metric API names for reports, though a bit more detail about the response shape would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema documents propertyId fully, including accepted formats and how to discover IDs, with 100% schema description coverage. The description adds no parameter-specific detail, so the schema bears the load and the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List all custom metrics defined for the configured GA4 property', a specific verb and resource that clearly distinguishes it from sibling tools such as ga_list_custom_dimensions and ga_list_key_events. It immediately tells the agent what object is acted on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence, 'Use this to discover custom metric API names for reports', provides a clear intended use case. It does not explicitly mention when not to use it or name alternatives, but the context is concrete enough to route an agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_list_data_streamsA
Read-onlyIdempotent

List data streams for the configured GA4 property.

Use this to find measurement IDs for Measurement Protocol.

ParametersJSON Schema
NameRequiredDescriptionDefault
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds context that the tool is the path to measurement IDs, but does not disclose additional behavioral details such as pagination, quotas, or error conditions; given the rich annotations, this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences carry clear action, scope, and purpose with no filler. The main statement is front-loaded and the usage hint follows immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter read-only list tool, the description is sufficient: it names the resource, the default scope, the override, and the intended use. The return value is strongly implied through 'find measurement IDs,' so the lack of an output schema does not create a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the propertyId parameter is already well documented with format, default behavior, and discovery guidance. The tool description itself does not need to add parameter detail, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'List data streams for the configured GA4 property.' It also gives a concrete downstream purpose (finding measurement IDs for Measurement Protocol), which distinguishes this listing tool from sibling tools that list accounts, properties, dimensions, metrics, or key events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it: when measurement IDs are needed for Measurement Protocol. It does not name exclusions or alternatives, but the use case is clear enough for an agent to select this over sibling list tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_list_key_eventsA
Read-onlyIdempotent

List the key events (conversions) configured for the GA4 property.

Useful to know which event names count as conversions before building reports or sending events.

ParametersJSON Schema
NameRequiredDescriptionDefault
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is fully covered. The description adds little beyond restating the tool's purpose; no pagination, return format, or error behavior is disclosed, but given the strong annotations this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff. The action is front-loaded, and the usage context is a natural second sentence that earns its place. Nothing is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing tool with a single optional parameter and strong annotations, the description is complete. It could mention that propertyId defaults to GA_PROPERTY_ID, but the schema already covers that. No output schema exists, but the description gives enough context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with propertyId fully documented including accepted formats and a pointer to ga_get_account_summaries. The description adds no extra parameter meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'List the key events (conversions) configured for the GA4 property.' This precisely distinguishes it from sibling tools like ga_list_data_streams or ga_list_custom_dimensions, and the parenthetical '(conversions)' disambiguates the concept immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gives clear context: this is useful before building reports or sending events, so an agent knows when to call it. It doesn't explicitly mention when not to use it or name alternatives, but the context is specific enough that no exclusion is strictly needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_list_propertiesA
Read-onlyIdempotent

List Google Analytics properties.

Optionally filter by account ID. Without an account ID, properties from all accessible accounts are aggregated.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdNoOptional account ID to filter properties (e.g., "123456789")

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare this tool read-only, idempotent, non-destructive, and open-world. The description adds behavioral context beyond those annotations: without an account ID, properties from all accessible accounts are aggregated; with one, results are filtered. It does not mention pagination or auth specifics, but those are unnecessary for this simple listing operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two short sentences: the first states the purpose directly, and the second explains the optional filtering behavior. Every sentence earns its place, there is no repetition of the schema, and the key usage information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity, one optional parameter, rich annotations, and complete schema coverage, the description fully equips an agent to invoke the tool correctly. It states what the tool does and exactly how the optional parameter affects the result, with nothing essential missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents accountId as an optional filter with an example. The description reinforces the optional filtering behavior but adds little semantic value beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource, 'List Google Analytics properties', making the tool's function immediately identifiable. It also explains the optional account ID filter and the aggregation behavior, which clearly distinguishes it from account-level or single-property siblings like ga_list_accounts and ga_get_property.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains when to supply an account ID and what happens when it is omitted, providing a decision rule for the caller. It does not explicitly name alternative tools or state when not to use this tool, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_run_funnel_reportA
Read-onlyIdempotent

Run a funnel analysis report to track user progression through steps (Data API v1alpha).

Each step matches an event: set 'eventName' per step (defaults to the step name). For advanced matching, pass a full 'filterExpression' instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateRangesYes
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.
funnelStepsYesSteps in the funnel
funnelBreakdownNoOptional dimension to break down funnel
funnelVisualizationTypeNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral context on how steps map to events, the eventName default, and the filterExpression override, which goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states what the tool does in the first sentence and immediately provides the most important step-matching behavior in the second. Every sentence contributes useful information without unnecessary filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the nested schema and lack of an output schema, the description is adequate for invoking the tool but leaves gaps: it doesn't describe what the funnel report output contains, pagination, or how to choose among the many report siblings. The schema and annotations cover the core invocation details, so this is not severely incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds slight interpretive value for funnelSteps, especially the per-step eventName default and filterExpression override, but much of this is already present in the input schema. Other parameters like dateRanges, funnelBreakdown, and funnelVisualizationType receive no additional clarification beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Run') and the resource ('a funnel analysis report') with a specific goal ('track user progression through steps'). It also identifies the API version. While it doesn't explicitly contrast with sibling ga_run_report, the funnel-specific wording makes it reasonably distinguishable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the funnel-report framing and by the step-matching explanation, but there is no explicit when-to-use or when-not-to-use guidance. Alternatives such as ga_run_report, ga_run_pivot_report, or ga_run_realtime_report are not mentioned, leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_run_pivot_reportA
Read-onlyIdempotent

Run a pivot table report with row and column dimensions.

⚠️ TOKEN OPTIMIZATION: Pivot reports can be VERY large. Limit dimensions and use small date ranges. Recommended for analysis, not raw data extraction.

ParametersJSON Schema
NameRequiredDescriptionDefault
pivotsYesPivot specifications with fieldNames
metricsYes
dateRangesYes
dimensionsNo
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already cover read-only and idempotent behavior. The description adds useful behavioral context beyond the schema by warning that pivot reports can be VERY large and that token usage should be managed by limiting dimensions and date ranges. This is important operational guidance an agent would not get from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two short sentences, front-loaded with the core purpose and followed by a high-value warning. Every sentence earns its place, and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 5 parameters, no output schema, and no description of return values or pivot structure, making this incomplete for confident invocation. It does not clarify the relationship between the 'dimensions' and 'pivots' parameters, nor does it explain when to use this tool versus ga_run_report. The token-optimization warning is valuable, but it does not fill the structural gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 40%, and the description does not compensate by clarifying the missing parameters. It gives high-level advice to limit dimensions and date ranges, but does not explain how pivots map to row/column dimensions, what metrics should contain, or how fieldNames in pivots work. The description adds strategic guidance but not enough parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'Run a pivot table report with row and column dimensions.' This distinguishes it from ga_run_report and ga_run_realtime_report at a basic level, though it does not explicitly name those siblings or explain the exact difference beyond the pivot-table concept.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: pivot reports are for analysis, not raw data extraction, and should use limited dimensions and small date ranges. It does not explicitly name alternative tools like ga_run_report for raw extraction, but the guidance is actionable enough for an agent to select the right use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_run_realtime_reportA
Read-onlyIdempotent

Get real-time Google Analytics data (last 30 minutes).

⚠️ TOKEN OPTIMIZATION: Use 'limit' to control result size (default: 10).

Common dimensions: city, country, deviceCategory, unifiedScreenName Common metrics: activeUsers, screenPageViews, conversions

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of rows (default: 10)
metricsYesMetrics to measure
dimensionsNoDimensions to group by
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful context about the 30-minute recency window and token optimization, but does not disclose response shape, potential rate limits, or pagination behavior. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose. The token-optimization note and common dimension/metric lists are concise and earn their place. There is no redundant or vague filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With four parameters, no output schema, and strong annotations, the description provides enough guidance to invoke the tool: real-time scope, common fields, and limit usage. It does not explain the return value format or detail how metrics/dimensions should be structured, but these gaps are partially mitigated by the schema and examples.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by listing common dimensions and metrics (city, country, activeUsers, conversions) that are not present in the schema, helping the agent form valid queries. It also reinforces limit's purpose, though the schema already documents the default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get real-time Google Analytics data (last 30 minutes).' This clearly identifies both the action and the exact time scope, and the real-time distinction differentiates it from siblings like ga_run_report. The purpose is immediately understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states this is for real-time data within the last 30 minutes, giving the agent context on when to select this tool. It also provides practical guidance on using 'limit' for token optimization. However, it does not explicitly contrast this with historical reporting tools like ga_run_report or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_run_reportA
Read-onlyIdempotent

Run a custom Google Analytics report with dimensions and metrics.

⚠️ TOKEN OPTIMIZATION: Use 'limit' to control result size (default: 10). This tool can consume significant tokens with large datasets.

Common dimensions: date, city, country, deviceCategory, browser, pagePath, eventName Common metrics: activeUsers, sessions, screenPageViews, conversions, totalRevenue

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of rows to return (default: 10)
offsetNoNumber of rows to skip (for pagination)
metricsYesMetrics to measure (e.g., [{name: "activeUsers"}])
orderBysNoSorting specification
dateRangesYesDate ranges for the report
dimensionsNoDimensions to group by (e.g., [{name: "date"}])
propertyIdNoGA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs.
metricFilterNoMetric filter expression
dimensionFilterNoDimension filter expression

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds a meaningful behavioral dimension by warning that large datasets can consume significant tokens and recommending the 'limit' parameter. This goes beyond the structured annotations and is practically important for an agent invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured. It front-loads the purpose, follows with an important token warning, and then provides useful examples. Every sentence contributes meaningful information without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 9 parameters, nested objects, and many related sibling tools, the description is somewhat thin. It does not explain output format, pagination semantics, or when to choose this over related report tools. The schema and annotations compensate for parameter details, but the description alone leaves gaps in selection and expected results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by listing common dimensions and metrics, which helps the agent choose valid field names for the 'dimensions' and 'metrics' parameters. It also reinforces the 'limit' default behavior, which is already in the schema but given practical emphasis.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the core action: 'Run a custom Google Analytics report with dimensions and metrics.' This identifies the verb, resource, and scope. It does not explicitly differentiate from sibling report tools like ga_run_realtime_report, ga_run_pivot_report, or ga_run_funnel_report, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no direct guidance on when to use this tool versus alternatives such as realtime, pivot, funnel, or batch report tools. The token-optimization warning implies careful use for large datasets, but it does not state selection criteria or exclusions. Sibling tool names are available in context, but the description itself does not leverage them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_add_to_cartA

Send an add to cart event to Google Analytics.

Ecommerce event for tracking when items are added to shopping cart.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesItems added to cart
valueYesTotal value of items added
user_idNo
currencyYesCurrency code
client_idNo
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the tool is non-read-only, non-idempotent, and non-destructive. The description adds the ecommerce event context but does not disclose additional behavioral traits such as authentication requirements, rate limits, or whether user_id versus client_id is required. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with the key action front-loaded. The second sentence is slightly redundant but adds the valuable ecommerce context, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a send-event tool with a rich nested input schema, the description is adequate but lean. It does not explain the relationship between required fields, the role of user_id/client_id, or what the tool returns, and there is no output schema to compensate. The detailed input schema prevents this from being a lower score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, so the schema already documents most top-level parameters. The description does not add meaningful semantics beyond what the schema provides; for instance, user_id and client_id remain undocumented, and the description only echoes that items are being added to the cart.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Send an add to cart event'), the target ('Google Analytics'), and the specific event type. The second sentence reinforces that this is an ecommerce event for cart additions, which differentiates it from purchase, login, signup, and other sibling event tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear trigger context: use when items are added to a shopping cart, and it identifies the event as ecommerce. It does not explicitly name alternatives like ga_send_event or ga_send_purchase, but the usage context is clear enough to infer the intended scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_begin_checkoutA

Send a begin checkout event to Google Analytics.

Ecommerce event for tracking when users start the checkout process.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesItems in checkout
valueYesTotal value of cart
couponNoCoupon code applied
user_idNo
currencyYesCurrency code
client_idNo
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark this as non-read-only and non-idempotent, and the description's 'Send' makes the outbound write nature clear. However, the description adds little beyond that—no mention of auth requirements, duplicate-event risk, or the Google Analytics side effects beyond sending the event.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences that lead with the core action and follow with the event's purpose. There is no filler or redundant detail, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward event-sending tool, the description gives the event type, timing, and purpose. The schema covers the nested item structure and required parameters. It would be improved by noting when not to use it (e.g., use ga_send_purchase for completed checkout), but the description is otherwise sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides no parameter-level guidance beyond what the schema already states. With 71% schema coverage, most parameters are documented, but user_id and client_id remain unexplained, and the description does not compensate for those gaps or add meaning to the required fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Send a begin checkout event to Google Analytics') and supplies the event's purpose ('tracking when users start the checkout process'). This is specific enough to distinguish from sibling tools like ga_send_purchase or ga_send_add_to_cart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gives clear usage context: use this event when a user starts checkout. It does not explicitly call out sibling alternatives or exclusions, but the timing and event semantics are clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_eventA

Send a custom event to Google Analytics via Measurement Protocol.

Use this for tracking custom user actions, conversions, or any GA4 event. Events are processed asynchronously and appear in reports within minutes.

Common events: click, form_submit, video_play, file_download, custom_conversion

ParametersJSON Schema
NameRequiredDescriptionDefault
eventsYesEvents to send (can send multiple in one request)
user_idNoOptional User ID for cross-device tracking
client_idNoClient ID (UUID format recommended). Auto-generated if not provided.
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey that this is not read-only and not idempotent. The description adds meaningful behavioral context: events are processed asynchronously and appear in reports within minutes, helping the agent set expectations about immediate vs delayed effects. It does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded, and avoids redundancy. Three short paragraphs each serve a purpose: what the tool does, when to use it, and what behavior to expect.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a moderately complex tool with four parameters and a rich schema, the description is mostly complete. It covers the purpose, usage, async behavior, and event examples; it could be stronger by explicitly routing to specialized senders, but that is a minor gap given the sibling names.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds modest value by listing common event name examples, but it does not substantially expand on user_id, client_id, or user_properties semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Send a custom event to Google Analytics via Measurement Protocol,' a specific verb plus resource. It further clarifies by listing common custom events like click, form_submit, and custom_conversion, which distinguishes this generic sender from specialized siblings such as ga_send_purchase and ga_send_pageview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states 'Use this for tracking custom user actions, conversions, or any GA4 event,' giving clear usage context. It does not explicitly mention when to prefer specialized siblings like ga_send_purchase or ga_send_login, so it stops short of full exclusions/alternatives guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_loginB

Send a login event to Google Analytics.

Standard event for tracking user logins with authentication method.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodYesLogin method (e.g., "Google", "Email", "Facebook")
user_idNoUser ID (recommended for login events)
client_idNo
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey that this is a non-read-only, non-idempotent operation. The description adds little behavioral context beyond restating that it sends a login event; it does not mention side effects, requirements, or consequences such as what data is transmitted or whether a successful send returns anything.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the core action. No filler, redundant sections, or unnecessary technical detail; the description earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward event-sending tool, the description plus schema cover the essentials: what it sends and the required method. However, it lacks usage-alternative guidance, behavioral caveats, and any indication of return value or output, leaving moderate ambiguity for an agent selecting among many event-sending siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, with client_id left undescribed, and the description does not compensate for that gap. Mentioning 'authentication method' loosely echoes the method parameter, but adds no meaning beyond the schema's existing description of method.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action and resource: sending a login event to Google Analytics. It identifies the event type as 'login,' which distinguishes it from broader siblings like ga_send_event or ga_send_signup, though it does not explicitly name or contrast them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Standard event for tracking user logins' provides clear context for when the tool should be used. It does not explicitly list alternatives or exclusions, but the login-specific framing makes the intended use case obvious among the many send_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_pageviewA

Send a page view event to Google Analytics.

Standard event for tracking page/screen views. Automatically uses 'page_view' event name.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNoOptional User ID
client_idNoClient ID (auto-generated if not provided)
page_titleNoPage title
page_locationYesFull URL of the page
page_referrerNoReferrer URL
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a non-read-only, non-idempotent operation. The description adds a useful behavioral detail by noting that the 'page_view' event name is applied automatically, but it does not elaborate on send-specific side effects beyond what annotations imply. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff. The core action is front-loaded, and the second sentence adds the two key pieces of context: standard use case and automatic event name. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward send-event tool, the description plus a fully documented schema and relevant annotations provide enough to call it correctly. It lacks explicit sibling differentiation and return-behavior information, but no output schema exists and the operation is simple, so the definition is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides descriptions for all six parameters, so the baseline is 3. The description does not add parameter-level detail; the only added insight is that the event name is fixed, which is informative but not tied to any specific parameter beyond clarifying why no event_name parameter exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Send') and resource ('page view event to Google Analytics'), and characterizes it as the 'standard event for tracking page/screen views.' This makes the tool's purpose immediately obvious, though it does not explicitly contrast it with sibling tools such as ga_send_event or ga_send_purchase.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Standard event for tracking page/screen views' gives clear guidance on when to use this tool: for page and screen view tracking. It does not, however, explicitly mention alternatives or state when not to use it (e.g., for custom events use ga_send_event), so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_purchaseA

Send an ecommerce purchase event to Google Analytics.

Standard event for tracking completed purchases with transaction details and items.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxNoTax amount
itemsYesPurchased items
valueYesTotal purchase value
couponNoCoupon code used
user_idNo
currencyYesCurrency code (e.g., USD, EUR)
shippingNoShipping cost
client_idNo
affiliationNoStore or affiliation
transaction_idYesUnique transaction ID
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey the safety profile: readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description adds that this is the standard purchase event and carries transaction details, but it does not disclose operational behavior such as authentication needs, error conditions, or downstream effects of sending the event.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The action is front-loaded, and the second sentence clarifies the event's standard purpose. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for identifying the tool's purpose, and the schema covers parameter details. However, it lacks explicit guidance on choosing this specialized event over ga_send_event, and with no output schema it does not clarify what an agent should expect in the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 82%, and required parameters like transaction_id, value, currency, and items already have descriptions. The phrase 'transaction details and items' maps to those required parameters but adds no new semantic meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Send an ecommerce purchase event to Google Analytics.' It further distinguishes itself by calling out 'completed purchases with transaction details and items,' which separates it from sibling tools like ga_send_add_to_cart, ga_send_begin_checkout, and ga_send_event.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Standard event for tracking completed purchases' gives clear context for when the tool should be used. However, it does not explicitly name alternatives or state when not to use it, such as pointing to ga_send_event for non-purchase events or ga_send_refund for returns.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_refundA

Send a refund event to Google Analytics.

Ecommerce event for full or partial refunds. Omit 'items' for a full refund; include them (with quantities) for a partial refund. Use the same transaction_id as the original purchase.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsNoRefunded items (only for partial refunds)
valueNoRefunded amount
user_idNo
currencyNoCurrency code
client_idNo
transaction_idYesTransaction ID of the original purchase
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a non-read-only, non-idempotent operation; the description adds useful behavioral context by explaining how the event encodes refund type through items. It does not contradict any annotation and provides meaningful detail beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The core action is front-loaded, and the full/partial refund distinction is delivered in compact, immediately actionable form.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absent output schema and moderate parameter complexity, the description covers the key invocation decision (full vs partial) and the critical transaction_id constraint. Minor omissions like explicit guidance on optional value/currency handling are adequately covered by the schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description clarifies the most important parameter semantics: the conditional role of 'items' in distinguishing full from partial refunds and the requirement to match the original transaction_id. Schema coverage is 71%, and the description meaningfully compensates for the central ambiguity even though it does not elaborate on user_id or client_id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Send a refund event to Google Analytics.' It clearly identifies the tool as an ecommerce refund event and distinguishes it from sibling event tools by describing full vs partial refund behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage instructions: omit 'items' for a full refund, include them with quantities for a partial refund, and reuse the same transaction_id as the original purchase. It does not explicitly name alternative tools or when not to use this one, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_signupA

Send a sign-up event to Google Analytics.

Standard event for tracking new user registrations.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodYesSign-up method (e.g., "Google", "Email")
user_idNoUser ID for the new user
client_idNo
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the side-effect profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds the semantic context of a signup event but does not disclose any further behavioral traits such as asynchronous delivery, failure behavior, or authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, with the primary action and destination front-loaded and the purpose immediately following. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward event-send tool, purpose, parameters, and side-effect profile are mostly covered by the description plus schema/annotations. The lack of an output schema and the undocumented client_id are minor gaps, but the description still gives an agent enough to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so the baseline is 3; the description itself adds no parameter-level details and doesn't compensate for the undocumented client_id field. It neither clarifies the meaning of method beyond the schema's example nor explains how user_properties are used.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Send a sign-up event to Google Analytics') and adds the domain purpose ('tracking new user registrations'), which clearly distinguishes it from sibling tools like ga_send_login, ga_send_purchase, and generic ga_send_event.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gives explicit context for when the tool applies: it is the standard event for new user registrations. It stops short of naming excluded alternatives or explicitly contrasting with ga_send_login and ga_send_event, so it doesn't fully earn a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_send_view_itemA

Send a view item event to Google Analytics.

Ecommerce event for tracking product/item detail views. Completes the standard funnel: view_item → add_to_cart → begin_checkout → purchase.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesItems viewed
valueYesValue of the viewed item(s)
user_idNo
currencyYesCurrency code
client_idNo
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=false, signaling a state-changing call. The description adds useful context by identifying the event type and funnel position, but it does not disclose any additional behavioral traits such as required identifiers, side effects beyond sending, or rate-limiting considerations. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the core action front-loaded ('Send a view item event') and no filler. The funnel context earns its place by supporting purpose and usage differentiation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a straightforward tracking event given that the schema documents most parameters and annotations convey the mutation profile. However, it omits guidance on the use of client_id vs user_id and does not clarify how to construct the items array beyond what the schema provides. The missing output schema is partially mitigated by the nature of a send event, but the coverage gaps keep it from being complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no parameter-level meaning; it only names the event. Schema description coverage is 67%, leaving user_id and client_id undocumented in both the schema and the description. Since the description does not compensate for these gaps or enrich the semantics of the existing parameters, it provides minimal value beyond the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Send a view item event to Google Analytics.' Further clarifies it as an ecommerce event for tracking product/item detail views and places it in the standard funnel (view_item → add_to_cart → begin_checkout → purchase), which clearly distinguishes it from sibling send_add_to_cart, send_begin_checkout, and send_purchase tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: this is for product/item detail views and is the first step in the standard ecommerce funnel. It implies when to use it relative to the other send_* event tools, but it does not explicitly name alternatives or state when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ga_validate_eventA
Read-onlyIdempotent

Validate an event before sending it to Google Analytics.

Uses GA4's debug endpoint to check for errors without recording the event. Returns validation messages and errors if any.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventsYes
user_idNo
client_idNo
user_propertiesNoUser properties (e.g., {subscription_tier: {value: "premium"}})

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive behavior. The description adds valuable behavioral detail: it uses the debug endpoint, does not record the event, and returns validation messages/errors. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with the primary purpose, followed by mechanism and return value. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a validation tool with strong annotations and a nested input schema, the description covers purpose, non-destructive behavior, and return value. Some parameter semantics are thin, but the schema plus standard GA field names make the tool callable. An output schema would have helped, but the description states the return enough for selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 25% schema description coverage, the description needed to compensate, but it adds no information about user_id, client_id, user_properties, or the structure of the events array beyond generic 'event.' The schema supplies some details, but the description doesn't bridge the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Validate an event before sending it to Google Analytics.' It also names the mechanism (GA4 debug endpoint) and explicitly distinguishes itself from send tools by noting it checks without recording the event.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: use before sending an event to verify errors without recording it. It doesn't explicitly name alternatives such as ga_send_event or state when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 16 tool updatesv1.3.1
    • Changedga_batch_run_reports1 field changed
      • addedInput schema / properties / propertyId
        Added value: +{
        +  "description": "GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts \"123456789\" or \"properties/123456789\". Use ga_get_account_summaries to discover IDs.",
        +  "type": "string"
        +}
    • Addedga_check_compatibility
    • Addedga_get_account_summaries
    • Changedga_get_metadata2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / propertyId
        Added value: +{
        +  "description": "GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts \"123456789\" or \"properties/123456789\". Use ga_get_account_summaries to discover IDs.",
        +  "type": "string"
        +}
    • Changedga_get_property2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / propertyId
        Added value: +{
        +  "description": "GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts \"123456789\" or \"properties/123456789\". Use ga_get_account_summaries to discover IDs.",
        +  "type": "string"
        +}
    • Addedga_list_custom_dimensions
    • Addedga_list_custom_metrics
    • Changedga_list_data_streams2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / propertyId
        Added value: +{
        +  "description": "GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts \"123456789\" or \"properties/123456789\". Use ga_get_account_summaries to discover IDs.",
        +  "type": "string"
        +}
    • Addedga_list_google_ads_links
    • Addedga_list_key_events
    • Changedga_run_funnel_report1 field changed
      • addedInput schema / properties / propertyId
        Added value: +{
        +  "description": "GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts \"123456789\" or \"properties/123456789\". Use ga_get_account_summaries to discover IDs.",
        +  "type": "string"
        +}
    • Changedga_run_pivot_report1 field changed
      • addedInput schema / properties / propertyId
        Added value: +{
        +  "description": "GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts \"123456789\" or \"properties/123456789\". Use ga_get_account_summaries to discover IDs.",
        +  "type": "string"
        +}
    • Changedga_run_realtime_report1 field changed
      • addedInput schema / properties / propertyId
        Added value: +{
        +  "description": "GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts \"123456789\" or \"properties/123456789\". Use ga_get_account_summaries to discover IDs.",
        +  "type": "string"
        +}
    • Changedga_run_report1 field changed
      • addedInput schema / properties / propertyId
        Added value: +{
        +  "description": "GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts \"123456789\" or \"properties/123456789\". Use ga_get_account_summaries to discover IDs.",
        +  "type": "string"
        +}
    • Addedga_send_refund
    • Addedga_send_view_item
  2. 18 tool updatesv1.1.1
    • Changedga_batch_run_reports3 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / requests / items / additionalProperties
        Added value: +{}
    • Changedga_get_metadata1 field changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
    • Changedga_get_property1 field changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
    • Changedga_list_accounts1 field changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
    • Changedga_list_data_streams1 field changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
    • Changedga_list_properties2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedga_run_funnel_report14 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / dateRanges / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / dateRanges / items / properties / endDate / description
        Added value: +"End date (YYYY-MM-DD or \"yesterday\", \"today\", \"7daysAgo\")"
      • addedInput schema / properties / dateRanges / items / properties / name
        Added value: +{
        +  "description": "Optional name for the date range",
        +  "type": "string"
        +}
      • addedInput schema / properties / dateRanges / items / properties / startDate / description
        Added value: +"Start date (YYYY-MM-DD or \"yesterday\", \"today\", \"7daysAgo\")"
      • addedInput schema / properties / funnelBreakdown / additionalProperties
        Added value: +false
      • addedInput schema / properties / funnelBreakdown / required
        Added value: +[
        +  "name"
        +]
      • addedInput schema / properties / funnelSteps / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / funnelSteps / items / properties / eventName
        Added value: +{
        +  "description": "Event that defines the step (defaults to name)",
        +  "type": "string"
        +}
      • addedInput schema / properties / funnelSteps / items / properties / filterExpression
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Advanced FunnelFilterExpression (overrides eventName)",
        +  "type": "object"
        +}
      • addedInput schema / properties / funnelSteps / items / properties / name / description
        Added value: +"Display name for the step"
      • addedInput schema / properties / funnelSteps / items / properties / withinDurationFromPriorStep
        Added value: +{
        +  "description": "e.g., \"3600s\"",
        +  "type": "string"
        +}
      • addedInput schema / properties / funnelVisualizationType
        Added value: +{
        +  "enum": [
        +    "STANDARD_FUNNEL",
        +    "TRENDED_FUNNEL"
        +  ],
        +  "type": "string"
        +}
    • Changedga_run_pivot_report14 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / dateRanges / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / dateRanges / items / properties / endDate / description
        Added value: +"End date (YYYY-MM-DD or \"yesterday\", \"today\", \"7daysAgo\")"
      • addedInput schema / properties / dateRanges / items / properties / name
        Added value: +{
        +  "description": "Optional name for the date range",
        +  "type": "string"
        +}
      • addedInput schema / properties / dateRanges / items / properties / startDate / description
        Added value: +"Start date (YYYY-MM-DD or \"yesterday\", \"today\", \"7daysAgo\")"
      • addedInput schema / properties / dimensions / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / metrics / items / $ref
        Added value: +"#/properties/dimensions/items"
      • removedInput schema / properties / metrics / items / properties
        Removed value: -{
        -  "name": {
        -    "type": "string"
        -  }
        -}
      • removedInput schema / properties / metrics / items / required
        Removed value: -[
        -  "name"
        -]
      • removedInput schema / properties / metrics / items / type
        Removed value: -"object"
      • addedInput schema / properties / pivots / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / pivots / items / properties / limit / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / pivots / items / properties / limit / type
        Previous value: -"number"New value: +"integer"
    • Changedga_run_realtime_report10 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / dimensions / items / additionalProperties
        Added value: +false
      • removedInput schema / properties / limit / default
        Removed value: -10
      • addedInput schema / properties / limit / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / metrics / items / $ref
        Added value: +"#/properties/dimensions/items"
      • removedInput schema / properties / metrics / items / properties
        Removed value: -{
        -  "name": {
        -    "type": "string"
        -  }
        -}
      • removedInput schema / properties / metrics / items / required
        Removed value: -[
        -  "name"
        -]
      • removedInput schema / properties / metrics / items / type
        Removed value: -"object"
    • Changedga_run_report20 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / dateRanges / description
        Previous value: -"Date ranges for the report (e.g., [{startDate: \"2024-01-01\", endDate: \"2024-01-31\"}])"New value: +"Date ranges for the report"
      • addedInput schema / properties / dateRanges / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / dimensionFilter
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Dimension filter expression",
        +  "type": "object"
        +}
      • changedInput schema / properties / dimensions / description
        Previous value: -"Dimensions to group by (e.g., [\"date\", \"city\"])"New value: +"Dimensions to group by (e.g., [{name: \"date\"}])"
      • addedInput schema / properties / dimensions / items / additionalProperties
        Added value: +false
      • removedInput schema / properties / limit / default
        Removed value: -10
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of rows to return (default: 10, recommended: 10-50 for token efficiency)"New value: +"Maximum number of rows to return (default: 10)"
      • addedInput schema / properties / limit / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / metricFilter
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Metric filter expression",
        +  "type": "object"
        +}
      • changedInput schema / properties / metrics / description
        Previous value: -"Metrics to measure (e.g., [\"activeUsers\", \"sessions\"])"New value: +"Metrics to measure (e.g., [{name: \"activeUsers\"}])"
      • addedInput schema / properties / metrics / items / $ref
        Added value: +"#/properties/dimensions/items"
      • removedInput schema / properties / metrics / items / properties
        Removed value: -{
        -  "name": {
        -    "type": "string"
        -  }
        -}
      • removedInput schema / properties / metrics / items / required
        Removed value: -[
        -  "name"
        -]
      • removedInput schema / properties / metrics / items / type
        Removed value: -"object"
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • changedInput schema / properties / offset / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / orderBys / items / additionalProperties
        Added value: +{}
    • Changedga_send_add_to_cart20 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / properties / affiliation
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / coupon
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / currency
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / discount
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / items / items / properties / index
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / items / items / properties / item_brand
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category2
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category3
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category4
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category5
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_list_id
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_list_name
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_variant
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / location_id
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / user_properties / additionalProperties
        Previous value: -trueNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "value": {
        +      "type": [
        +        "string",
        +        "number"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / user_properties / description
        Added value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
    • Changedga_send_begin_checkout20 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / properties / affiliation
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / coupon
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / currency
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / discount
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / items / items / properties / index
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / items / items / properties / item_brand
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category2
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category3
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category4
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category5
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_list_id
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_list_name
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_variant
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / location_id
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / user_properties / additionalProperties
        Previous value: -trueNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "value": {
        +      "type": [
        +        "string",
        +        "number"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / user_properties / description
        Added value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
    • Changedga_send_event6 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / events / items / additionalProperties
        Added value: +false
      • changedInput schema / properties / events / items / properties / params / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / user_properties / additionalProperties / additionalProperties
        Added value: +false
      • addedInput schema / properties / user_properties / additionalProperties / required
        Added value: +[
        +  "value"
        +]
    • Changedga_send_login4 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / user_properties / additionalProperties
        Previous value: -trueNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "value": {
        +      "type": [
        +        "string",
        +        "number"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / user_properties / description
        Added value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
    • Changedga_send_pageview4 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / user_properties / additionalProperties
        Previous value: -trueNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "value": {
        +      "type": [
        +        "string",
        +        "number"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / user_properties / description
        Added value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
    • Changedga_send_purchase17 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / properties / affiliation
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / coupon
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / currency
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / discount
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / items / items / properties / index
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / items / items / properties / item_category2
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category3
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category4
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_category5
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_list_id
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / item_list_name
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / items / items / properties / location_id
        Added value: +{
        +  "type": "string"
        +}
      • changedInput schema / properties / user_properties / additionalProperties
        Previous value: -trueNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "value": {
        +      "type": [
        +        "string",
        +        "number"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / user_properties / description
        Added value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
    • Changedga_send_signup4 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / user_properties / additionalProperties
        Previous value: -trueNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "value": {
        +      "type": [
        +        "string",
        +        "number"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / user_properties / description
        Added value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
    • Changedga_validate_event8 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / events / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / events / items / properties / name / description
        Added value: +"Event name (e.g., \"purchase\", \"sign_up\")"
      • changedInput schema / properties / events / items / properties / params / additionalProperties
        Previous value: -trueNew value: +{}
      • addedInput schema / properties / events / items / properties / params / description
        Added value: +"Event parameters (key-value pairs)"
      • changedInput schema / properties / user_properties / additionalProperties
        Previous value: -trueNew value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "value": {
        +      "type": [
        +        "string",
        +        "number"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / user_properties / description
        Added value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
  3. 18 tool updatesv1.0.1
    • First observedga_batch_run_reports
    • First observedga_get_metadata
    • First observedga_get_property
    • First observedga_list_accounts
    • First observedga_list_data_streams
    • First observedga_list_properties
    • First observedga_run_funnel_report
    • First observedga_run_pivot_report
    • First observedga_run_realtime_report
    • First observedga_run_report
    • First observedga_send_add_to_cart
    • First observedga_send_begin_checkout
    • First observedga_send_event
    • First observedga_send_login
    • First observedga_send_pageview
    • First observedga_send_purchase
    • First observedga_send_signup
    • First observedga_validate_event

TDQS

A3.6/5.0
Disambiguation3/5

Most tools are clearly separated by resource and action, but the generic ga_send_event overlaps with all of the specialized send_* tools (pageview, purchase, login, etc.), and several account/property discovery tools serve similar listing purposes. Descriptions help agents choose, but misselection is possible when a generic call could substitute for a specific convenience wrapper.

Naming Consistency4/5

Names consistently use a ga_ prefix and snake_case, with a mostly clear verb_noun pattern (list_*, get_*, send_*, run_*). The main deviation is ga_batch_run_reports, which breaks the run_*_report pattern, and a few event names that embed verbs like send_add_to_cart and send_begin_checkout.

Tool Count3/5

At 26 tools, this is on the heavy side, especially because many send_* event helpers could be consolidated under ga_send_event and several report variants could share a single endpoint. Still, the breadth is not unreasonable for a GA4 server covering admin discovery, reporting, metadata, and Measurement Protocol event collection.

Completeness4/5

The surface covers the main analytics workflows well: account/property discovery, metadata and compatibility checks, multiple report types, plus custom and standard event sending. The main gap is the lack of create/update/delete operations for admin resources like properties, data streams, or custom dimensions/metrics, though those may be outside the server's intended scope.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables interaction with Google Analytics 4 to manage accounts, run standard or realtime reports, and validate event parameters. It supports dual authentication methods and integrates with GTM for end-to-end data collection orchestration.
    8
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides full Google Analytics 4 management and reporting capabilities via MCP, including property management, custom dimensions, audiences, events, data streams, and real-time reporting.
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables managing Google Analytics 4 properties, data streams, conversions, and running reports using natural language through the Admin and Data APIs.
    23
    MIT

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/leonardosepulvedat/mcp-google-analytics'

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