MCP Google Analytics Server
This server provides full Google Analytics 4 integration, allowing you to both read analytics data via the GA4 Data API and send/track events via the Measurement Protocol.
Reading & Reporting:
Run custom reports (
ga_run_report) with any dimensions and metrics over custom date ranges.Access real-time data (
ga_run_realtime_report) for the last 30 minutes.Run pivot (
ga_run_pivot_report) and funnel (ga_run_funnel_report) analyses.Execute multiple reports in one request (
ga_batch_run_reports; recommended 2‑5 per batch).Retrieve metadata (
ga_get_metadata) for available dimensions and metrics.Manage accounts and properties: list accounts (
ga_list_accounts), list properties (ga_list_properties), get property details (ga_get_property), list data streams (ga_list_data_streams).
Sending & Tracking Events:
Send custom events (
ga_send_event) with any parameters.Validate events (
ga_validate_event) without recording them.Dedicated methods for pageview, purchase, login, signup, add-to-cart, and begin-checkout.
Link events to the same user session via
client_idand supportuser_idfor cross-device tracking.
Key Features:
All read tools default to 10 rows for token efficiency, with configurable limit and offset for pagination.
Events appear in real-time reports within seconds, enabling end-to-end verification.
Easy setup with MCP clients like Claude Desktop and Cursor.
Provides comprehensive integration with Google Analytics 4, including the Data API for running reports (custom, realtime, pivot, funnel, and batch reports) and Measurement Protocol v2 for sending events (page views, purchases, logins, signups, and custom events).
Uses Google Cloud Console for authentication and API access, requiring service account creation and Google Analytics Data API enablement for reading GA4 data.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP Google Analytics Servershow me active users for the last 7 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
⚡ 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.
Click Install in Cursor, then paste:
GA_SERVICE_ACCOUNT_JSON— path to the downloaded key file, or the JSON itselfGA_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
limitparameter as neededUse 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-analyticsOption 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
In Google Cloud Console, enable Google Analytics Data API.
IAM & Admin → Service Accounts → Create. Download a JSON key.
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.
GA4 Admin → Data Streams → your stream → copy Measurement ID (
G-XXXXXXXXXX).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.
Grant your service account "Viewer" access on each client's GA4 property (or at account level).
Set only
GA_SERVICE_ACCOUNT_JSON(GA_PROPERTY_IDbecomes optional — if set, it acts as the default).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 |
| Custom reports with dimensions and metrics | Adjust |
| Real-time data (last 30 minutes) | Great for verifying sent events |
| All available dimensions and metrics | Large response (500+ items), use sparingly |
| List accessible GA accounts | |
| List GA4 properties | Aggregates all accounts if no |
| Details of the configured property | |
| Data streams of the property | Useful to find measurement IDs |
| Pivot table reports | Responses can be very large |
| Funnel analysis across event steps | Uses Data API v1alpha |
| Multiple reports in one request | 2–5 reports per batch recommended |
| All accounts and properties in one call | Fastest way to discover IDs |
| Custom dimensions of the property | Discover API names for reports |
| Custom metrics of the property | Discover API names for reports |
| Key events (conversions) of the property | Know what counts as a conversion |
| Google Ads accounts linked to the property | |
| Validate dimension/metric combos before reporting | Avoids wasted requests and error loops |
Sending events (Measurement Protocol):
Tool | Purpose |
| Any custom GA4 event with parameters |
| Test an event against the debug endpoint without recording it |
| Page/screen views |
| Ecommerce purchases with transaction and items |
| User logins |
| User registrations |
| Product/item detail views |
| Add-to-cart events |
| Checkout initiations |
| 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.
ga_list_google_ads_links
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_eventto 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 sameclient_idto 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_item → add_to_cart → begin_checkout → purchase.
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 daysClaude 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 USDClaude 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 realClaude 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 AnalyticsClaude 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 purchaseClaude will chain ga_send_add_to_cart → ga_send_begin_checkout → ga_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 successfullyClaude 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 itClaude 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.
🔗 Links
🆘 Support
For issues and questions:
📝 Changelog
See CHANGELOG.md for version history.
Available Tools
26 toolsga_batch_run_reportsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| requests | Yes | Array of report requests (same format as ga_run_report) | |
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_compatibilityARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | No | Metrics to check (e.g., [{name: "activeUsers"}]) | |
| dimensions | No | Dimensions to check (e.g., [{name: "city"}]) | |
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. | |
| compatibilityFilter | No | Only return fields with this compatibility (recommended: COMPATIBLE) |
TDQS
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.
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.
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.
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.
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.
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_summariesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_metadataARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_propertyARead-onlyIdempotent
Get details about a GA4 property (the configured one, or any accessible property via propertyId).
| Name | Required | Description | Default |
|---|---|---|---|
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_accountsARead-onlyIdempotent
List all Google Analytics accounts accessible to the service account.
Use this to find account IDs for listing properties.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_dimensionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_metricsARead-onlyIdempotent
List all custom metrics defined for the configured GA4 property.
Use this to discover custom metric API names for reports.
| Name | Required | Description | Default |
|---|---|---|---|
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_streamsARead-onlyIdempotent
List data streams for the configured GA4 property.
Use this to find measurement IDs for Measurement Protocol.
| Name | Required | Description | Default |
|---|---|---|---|
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_google_ads_linksARead-onlyIdempotent
List Google Ads accounts linked to a GA4 property.
| Name | Required | Description | Default |
|---|---|---|---|
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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 well-covered. The description adds the operation's scope but does not disclose additional behavioral details such as permissions, pagination, or response format. This is acceptable given the annotations, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It clearly states the action, resource, and scope in minimal space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, read-only list tool with a well-documented optional parameter and comprehensive annotations, the description is largely sufficient. No output schema exists, so a bit more detail about the returned data could help, but 'List Google Ads accounts' strongly implies the return shape and the tool's scope is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage for the single parameter, including override behavior, accepted formats, and how to discover IDs. The description does not add meaningful parameter semantics beyond restating the GA4 property context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), a clear resource ('Google Ads accounts'), and a precise scope ('linked to a GA4 property'). This clearly distinguishes it from sibling tools like ga_list_accounts or ga_list_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied by the description: use this tool when you need Google Ads accounts linked to a GA4 property. The schema hints to use ga_get_account_summaries for discovering IDs, but the description itself does not explicitly state when to choose this tool over alternatives or 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_list_key_eventsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_propertiesARead-onlyIdempotent
List Google Analytics properties.
Optionally filter by account ID. Without an account ID, properties from all accessible accounts are aggregated.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Optional account ID to filter properties (e.g., "123456789") |
TDQS
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.
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.
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.
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.
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.
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_reportARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| dateRanges | Yes | ||
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. | |
| funnelSteps | Yes | Steps in the funnel | |
| funnelBreakdown | No | Optional dimension to break down funnel | |
| funnelVisualizationType | No |
TDQS
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.
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.
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.
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.
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.
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_reportARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| pivots | Yes | Pivot specifications with fieldNames | |
| metrics | Yes | ||
| dateRanges | Yes | ||
| dimensions | No | ||
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_reportARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of rows (default: 10) | |
| metrics | Yes | Metrics to measure | |
| dimensions | No | Dimensions to group by | |
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. |
TDQS
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.
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.
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.
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.
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.
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_reportARead-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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of rows to return (default: 10) | |
| offset | No | Number of rows to skip (for pagination) | |
| metrics | Yes | Metrics to measure (e.g., [{name: "activeUsers"}]) | |
| orderBys | No | Sorting specification | |
| dateRanges | Yes | Date ranges for the report | |
| dimensions | No | Dimensions to group by (e.g., [{name: "date"}]) | |
| propertyId | No | GA4 property ID to query (overrides the default GA_PROPERTY_ID). Accepts "123456789" or "properties/123456789". Use ga_get_account_summaries to discover IDs. | |
| metricFilter | No | Metric filter expression | |
| dimensionFilter | No | Dimension filter expression |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Items added to cart | |
| value | Yes | Total value of items added | |
| user_id | No | ||
| currency | Yes | Currency code | |
| client_id | No | ||
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Items in checkout | |
| value | Yes | Total value of cart | |
| coupon | No | Coupon code applied | |
| user_id | No | ||
| currency | Yes | Currency code | |
| client_id | No | ||
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| events | Yes | Events to send (can send multiple in one request) | |
| user_id | No | Optional User ID for cross-device tracking | |
| client_id | No | Client ID (UUID format recommended). Auto-generated if not provided. | |
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | Login method (e.g., "Google", "Email", "Facebook") | |
| user_id | No | User ID (recommended for login events) | |
| client_id | No | ||
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | No | Optional User ID | |
| client_id | No | Client ID (auto-generated if not provided) | |
| page_title | No | Page title | |
| page_location | Yes | Full URL of the page | |
| page_referrer | No | Referrer URL | |
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tax | No | Tax amount | |
| items | Yes | Purchased items | |
| value | Yes | Total purchase value | |
| coupon | No | Coupon code used | |
| user_id | No | ||
| currency | Yes | Currency code (e.g., USD, EUR) | |
| shipping | No | Shipping cost | |
| client_id | No | ||
| affiliation | No | Store or affiliation | |
| transaction_id | Yes | Unique transaction ID | |
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | Refunded items (only for partial refunds) | |
| value | No | Refunded amount | |
| user_id | No | ||
| currency | No | Currency code | |
| client_id | No | ||
| transaction_id | Yes | Transaction ID of the original purchase | |
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | Sign-up method (e.g., "Google", "Email") | |
| user_id | No | User ID for the new user | |
| client_id | No | ||
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Items viewed | |
| value | Yes | Value of the viewed item(s) | |
| user_id | No | ||
| currency | Yes | Currency code | |
| client_id | No | ||
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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_eventARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| events | Yes | ||
| user_id | No | ||
| client_id | No | ||
| user_properties | No | User properties (e.g., {subscription_tier: {value: "premium"}}) |
TDQS
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.
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.
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.
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.
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.
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.
16 tool updates
v1.3.1- Changed
ga_batch_run_reports1 field changed- added
Input schema / properties / propertyIdAdded 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" +}
- Added
ga_check_compatibility - Added
ga_get_account_summaries - Changed
ga_get_metadata2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / propertyIdAdded 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" +}
- Changed
ga_get_property2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / propertyIdAdded 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" +}
- Added
ga_list_custom_dimensions - Added
ga_list_custom_metrics - Changed
ga_list_data_streams2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / propertyIdAdded 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" +}
- Added
ga_list_google_ads_links - Added
ga_list_key_events - Changed
ga_run_funnel_report1 field changed- added
Input schema / properties / propertyIdAdded 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" +}
- Changed
ga_run_pivot_report1 field changed- added
Input schema / properties / propertyIdAdded 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" +}
- Changed
ga_run_realtime_report1 field changed- added
Input schema / properties / propertyIdAdded 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" +}
- Changed
ga_run_report1 field changed- added
Input schema / properties / propertyIdAdded 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" +}
- Added
ga_send_refund - Added
ga_send_view_item
18 tool updates
v1.1.1- Changed
ga_batch_run_reports3 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / requests / items / additionalPropertiesAdded value: +{}
- Changed
ga_get_metadata1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
ga_get_property1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
ga_list_accounts1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
ga_list_data_streams1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
ga_list_properties2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false
- Changed
ga_run_funnel_report14 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / dateRanges / items / additionalPropertiesAdded value: +false - added
Input schema / properties / dateRanges / items / properties / endDate / descriptionAdded value: +"End date (YYYY-MM-DD or \"yesterday\", \"today\", \"7daysAgo\")" - added
Input schema / properties / dateRanges / items / properties / nameAdded value: +{ + "description": "Optional name for the date range", + "type": "string" +} - added
Input schema / properties / dateRanges / items / properties / startDate / descriptionAdded value: +"Start date (YYYY-MM-DD or \"yesterday\", \"today\", \"7daysAgo\")" - added
Input schema / properties / funnelBreakdown / additionalPropertiesAdded value: +false - added
Input schema / properties / funnelBreakdown / requiredAdded value: +[ + "name" +] - added
Input schema / properties / funnelSteps / items / additionalPropertiesAdded value: +false - added
Input schema / properties / funnelSteps / items / properties / eventNameAdded value: +{ + "description": "Event that defines the step (defaults to name)", + "type": "string" +} - added
Input schema / properties / funnelSteps / items / properties / filterExpressionAdded value: +{ + "additionalProperties": {}, + "description": "Advanced FunnelFilterExpression (overrides eventName)", + "type": "object" +} - added
Input schema / properties / funnelSteps / items / properties / name / descriptionAdded value: +"Display name for the step" - added
Input schema / properties / funnelSteps / items / properties / withinDurationFromPriorStepAdded value: +{ + "description": "e.g., \"3600s\"", + "type": "string" +} - added
Input schema / properties / funnelVisualizationTypeAdded value: +{ + "enum": [ + "STANDARD_FUNNEL", + "TRENDED_FUNNEL" + ], + "type": "string" +}
- Changed
ga_run_pivot_report14 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / dateRanges / items / additionalPropertiesAdded value: +false - added
Input schema / properties / dateRanges / items / properties / endDate / descriptionAdded value: +"End date (YYYY-MM-DD or \"yesterday\", \"today\", \"7daysAgo\")" - added
Input schema / properties / dateRanges / items / properties / nameAdded value: +{ + "description": "Optional name for the date range", + "type": "string" +} - added
Input schema / properties / dateRanges / items / properties / startDate / descriptionAdded value: +"Start date (YYYY-MM-DD or \"yesterday\", \"today\", \"7daysAgo\")" - added
Input schema / properties / dimensions / items / additionalPropertiesAdded value: +false - added
Input schema / properties / metrics / items / $refAdded value: +"#/properties/dimensions/items" - removed
Input schema / properties / metrics / items / propertiesRemoved value: -{ - "name": { - "type": "string" - } -} - removed
Input schema / properties / metrics / items / requiredRemoved value: -[ - "name" -] - removed
Input schema / properties / metrics / items / typeRemoved value: -"object" - added
Input schema / properties / pivots / items / additionalPropertiesAdded value: +false - added
Input schema / properties / pivots / items / properties / limit / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / pivots / items / properties / limit / typePrevious value: -"number"New value: +"integer"
- Changed
ga_run_realtime_report10 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / dimensions / items / additionalPropertiesAdded value: +false - removed
Input schema / properties / limit / defaultRemoved value: -10 - added
Input schema / properties / limit / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / metrics / items / $refAdded value: +"#/properties/dimensions/items" - removed
Input schema / properties / metrics / items / propertiesRemoved value: -{ - "name": { - "type": "string" - } -} - removed
Input schema / properties / metrics / items / requiredRemoved value: -[ - "name" -] - removed
Input schema / properties / metrics / items / typeRemoved value: -"object"
- Changed
ga_run_report20 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / dateRanges / descriptionPrevious value: -"Date ranges for the report (e.g., [{startDate: \"2024-01-01\", endDate: \"2024-01-31\"}])"New value: +"Date ranges for the report" - added
Input schema / properties / dateRanges / items / additionalPropertiesAdded value: +false - added
Input schema / properties / dimensionFilterAdded value: +{ + "additionalProperties": {}, + "description": "Dimension filter expression", + "type": "object" +} - changed
Input schema / properties / dimensions / descriptionPrevious value: -"Dimensions to group by (e.g., [\"date\", \"city\"])"New value: +"Dimensions to group by (e.g., [{name: \"date\"}])" - added
Input schema / properties / dimensions / items / additionalPropertiesAdded value: +false - removed
Input schema / properties / limit / defaultRemoved value: -10 - changed
Input schema / properties / limit / descriptionPrevious 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)" - added
Input schema / properties / limit / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / metricFilterAdded value: +{ + "additionalProperties": {}, + "description": "Metric filter expression", + "type": "object" +} - changed
Input schema / properties / metrics / descriptionPrevious value: -"Metrics to measure (e.g., [\"activeUsers\", \"sessions\"])"New value: +"Metrics to measure (e.g., [{name: \"activeUsers\"}])" - added
Input schema / properties / metrics / items / $refAdded value: +"#/properties/dimensions/items" - removed
Input schema / properties / metrics / items / propertiesRemoved value: -{ - "name": { - "type": "string" - } -} - removed
Input schema / properties / metrics / items / requiredRemoved value: -[ - "name" -] - removed
Input schema / properties / metrics / items / typeRemoved value: -"object" - added
Input schema / properties / offset / minimumAdded value: +0 - changed
Input schema / properties / offset / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / orderBys / items / additionalPropertiesAdded value: +{}
- Changed
ga_send_add_to_cart20 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / items / items / additionalPropertiesAdded value: +false - added
Input schema / properties / items / items / properties / affiliationAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / couponAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / currencyAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / discountAdded value: +{ + "type": "number" +} - added
Input schema / properties / items / items / properties / indexAdded value: +{ + "type": "number" +} - added
Input schema / properties / items / items / properties / item_brandAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_categoryAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category2Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category3Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category4Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category5Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_list_idAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_list_nameAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_variantAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / location_idAdded value: +{ + "type": "string" +} - changed
Input schema / properties / user_properties / additionalPropertiesPrevious value: -trueNew value: +{ + "additionalProperties": false, + "properties": { + "value": { + "type": [ + "string", + "number" + ] + } + }, + "required": [ + "value" + ], + "type": "object" +} - added
Input schema / properties / user_properties / descriptionAdded value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
- Changed
ga_send_begin_checkout20 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / items / items / additionalPropertiesAdded value: +false - added
Input schema / properties / items / items / properties / affiliationAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / couponAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / currencyAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / discountAdded value: +{ + "type": "number" +} - added
Input schema / properties / items / items / properties / indexAdded value: +{ + "type": "number" +} - added
Input schema / properties / items / items / properties / item_brandAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_categoryAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category2Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category3Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category4Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category5Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_list_idAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_list_nameAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_variantAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / location_idAdded value: +{ + "type": "string" +} - changed
Input schema / properties / user_properties / additionalPropertiesPrevious value: -trueNew value: +{ + "additionalProperties": false, + "properties": { + "value": { + "type": [ + "string", + "number" + ] + } + }, + "required": [ + "value" + ], + "type": "object" +} - added
Input schema / properties / user_properties / descriptionAdded value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
- Changed
ga_send_event6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / events / items / additionalPropertiesAdded value: +false - changed
Input schema / properties / events / items / properties / params / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / user_properties / additionalProperties / additionalPropertiesAdded value: +false - added
Input schema / properties / user_properties / additionalProperties / requiredAdded value: +[ + "value" +]
- Changed
ga_send_login4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / user_properties / additionalPropertiesPrevious value: -trueNew value: +{ + "additionalProperties": false, + "properties": { + "value": { + "type": [ + "string", + "number" + ] + } + }, + "required": [ + "value" + ], + "type": "object" +} - added
Input schema / properties / user_properties / descriptionAdded value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
- Changed
ga_send_pageview4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / user_properties / additionalPropertiesPrevious value: -trueNew value: +{ + "additionalProperties": false, + "properties": { + "value": { + "type": [ + "string", + "number" + ] + } + }, + "required": [ + "value" + ], + "type": "object" +} - added
Input schema / properties / user_properties / descriptionAdded value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
- Changed
ga_send_purchase17 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / items / items / additionalPropertiesAdded value: +false - added
Input schema / properties / items / items / properties / affiliationAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / couponAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / currencyAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / discountAdded value: +{ + "type": "number" +} - added
Input schema / properties / items / items / properties / indexAdded value: +{ + "type": "number" +} - added
Input schema / properties / items / items / properties / item_category2Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category3Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category4Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_category5Added value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_list_idAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / item_list_nameAdded value: +{ + "type": "string" +} - added
Input schema / properties / items / items / properties / location_idAdded value: +{ + "type": "string" +} - changed
Input schema / properties / user_properties / additionalPropertiesPrevious value: -trueNew value: +{ + "additionalProperties": false, + "properties": { + "value": { + "type": [ + "string", + "number" + ] + } + }, + "required": [ + "value" + ], + "type": "object" +} - added
Input schema / properties / user_properties / descriptionAdded value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
- Changed
ga_send_signup4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / user_properties / additionalPropertiesPrevious value: -trueNew value: +{ + "additionalProperties": false, + "properties": { + "value": { + "type": [ + "string", + "number" + ] + } + }, + "required": [ + "value" + ], + "type": "object" +} - added
Input schema / properties / user_properties / descriptionAdded value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
- Changed
ga_validate_event8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / events / items / additionalPropertiesAdded value: +false - added
Input schema / properties / events / items / properties / name / descriptionAdded value: +"Event name (e.g., \"purchase\", \"sign_up\")" - changed
Input schema / properties / events / items / properties / params / additionalPropertiesPrevious value: -trueNew value: +{} - added
Input schema / properties / events / items / properties / params / descriptionAdded value: +"Event parameters (key-value pairs)" - changed
Input schema / properties / user_properties / additionalPropertiesPrevious value: -trueNew value: +{ + "additionalProperties": false, + "properties": { + "value": { + "type": [ + "string", + "number" + ] + } + }, + "required": [ + "value" + ], + "type": "object" +} - added
Input schema / properties / user_properties / descriptionAdded value: +"User properties (e.g., {subscription_tier: {value: \"premium\"}})"
18 tool updates
v1.0.1- First observed
ga_batch_run_reports - First observed
ga_get_metadata - First observed
ga_get_property - First observed
ga_list_accounts - First observed
ga_list_data_streams - First observed
ga_list_properties - First observed
ga_run_funnel_report - First observed
ga_run_pivot_report - First observed
ga_run_realtime_report - First observed
ga_run_report - First observed
ga_send_add_to_cart - First observed
ga_send_begin_checkout - First observed
ga_send_event - First observed
ga_send_login - First observed
ga_send_pageview - First observed
ga_send_purchase - First observed
ga_send_signup - First observed
ga_validate_event
TDQS
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.
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.
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.
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
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
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
Connect Google Analytics to ChatGPT. Query GA4 data in plain English and get instant insights.
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
200+ read/write tools for GA4, Search Console, Google Ads, Shopify, WooCommerce, Shopware & more.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Google Analytics APIs to fetch reports, manage properties, data streams, conversion events, and custom dimensions/metrics through OAuth2 authentication.626MIT
- FlicenseAqualityDmaintenanceEnables 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-
- AlicenseNot gradedqualityBmaintenanceProvides full Google Analytics 4 management and reporting capabilities via MCP, including property management, custom dimensions, audiences, events, data streams, and real-time reporting.MIT
- AlicenseBqualityDmaintenanceEnables managing Google Analytics 4 properties, data streams, conversions, and running reports using natural language through the Admin and Data APIs.23MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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