Skip to main content
Glama
clamp-sh

Clamp Analytics MCP Server

Official
by clamp-sh

@clamp-sh/mcp

Analytics MCP server for Clamp Analytics. Gives Claude, Cursor, VS Code Copilot, Windsurf, Cline, and any other Model Context Protocol client live access to your traffic, pages, events, revenue, errors, funnels, cohorts, and alerts — and the tools to create funnels and metric alerts from the conversation.

Using Cursor, VS Code, Claude Code, or Claude Desktop? Install the hosted Remote MCP from your Clamp dashboard in one click — auth happens automatically, no API key to paste, no config files to edit. Open a project, go to the Installation tab, and pick your editor. This npm package is the stdio path for CI, headless agents, custom clients, and self-hosted Clamp instances.

What your agent can do

Once connected, your agent can answer questions like:

  • "How's traffic this week?"

  • "Why did pageviews drop on Tuesday?"

  • "Which referrers drove the most signups?"

  • "Compare US vs Germany conversion this month"

  • "Create a funnel from /pricing to signup to purchase"

  • "Alert me when bounce rate on /pricing goes above 70%"

  • "What did Hacker News visitors actually read?"

  • "Run the weekly report"

Each question maps to one or two MCP tool calls. The agent picks the right tool, runs the query, and returns the answer in chat — no dashboard tab, no copy-paste.

Related MCP server: Google Analytics MCP Server

Why an MCP server for analytics

A dashboard answers the questions you anticipated when you built it. An MCP server lets the agent answer the ones you didn't. Same data, different access pattern: the agent can compose tools, follow up on its own answers, and run the diagnostic queries you'd manually click through.

Tools are typed (outputSchema per MCP protocol 2025-06-18), so client-side validation works before any call lands. Per-tool descriptions name the use case and a representative example, so agents pick the right tool on the first try.

Setup

For one-click install in Cursor / VS Code / Claude Code / Claude Desktop, use the Clamp dashboard. For stdio (CI, headless agents, custom clients, self-hosted instances), pick your client below.

VS Code / Copilot

Add to .vscode/mcp.json in your project:

{
  "servers": {
    "clamp": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@clamp-sh/mcp"],
      "env": {
        "CLAMP_API_KEY": "sk_proj..."
      }
    }
  }
}

Claude Code

claude mcp add clamp -- npx -y @clamp-sh/mcp
export CLAMP_API_KEY="sk_proj..."

Claude Desktop and Cursor

Both clients use the same shape — drop this into claude_desktop_config.json or .cursor/mcp.json:

{
  "mcpServers": {
    "clamp": {
      "command": "npx",
      "args": ["-y", "@clamp-sh/mcp"],
      "env": {
        "CLAMP_API_KEY": "sk_proj..."
      }
    }
  }
}

API key

Get your API key from the Clamp dashboard under Settings → API Keys. Keys are scoped to a project and start with sk_proj.

Tools

Free (all plans)

Tool

What it does

traffic.overview

Pageviews, visitors, sessions, bounce rate, avg duration. Period comparison included.

traffic.timeseries

Any core metric over time with automatic granularity (visitors, sessions, bounce rate, avg duration, or event counts).

traffic.compare

Compare any metric across two arbitrary periods. Returns absolute and percent delta.

traffic.live

Visitors active in the last N minutes plus their top pages, referrers, and countries.

breakdown

Group visitors and pageviews by any dimension: pathname, referrer_host, country, city, region, device_type, browser, browser_version, os, os_version, entry_page, exit_page, channel, or any UTM field.

pages.engagement

Per-page metrics with view: summary, engagement (adds engagement seconds and bounce rate), sections (per-section view counts for one pathname; needs the section-views SDK extension).

events.list

Custom event counts with property filtering and grouping.

events.observed_schema

The actual fired-event signature with per-property type observations. Diff against a local event-schema.yaml to surface schema drift.

events.property_values

Top distinct string-typed values a property has taken on a specific event. Use to discover the value space before defining a cohort filter or running events.list with property=.

revenue.sum

Sum Money-typed event properties. Split by currency, group by any dimension, switch to first-touch via attribution_model. Drill-in filters: plan, product, first_touch_dim + first_touch_value.

revenue.summary

The whole Revenue tab in one call: revenue per currency, customers, orders, AOV, LTV, MRR (running balance) + ARR, per-plan rollup (where mrr_contribution is the cumulative MRR balance per plan, not the in-period delta), per-product rollup, prior-period comparison, and mode flags (is_subscription, has_one_time) so callers can render conditionally.

revenue.retention

Cohort revenue retention on MRR-on-MRR math. Per window: mature_size, retained, retention_rate, mrr_at_d, baseline_mrr_mature, nrr (net revenue retention; >1.0 = net expansion). Anchored at the customer's first subscription_started.

revenue.timeseries

Plot one revenue metric per bucket. metric accepts revenue (Money sum), mrr (running balance, picks up from prior period), customers (distinct paying), or transactions (event count).

sessions.paths

Aggregate session paths: top entry → exit pairs with pages per session and duration.

users.journey

Chronological session-and-event reconstruction for one anonymous ID.

cohorts.create / cohorts.list / cohorts.retention / cohorts.compare / cohorts.delete

Define cohorts by event + period + filter; query retention curves; compare 2–10 cohorts side-by-side on the same retention windows; delete a saved cohort by name (definitions are immutable, so delete + re-create is the rename/restructure flow).

errors.list / errors.groups / errors.timeline / errors.context

Recent errors, fingerprint-grouped errors with affected-user counts, error rate over time, and breadcrumbs leading to a single error.

projects.list

List all projects this credential can access.

docs.search

Keyword-search the Clamp docs index.

Pro

Tool

What it does

funnels.create

Define and immediately evaluate a multi-step conversion funnel. Steps accept property predicates: cta_click[location=hero][plan=pro]. Names must be unique within a project — a duplicate-name call returns 409.

funnels.list

List funnels or fetch one with cohort filters (country, channel, device, UTM).

funnels.delete

Delete a saved funnel by name (definitions are immutable, so delete + re-create is the rename/restructure flow).

alerts.create

Set up metric alerts (e.g. "visitors drops_by 30% over 7d").

alerts.list / alerts.delete

List and remove alerts.

Common parameters

period"today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD". Defaults to "30d".

limit — Max rows returned, 1-50. Defaults to 10.

Filters — Most tools accept pathname, referrer_host, channel, country, region, city, device_type, browser, browser_version, os, os_version, and the full UTM set (utm_source, utm_medium, utm_campaign, utm_content, utm_term). Funnels accept the same cohort filters.

dimension (breakdown only) — see the breakdown row above for valid values.

view (pages.engagement only) — "summary" (default), "engagement", or "sections". "sections" requires pathname.

Revenue filters (revenue.sum, revenue.timeseries) — plan and product filter to one subscription tier or one-time product. first_touch_dim (one of channel, referrer_host, utm_campaign, utm_source, utm_medium, country) + first_touch_value filter to customers whose earliest session matched that dim. attribution_model="first_touch" on revenue.sum groups by first-touch dim instead of conversion-time dim.

Revenue metric (revenue.timeseries only) — "revenue" (default), "mrr" (running balance), "customers", or "transactions".

Prompts

Pre-built analytics workflows the AI can follow. Each prompt tells the model which tools to call, in what order, and how to present the results.

Prompt

What it produces

weekly_report

Traffic summary, top pages, referrers, countries, one actionable insight.

traffic_diagnosis

Root-cause analysis for traffic changes. Drills into channels, countries, devices, pages.

conversion_audit

Funnel drop-off analysis with cohort segmentation.

channel_breakdown

Traffic quality comparison across sources (volume vs engagement).

page_performance

Deep-dive on a single page: trends, referrers, devices, engagement vs site average.

Examples

Traffic overview

"How's my traffic this week?"

Calls traffic.overview with period="7d". Returns pageviews, visitors, sessions, bounce rate, avg duration, and comparison to the previous week.

"Show me visitor trends for the last 90 days"

Calls traffic.timeseries with period="90d" and metric="visitors". Returns daily counts over the full window.

Sources and geography

"Where are my visitors coming from?"

Calls breakdown with dimension="referrer_host". Returns referrer hostnames with channel classification (organic_search, direct, referral, paid, email, organic_social) joined into each row.

"Which cities in Germany have the most visitors?"

Calls breakdown with dimension="city" and country="DE". Returns city names with country and visitor/pageview counts.

"Is Safari 17 bouncing harder than Chrome 120?"

Two calls to traffic.overview with browser="Safari", browser_version="17" and browser="Chrome", browser_version="120". Returns side-by-side bounce rates.

"Which pages did Hacker News visitors read?"

Calls pages.engagement with referrer_host="news.ycombinator.com". Returns only pages viewed by traffic from HN.

Custom events

"How many signups happened this month?"

Calls events.list with name="signup" and period="30d".

"Break down signups by plan"

Calls events.list with name="signup" and group_by="plan". Returns counts per property value.

Funnels (Pro)

"Create a funnel from pricing page to signup to purchase"

Calls funnels.create with steps ["pageview:/pricing", "signup", "purchase"]. Returns step-by-step conversion rates immediately.

"Compare funnel conversion for US vs Germany"

Two calls to funnels.list, one with country="US" and one with country="DE".

Alerts (Pro)

"Alert me if visitors drop by 30% week over week"

Calls alerts.create with metric="visitors", condition="drops_by", threshold=30, period="7d".

Workflows

"Why did traffic drop last week?"

Follows the traffic_diagnosis prompt. Systematically checks channels, countries, devices, and pages to isolate the root cause.

"Audit our conversion funnel"

Follows the conversion_audit prompt. Analyzes funnel drop-offs, segments by device/country/channel, and identifies the biggest optimization opportunity.

Environment variables

Variable

Required

Description

CLAMP_API_KEY

Yes

Project API key (sk_proj...).

CLAMP_API_URL

No

Override the API base. Defaults to https://api.clamp.sh. Set this when pointing at a self-hosted Clamp instance.

FAQ

Do I need an API key for the Remote MCP install? No. Installing from the Clamp dashboard handles auth automatically. The API key is only needed for stdio (this npm package), self-hosted instances, CI, and custom clients.

How is this different from the Clamp dashboard? Same data, different access pattern. Use the dashboard when you want a chart; use the MCP when you want the agent to do the digging — diagnose a drop, compose a funnel, run a weekly report — and return the answer in chat.

Can I self-host? Yes. Point CLAMP_API_URL at your self-hosted Clamp instance, or run the stdio server inline in your own infrastructure. The MCP tools work against any Clamp API endpoint that speaks the same protocol.

Does this work for read-only audits, or can the agent make changes? Both. The Free-tier tools are all read-only except for cohorts.create / cohorts.delete; the Pro tools (funnels.create, funnels.delete, alerts.create, alerts.delete) also write. Scope the connection from the dashboard if you only want read access.

Will the agent know about my custom events? Yes. events.observed_schema returns the actual fired-event signatures with per-property type observations, so the agent can answer "what's in my event schema" without you pasting anything.

License

MIT

Available Tools

33 tools
alerts.createA
Idempotent

Create a metric alert that fires when a condition crosses its threshold. The alert monitors one metric (pageviews, visitors, sessions, bounce_rate, or avg_duration) over a rolling period and is re-evaluated every time an MCP session connects — alerts surface in-thread when the agent next checks, not as background pushes. Use to set lightweight monitoring like "alert me if pricing pageviews drop 50% week-over-week" or "alert me if bounce rate exceeds 70%". Requires Pro plan.

Examples:

  • pricing pageview drop → metric="pageviews", condition="drops_by", threshold=50, pathname="/pricing"

  • bounce rate ceiling → metric="bounce_rate", condition="above", threshold=70, period="7d"

  • traffic surge → metric="visitors", condition="increases_by", threshold=100, period="1d"

  • minimum-floor → metric="sessions", condition="below", threshold=100, period="1d"

Limitations: evaluation is on MCP session connect, not background — there are no push notifications, emails, or webhooks. Threshold for above/below is the absolute metric value; for drops_by/increases_by it is the percentage change vs the previous period of the same length. One alert per call — create multiple alerts for multiple conditions.

ParametersJSON Schema
NameRequiredDescriptionDefault
metricYesThe metric to monitor. "pageviews" = total page views, "visitors" = unique visitors, "sessions" = total sessions, "bounce_rate" = % of single-page sessions (0-100), "avg_duration" = average session length in seconds.
periodNoEvaluation window. Use "7d", "30d", etc. Defaults to "7d". Compared against the previous period of the same length.
pathnameNoScope the alert to a specific page path (e.g. "/pricing"). Omit to monitor all pages.
conditionYesAlert condition. "above" = metric exceeds threshold, "below" = metric falls below threshold, "drops_by" = metric drops by threshold % compared to previous period, "increases_by" = metric increases by threshold % compared to previous period.
thresholdYesThreshold value. For "above"/"below": the absolute metric value (e.g. 1000 pageviews). For "drops_by"/"increases_by": the percentage change (e.g. 50 means 50% drop/increase).
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
metricYes
periodYes
pathnameYes
conditionYes
thresholdYes
created_atYes

TDQS

A4.8/5.0
Behavior5/5

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

Description adds significant behavioral context beyond annotations: evaluation on MCP session connect, no background push, threshold semantics (absolute vs percentage), and one-alert-per-call limitation. Annotations (readOnlyHint false, destructiveHint false, idempotentHint true) are consistent and not contradicted.

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

Conciseness5/5

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

Concise yet comprehensive. Front-loaded with purpose, then examples, then limitations. No wasted sentences; every part serves a purpose.

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

Completeness5/5

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

Covers all necessary aspects: what the tool does, parameters, examples, limitations, and behavioral traits. Output schema exists, so return details are covered elsewhere. No obvious gaps for an alert creation tool.

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

Parameters5/5

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

With 100% schema coverage, baseline is 3, but description adds substantial value: explains metric units (bounce_rate as 0-100, avg_duration in seconds), condition interpretations, threshold meaning for each condition, period defaults, and pathname scoping. Examples map conditions to concrete scenarios.

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

Purpose5/5

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

Description clearly states it creates a metric alert with specific condition, metric, and threshold. It distinguishes from siblings by focusing on creation and explains the alert behavior (session-based evaluation). Examples reinforce the purpose.

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

Usage Guidelines4/5

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

Provides use cases and examples, plus limitations on evaluation timing and lack of push notifications. However, it does not explicitly contrast with other alert tools (e.g., when to use alerts.list vs create) or specify when not to use this tool.

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

alerts.deleteA
DestructiveIdempotent

Delete an alert by its id. Find the id by calling alerts.list first. The deletion is irreversible — there is no soft-delete or undo, and the agent should confirm intent with the user before calling this on a non-trivial alert. Returns 404 if no alert with that id exists for the project.

Examples:

  • "remove the pricing alert" → alerts.list to find the matching id, then alerts.delete with that id

  • "clear all alerts" → alerts.list, then alerts.delete for each id

Limitations: irreversible. Does not return the deleted alert's prior configuration — capture it from alerts.list first if you may need to recreate it. The alert_id must be the UUID returned by alerts.list, not a metric name.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesThe alert id (UUID) to delete. Get this from alerts.list.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations indicate destructiveHint=true and idempotentHint=true. Description adds irreversible nature, no soft-delete, need to confirm intent, and 404 behavior. Adds significant context beyond annotations.

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

Conciseness5/5

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

Well-structured: front-loads main action, then prerequisites, examples, limitations. Every sentence adds value without redundancy.

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

Completeness5/5

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

With output schema present, description covers prerequisites, side effects, error cases, and usage examples. Complete for a delete tool.

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

Parameters4/5

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

Schema has 100% coverage. Description adds that alert_id must be UUID from alerts.list (not metric name) and project_id can be omitted if single project. Provides extra clarity beyond schema.

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

Purpose5/5

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

Clearly states 'Delete an alert by its id' with specific verb and resource. Distinguishes from siblings by referencing alerts.list as prerequisite and mentioning siblings like alerts.create and alerts.list.

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

Usage Guidelines5/5

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

Explicitly tells when to use (after alerts.list) and when to confirm intent. Provides examples for different use cases. Mentions limitations and error handling (404).

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

alerts.listA
Read-only

List all alerts configured for a project. Returns each alert's id (UUID), metric, condition, threshold, period, optional pathname scope, and created_at timestamp. Use before alerts.delete to find the id you want to remove, or to show the user every monitor currently active. Returns an empty array if no alerts have been created yet.

Examples:

  • "what alerts do I have" → no extra params beyond project_id

  • before deleting → call alerts.list, locate the id, pass it to alerts.delete

Limitations: alert state (currently firing vs not) is not included — that surfaces only when the alert is re-evaluated on MCP session connect. There is no pagination; projects with many alerts return all of them in one response.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
alertsYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses specific return fields, empty array behavior, omission of alert state, and lack of pagination. No contradictions 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.

Conciseness4/5

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

The description is concise and front-loaded with purpose. A few extra details could be trimmed, but overall it is efficient.

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

Completeness5/5

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

Given the simple single-parameter tool with readOnly annotation and output schema, the description covers return values, limitations, and usage examples thoroughly.

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

Parameters4/5

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

Schema coverage is 100% with detailed project_id description. The description adds context on when project_id is required and how to retrieve it via projects.list, providing meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the verb 'list' and resource 'alerts' with scope 'for a project'. It lists the returned fields, distinguishing it from sibling tools like alerts.create and alerts.delete.

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

Usage Guidelines4/5

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

The description explicitly advises using this tool before alerts.delete to find IDs, and to show active monitors. Examples are provided, though it does not explicitly 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.

cohorts.compareA
Read-only

Compare 2–10 saved cohorts side-by-side on retention. Returns each cohort's size and retention curve over the same period set, so you can read "did this week's signups retain better than last week's?", "is this experiment cohort behaving differently than control?", or stack a few quarters' cohorts to spot a structural retention trend — without composing the rates manually.

Order matters: the first name is treated as the primary; downstream renderings (dashboard, summaries) read deltas relative to it. Duplicates are silently deduplicated.

Examples:

  • "did April 14 signups retain better than April 7" → names="signups_apr_14,signups_apr_07"

  • "are pro-plan signups stickier than free" → names="pro_signups_q2,free_signups_q2"

  • "compare two onboarding variants out to 4 weeks" → names="onboarding_v1,onboarding_v2", periods="1w,2w,4w"

  • "three-arm experiment retention" → names="control,variant_a,variant_b"

  • "is signup retention improving quarter-over-quarter" → names="signups_q1,signups_q2,signups_q3,signups_q4"

Limitations: at most 10 cohorts per call. The same retention windows are applied to every cohort — there's no way to use different windows per slot. Sample-size caveats apply per cohort; check each size value before reading rate deltas (small cohorts make differences look meaningful when they aren't). Stacking many cohorts increases the multiple-comparisons risk — a divergent-looking row in a 5-way compare may just be random variation; commit to a hypothesis before reading.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesYesComma-separated cohort names, 2–10 entries. First name is treated as the primary. Example: "signups_apr_14,signups_apr_07" or "control,variant_a,variant_b".
periodsNoComma-separated retention windows, same format as cohorts.retention.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cohortsYes

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses key behavioral traits: order matters (first is primary), duplicates are deduplicated, retention windows are uniform across cohorts, and sample-size caveats apply. Annotations indicate readOnlyHint=true, aligning with the read-only nature of comparing cohorts. No contradiction.

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

Conciseness4/5

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

The description is thorough and well-structured, starting with purpose, then use cases, examples, and limitations. While it is somewhat lengthy, every sentence is informative and earns its place. A slightly more concise summary could improve readability, but it remains effective.

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

Completeness5/5

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

Given the availability of an output schema, the description does not need to detail return values. It covers all necessary aspects: when to use, parameter semantics, ordering, limitations, and examples. The tool is complex but the description is complete for an agent to invoke correctly.

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

Parameters5/5

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

Input schema coverage is 100%, and the description adds significant value beyond schema definitions. It explains the 'names' parameter with comma-separated format and ordering, 'periods' with reference to cohorts.retention, and 'project_id' with conditional usage guidance. Examples illustrate parameter combinations.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Compare 2–10 saved cohorts side-by-side on retention.' It identifies the specific verb (compare), resource (saved cohorts), and aspect (retention), distinguishing it from siblings like cohorts.retention (single cohort) and traffic.compare (traffic).

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

Usage Guidelines5/5

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

Explicit usage contexts are provided via examples and use cases (e.g., 'did April 14 signups retain better than April 7'). Limitations (max 10 cohorts, same windows, sample-size caveats, multiple-comparisons risk) and ordering behavior are clearly stated, guiding the agent on when and how to use this tool versus alternatives.

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

cohorts.createA

Create and persist a named cohort — a group of visitors defined by an event in a period, optionally narrowed by a property filter. The cohort is stored by name; subsequent retention/compare queries reference it without re-specifying the definition. Membership is recomputed at query time, not materialised, so the same cohort always reflects current data. Requires Pro plan.

The 0.x cohort definition is event-based: the user fired event between the period boundaries, optionally with filter.property == filter.value.

Examples:

  • "users who signed up the week of April 14" → name="signups_apr_14", definition={ event: "signup_completed", period: "2026-04-14:2026-04-20" }

  • "free-plan signups last month" → name="free_signups_last_month", definition={ event: "signup_completed", period: "30d", filter: { property: "plan", value: "free" } }

  • "customers who completed checkout in March" → name="checkouts_march", definition={ event: "checkout_completed", period: "2026-03-01:2026-03-31" }

Limitations:

  • Event-based definitions only in 0.x. Behavior cohorts ("did X then Y in order"), exclusion cohorts ("fired X but not Y"), and time-relative cohorts ("did X within N days of signup") aren't supported. The triggering event + period + property-filter shape covers ~95% of practical use cases.

  • Membership is computed at query time, so very large cohorts cost on every retention call.

  • Names must be lowercase alphanumeric with hyphens / underscores, and unique within a project — a duplicate-name create returns 409; use cohorts.delete first or pick a new name. Cohort definitions are immutable after creation; to change the event/period/filter, delete and re-create.

Pairs with: events.property_values to discover valid filter values before creating; cohorts.retention to read the curve once the cohort is created; cohorts.compare to stack 2–10 cohorts side-by-side; cohorts.list to discover existing cohort handles.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCohort name. Lowercase alphanumeric, hyphens, underscores. Used as the handle for retention / compare / delete.
definitionYesEvent-based cohort definition.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
sizeYes
definitionYes

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses that membership is recomputed at query time, cohort definitions are immutable after creation, and duplicate names return 409. It also notes the Pro plan requirement. These go beyond the annotations, which only indicate non-read-only, non-destructive, and non-idempotent.

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

Conciseness4/5

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

The description is well-structured with sections, examples, and limitations, but it is somewhat lengthy. All content is valuable, but could be slightly more concise without losing information.

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

Completeness5/5

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

Despite the complexity of nested definitions and multiple parameters, the description covers creation behavior, error handling, naming rules, and pairing with other tools. Presence of an output schema reduces need for return value details, but the description still provides sufficient context for correct usage.

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

Parameters5/5

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

The description adds value beyond the schema by providing concrete examples of definition objects, explaining period formats (ISO range vs preset), and describing filter property/value usage. This supplements the 100% schema description coverage with practical usage context.

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

Purpose5/5

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

The description clearly states the tool creates and persists a named cohort, specifying the event-based definition structure. It distinguishes from siblings like cohorts.compare and cohorts.list by explaining that this tool is for creation, and it pairs with other tools.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool (to define a cohort for later queries), provides limitations (only event-based, no behavior cohorts), and gives examples. It also advises using events.property_values to discover filter values, and mentions naming constraints and duplicate handling.

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

cohorts.deleteA
DestructiveIdempotent

Delete a saved cohort by name. Irreversible — the agent should confirm intent with the user before calling this. The underlying event data isn't touched; only the cohort definition row is removed.

Examples:

  • "delete the test cohort" → name="test_cohort"

Limitations: irreversible. Returns 404 if the cohort doesn't exist. Definition is not returned before deletion — capture it from cohorts.list first if you may need to recreate it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCohort name to delete.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds that only the cohort definition row is removed (not event data) and that the operation is irreversible, providing further behavioral context beyond annotations.

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

Conciseness5/5

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

The description is brief (4 sentences) and well-structured, starting with the main purpose, then stating irreversibility, followed by an example and limitations. Every sentence is informative with no unnecessary words.

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

Completeness5/5

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

For a simple delete tool with an output schema and comprehensive annotations, the description covers all necessary aspects: purpose, irreversibility, error condition (404), and preparation steps (capture definition from cohorts.list). It is complete for its complexity.

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

Parameters3/5

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

The input schema covers both parameters fully (100% schema description coverage). The description adds value by mentioning the name parameter explicitly and giving an example for project_id, but the schema already includes detailed descriptions for both parameters, so the additional contribution is limited.

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

Purpose5/5

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

The description states 'Delete a saved cohort by name,' clearly specifying the action (delete) and the resource (saved cohort) with an identifier (name). It distinguishes from sibling tools like cohorts.create and cohorts.list.

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

Usage Guidelines5/5

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

The description explicitly advises that deletion is irreversible and the agent should confirm intent with the user before calling. It also mentions the 404 response and suggests capturing the definition from cohorts.list first if needed, providing clear guidance on when and how to use the tool.

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

cohorts.listA
Read-only

List saved cohorts for the project. With name, returns one cohort with its current size; without, returns every cohort with their definitions. Use to discover cohort handles before calling retention or compare.

Examples:

  • "what cohorts do I have" → no params

  • "show me the signups_apr_14 cohort" → name="signups_apr_14"

Limitations: size is recomputed at fetch time and reflects current data — a cohort defined as "last 30d" returns a moving size as new events land.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCohort name to fetch one. Omit to list all.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cohortsYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, and the description adds important behavioral detail: 'size is recomputed at fetch time' and the moving nature for time-based cohorts. No contradictions.

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

Conciseness5/5

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

Two short paragraphs with examples and a limitation note. Every sentence is purposeful; no redundancy or fluff.

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

Completeness5/5

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

Given the simple list operation and presence of an output schema (not shown), the description covers what is returned, the optional parameter behavior, and a key limitation. No significant gaps.

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

Parameters4/5

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

Schema covers both parameters (project_id, name) with good descriptions. Description adds value by explaining the effect of providing 'name' vs not and giving concrete examples, but schema already provides baseline meaning.

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

Purpose5/5

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

Description clearly states 'List saved cohorts' and distinguishes two modes: with 'name' returns one cohort with size, without returns all with definitions. It explicitly positions the tool as a prerequisite for 'retention' and 'compare', differentiating from siblings.

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

Usage Guidelines4/5

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

Explicitly says 'Use to discover cohort handles before calling retention or compare' and provides examples for when to include or omit 'name'. Does not explicitly exclude other uses, but context is clear enough.

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

cohorts.retentionA
Read-only

Compute the retention curve for a saved cohort. For each requested window (e.g. day 1, 7, 14, 30 after the cohort's anchor event), returns how many cohort members fired any non-pageview-end event in that day's window, and the rate vs the cohort size.

Use this to answer "did this cohort stick around?" and to compare retention across cohorts (via cohorts.compare). The 1-day-window resolution means "7d retention" is "day 7 specifically", not "anywhere in the first 7 days" — the standard product-analytics definition.

Examples:

  • "retention curve for signups_apr_14 at day 1, 7, 14, 30" → name="signups_apr_14" (default periods)

  • "weekly retention for customers_march out to 8 weeks" → name="customers_march", periods="1w,2w,4w,8w"

  • "did onboarding cohort A retain at week 1" → name="onboarding_v2", periods="7d"

Limitations: retention measures any non-pageview-end event presence. Custom retention metrics (e.g. "retained = fired purchase event") are not in 0.x. The numerator is computed per-day, so windows like "30d" return only day-30 activity. Cohort size is the denominator and is included in the response so consumers can apply sample-size discipline.

Pairs with: cohorts.compare to stack 2–10 cohorts side-by-side at the same windows; cohorts.list to discover available cohort names.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCohort name to query.
periodsNoComma-separated retention windows. Each is `<n>d` or `<n>w` (e.g. "1d,7d,14d,30d" or "1w,2w,4w,8w"). Defaults to "1d,7d,14d,30d".
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sizeYes
cohortYes
retentionYes

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, and the description adds important behavioral details: retention measures any non-pageview-end event, numerator is per-day, cohort size is denominator, and limitations on custom metrics. 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.

Conciseness4/5

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

The description is reasonably concise and well-structured with examples and limitations. It is front-loaded with the main purpose. Each sentence adds value, though it is slightly long but not excessively so.

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

Completeness5/5

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

Given the complexity of retention analysis, the description is thorough: it covers usage, examples, limitations, and sibling tools. The output schema exists, so return values are not required. No gaps identified.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining the period format (<n>d or <n>w), default, and examples of usage. It clarifies the meaning of retention windows beyond the schema.

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

Purpose5/5

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

The description clearly states the tool computes a retention curve for a saved cohort, specifying the verb 'compute' and resource 'cohort'. It differentiates from siblings by mentioning cohorts.compare for comparisons and cohorts.list for discovery.

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

Usage Guidelines4/5

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

The description explicitly says when to use the tool (e.g., answer 'did this cohort stick around?') and provides examples. It also flags that cohorts.compare is for comparisons. However, it does not include negative guidance or explicit exclusions.

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

docs.searchA
Read-only

Keyword-search the Clamp documentation index for setup, SDK, MCP, concepts, and skills pages. Returns ranked entries with url, title, and a short description. Each match scores higher when query terms appear in the title than the description; results are capped by limit (default 5, max 10). Use when the user asks how to do something — install Clamp in Next.js, add the section-views extension, set up Money revenue, write an alert — rather than what their data shows. For data questions use the analytics tools above.

Examples:

  • "how do I install Clamp in Vite" → query="vite install"

  • "how do I track revenue from Stripe" → query="stripe revenue server"

  • "what does the section-views extension do" → query="section views extension"

  • "how do I set up an alert" → query="alerts setup"

Limitations: keyword (substring) matching only — no semantic search, so synonyms ("webhook" vs "callback") will not match. The index is hand-maintained inside the MCP server and updates only when the server is redeployed. Returns an empty array if no matches; broaden the query rather than retrying with the same terms.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results. Defaults to 5.
queryYesSearch query.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
resultsYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=true. Description adds key behavioral details: keyword-only matching (no semantic search), scoring (title matches rank higher), limitations (hand-maintained index, updates only on redeploy), and error handling (empty array). Provides substantial value beyond annotations.

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

Conciseness4/5

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

Well-structured with main info front-loaded. Examples and limitations at end. Slightly lengthy but every sentence is meaningful.

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

Completeness5/5

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

Given it's a search tool with output schema (not shown), description explains return format (ranked entries with url, title, description), limitations, and behavior details. Complete for an agent to decide and invoke correctly.

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

Parameters4/5

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

Schema covers both parameters with 100% description coverage. Description adds useful semantics: query should be keywords (not full sentences), examples for typical use cases, limit default and max. Adds moderate value beyond schema.

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

Purpose5/5

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

Clearly states the tool searches the Clamp documentation index for setup, SDK, MCP, concepts, and skills pages. Differentiates from sibling tools (analytics, alerts, etc.) by specifying it's for 'how to' questions rather than data queries.

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

Usage Guidelines4/5

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

Explicitly says 'Use when the user asks how to do something... rather than what their data shows.' Provides concrete examples. Lacks specific exclusions for data questions beyond mentioning analytics tools, but it's clear enough.

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

errors.contextA
Read-only

Breadcrumbs leading to one error: the events from the same session, before the error timestamp, in chronological order. The "what was the user doing right before this broke" view that turns a stack trace into a story.

Given an anonymous_id and the error's timestamp, finds the session that was active at that timestamp and returns up to limit events from that session strictly earlier than the error. Each event row has its name, url, pathname, referrer — enough to reconstruct the path the user took.

Examples:

  • "what did this user do right before the error" → anonymous_id from errors.list, before_timestamp = the error's timestamp

  • "show me the last 10 actions before this crash" → limit=10

  • "did the user click anything before the unhandled rejection" → check the events list for cta_click / button_clicked names

Limitations: scoped to the single session that contained the error. If the error fired during a session the user later ended (closed tab), and you pass a timestamp in a later session, you'll get that later session's events instead. Returns events only — not their full property bags (use users.journey if you need the per-event context). Default limit 20, max 100.

Pairs with: errors.list (source of the anonymous_id and timestamp pair); users.journey (multi-session view of the same user, when one-session breadcrumbs aren't enough).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax events to return. Defaults to 20, max 100. Increase only if a longer breadcrumb is needed; agents typically read the most recent ones first.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
anonymous_idYesThe visitor whose session leading up to the error you want to inspect. Pull this from an errors.list row.
before_timestampYesISO 8601 timestamp of the error itself. Returns events strictly earlier than this from the same session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
eventsYes
anonymous_idYes
before_timestampYes

TDQS

A5/5.0
Behavior5/5

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

Adds behavioral context beyond annotations: returns only earlier events, default limit 20 max 100, session scoping caveat. Annotations only provide readOnlyHint=true, and description does not contradict.

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

Conciseness5/5

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

Description is well-organized with examples, limitations, and paired tools. Each sentence serves a clear purpose. Front-loaded with core functionality.

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

Completeness5/5

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

Fully covers all aspects: parameters, outputs (event rows with name/url/pathname/referrer), limitations, use cases. Output schema exists, so return value explanation is sufficient. No gaps.

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

Parameters5/5

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

Schema coverage is 100%, but description adds real meaning: explains where to get anonymous_id (from errors.list), timestamp format, limit default and max usage. Examples reinforce parameter usage.

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

Purpose5/5

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

The description clearly states 'Breadcrumbs leading to one error: events from the same session before the error timestamp'. It distinguishes itself from siblings like errors.list and users.journey by specifying its unique role.

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

Usage Guidelines5/5

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

Explicit examples show when to use (e.g., 'what did this user do right before the error') and when not to ('use users.journey for per-event context'). Limitations are clearly stated (single session scope, timestamp alignment).

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

errors.groupsA
Read-only

Errors deduplicated by server-computed fingerprint, with counts and first/last-seen timestamps. The triage view: which bugs are firing most often, affecting the most users, or showing up newly in the period.

Each group is one fingerprint (a bug). count is total occurrences in the period; users_affected is unique anonymous_ids that hit it; first_seen and last_seen show the time window the bug appeared in. sample_message and sample_type are pulled from one occurrence in the group — useful for the agent to surface a readable label.

Examples:

  • "what's broken right now" → period="today", sort_by="count"

  • "regressions that started this week" → period="7d", sort_by="first_seen"

  • "bugs hitting the most users" → sort_by="users_affected"

  • "what just stopped firing" → check last_seen against expected freshness

Limitations: only fingerprintable errors are grouped; events with neither message nor stack get a null fingerprint and are excluded from this view (they still show up in errors.list). Default sort is by count; pass sort_by to change. Default limit 50, max 200.

Pairs with: errors.list (drill into a fingerprint to see individual occurrences with full context); errors.timeline (chart the rate of one fingerprint to spot regressions or post-deploy regressions); traffic.compare (correlate a count spike with a deploy or campaign).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows to return (1-50). Defaults to 10.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
sort_byNoOrder groups by total occurrences (default), unique users affected, most recent occurrence, or earliest occurrence. Sort is always descending.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
groupsYes
periodYes
sort_byYes

TDQS

A4.7/5.0
Behavior5/5

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

Discloses behavioral traits beyond annotations: describes the grouping logic, exclusion of null-fingerprint events, default sort and limit, and the nature of the view. Annotations only indicate read-only, which this description supports without contradiction.

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

Conciseness5/5

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

Well-structured: starts with core purpose, then describes each output field, provides concrete examples, and ends with limitations and sibling references. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the presence of an output schema (context signals), the description focuses on purpose and usage, adequately covering the output fields (count, users_affected, etc.) and pairing with other tools. No gaps for a triage-view tool.

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

Parameters3/5

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

Despite 100% schema coverage, the description adds value with usage examples for each parameter. However, it contains a contradiction: says 'Default limit 50, max 200' while schema says limit 1-50, default 10. This inaccuracy reduces reliability.

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

Purpose5/5

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

The description clearly states it aggregates errors by fingerprint with counts and timestamps, and explicitly calls it 'the triage view'. It distinguishes itself from sibling tools like errors.list (individual occurrences) and errors.timeline (rate charting).

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

Usage Guidelines5/5

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

Provides explicit examples of when to use the tool with different parameters (e.g., 'what's broken right now' → period='today', sort_by='count'). Also mentions limitations (only fingerprintable errors) and pairs with specific siblings for drill-down or correlation.

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

errors.listA
Read-only

Recent error events with full context. One row per occurrence, returned newest-first. Each row carries the error itself (message, type, stack, fingerprint, handled flag) plus the standard event context (url, browser/OS/device, country, anonymous_id, session_id) — same shape ingest enriches every other event with, so an agent can correlate "errors here, traffic there" without joining a second tool.

Errors are written to the events table with name = "$error" by the SDKs' captureError() / window.onerror auto-capture. The server adds a stable error.fingerprint at ingest (sha256 of normalized message + first stack frame), so the same bug groups across occurrences regardless of which session or SDK reported it.

Examples:

  • "what errors fired today" → period="today" (no other filters)

  • "show me all TypeError occurrences this week" → message="", or use errors.groups first to find the fingerprint

  • "errors on Safari only" → browser="Safari"

  • "errors on the same fingerprint" → fingerprint=""

  • "only the auto-captured ones, not manual reports" → handled="false"

Limitations: returns up to limit rows (default 50, max 200). Stacks are stored verbatim from the SDK with no source-map resolution — production stacks will be minified for users on a build pipeline. For aggregate counts and dedup, use errors.groups; for breadcrumbs leading to one error, use errors.context.

Pairs with: errors.groups (find a noisy fingerprint, then list its occurrences here); errors.context (drill from one error row into the events from the same session that led to it); users.journey (full multi-session view of a user who hit an error).

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoFilter by OS name (e.g. "macOS", "Windows", "iOS", "Android").
limitNoMax rows to return (1-50). Defaults to 10.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
browserNoFilter by browser name (e.g. "Chrome", "Safari", "Firefox"). Case-sensitive; use the exact value the SDK reports.
countryNoTwo-letter ISO country code (e.g. "US", "DE"). Useful when an error correlates with a CDN edge or a localization issue.
handledNoFilter to handled (manual captureError calls) or unhandled (window.onerror / unhandledrejection auto-capture). Omit to return both.
messageNoFilter by exact error message (matches the `error.message` property). Use a known message verbatim; substring matching is not supported.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
device_typeNoFilter by device type. Use this to isolate mobile-only bugs.
fingerprintNoFilter by server-computed fingerprint (16-char hex). Get fingerprints from errors.groups; same fingerprint groups all occurrences of the same bug.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
errorsYes
periodYes

TDQS

A4.9/5.0
Behavior5/5

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

Discloses behavioral traits beyond readOnlyHint: returns newest-first, default limit, max limit, no source-map resolution, how errors are captured and grouped (fingerprint). The description adds value that annotations alone do not capture.

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

Conciseness5/5

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

The description is well-structured: first sentence core purpose, second paragraph ingest details, third paragraph examples, fourth limitations and paired tools. Every sentence adds value despite length. Front-loaded with essential information.

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

Completeness5/5

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

Given the tool's complexity (10 parameters, rich output, many siblings), the description covers return structure, filtering, limitations, and pairing with alternatives. Output schema exists, so return values are not required to be repeated. The description is complete and actionable.

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

Parameters4/5

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

Input schema has 100% description coverage, so baseline is 3. The description adds value by providing usage patterns (e.g., period='today', browser='Safari') and clarifying the fingerprint parameter (16-char hex from errors.groups). This extra context raises the score above baseline.

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

Purpose5/5

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

The description clearly states the tool lists recent error events with full context, one row per occurrence, newest-first. It distinguishes itself from sibling tools (errors.groups for aggregates, errors.context for breadcrumbs) and specifies the exact shape of each row (error details plus standard event context).

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

Usage Guidelines5/5

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

Provides explicit guidelines: examples of queries (by period, message, browser, fingerprint, handled flag), limitations (max rows, no source-map resolution), and clear when-to-use alternatives (e.g., errors.groups for aggregate counts, errors.context for breadcrumbs). Pairs with sibling tools are explicitly stated.

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

errors.timelineA
Read-only

Error count over time, bucketed hourly or daily. Optionally scoped to one fingerprint. Use this to spot regressions ("when did this bug start firing?") or post-deploy spikes ("did the deploy at 14:00 break something?").

Returns a series of { bucket, count } rows. The bucket field is an ISO timestamp aligned to the start of the interval. Buckets with no errors are omitted (sparse series); the agent should treat missing buckets as zero.

Examples:

  • "error rate over the last week" → period="7d" (returns hourly buckets)

  • "did errors spike after yesterday's deploy" → period="2d", interval="hour"

  • "is this specific fingerprint getting worse" → fingerprint="", period="30d"

  • "yearly error trend" → period="365d", interval="day"

Limitations: interval defaults to "hour" for periods ≤ 7 days, "day" otherwise. Override only if the default produces too few or too many buckets for the question. No fingerprint filter returns the total error rate across all bugs.

Pairs with: errors.groups (find which fingerprint is worth charting); traffic.timeseries (compare error count to traffic count to see if the rate is real or just a traffic surge); traffic.compare (week-over-week or before-after-deploy comparison).

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
intervalNoBucket size. Defaults to "hour" for periods ≤ 7 days, "day" otherwise.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
fingerprintNoOptional fingerprint (16-char hex from errors.groups) to scope the chart to one bug. Omit for total error rate.

Output Schema

ParametersJSON Schema
NameRequiredDescription
periodYes
seriesYes
intervalYes
fingerprintYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description adds behavioral context: sparse series with omitted zero buckets, ISO timestamp format, and automatic interval defaults. 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.

Conciseness4/5

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

The description is well-structured with a clear opening, examples, and pairing suggestions. Though lengthy, each section adds value. Could be slightly trimmed, but overall effective.

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

Completeness5/5

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

Given the output schema existence (though not shown), the description sufficiently explains return format and sparse series behavior. It covers all needed context for an agent to use the tool effectively.

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

Parameters4/5

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

With 100% schema coverage, baseline is 3. The description provides additional context beyond schema, such as default behavior for interval and period, and examples mapping natural language queries to parameters, improving usability.

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

Purpose5/5

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

The description clearly states the tool's function as returning error counts over time bucketed hourly or daily, and distinguishes it from siblings by mentioning optional fingerprint scoping and pairing with related tools like errors.groups and traffic.timeseries.

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

Usage Guidelines4/5

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

It provides explicit use cases (spot regressions, post-deploy spikes) and explains when to override defaults. While it doesn't explicitly state when not to use, it lists alternative tools for comparison, giving implicit guidance.

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

events.listA
Read-only

Lists custom events (user-defined). Excludes all $-prefixed system and canonical revenue events ($pageview, $pageview_end, $web_vital, $section_viewed, $error, $subscription_started, $subscription_canceled, …). Use revenue.* tools for billing events. Without a name filter, returns every custom event name in the period with its total count and unique-visitor count. To inspect a $-prefixed system event explicitly, pass it via name (e.g. name="$error"). With compare=true (only meaningful on the unfiltered list), each row also carries prev_count and prev_visitors from the equal-length previous period — events absent now but present before appear with count=0 (the "dead event" signal). With a name filter, returns the count for that single event, optionally filtered by a custom property key/value pair and grouped by another property key. Custom events are tracked client-side via clamp.track("event_name", { key: "value" }) or server-side via @clamp-sh/analytics/server.

Property values can be strings, numbers, or booleans (each stored in a separate column). When filtering or grouping by a numeric or boolean property, set value_type / group_by_type so the lookup hits the right column — otherwise the default ("string") will silently miss native number/boolean data. Use the project's event-schema.yaml to know each property's type.

Examples:

  • "what events are being tracked" → no params (lists all event names)

  • "how many signups this week" → name="signup", period="7d"

  • "signups grouped by plan" → name="signup", group_by="plan"

  • "paid signups only" → name="signup", property="plan", value="pro"

  • "checkouts where item count was 5" → name="checkout", property="count", value="5", value_type="number"

  • "events grouped by a numeric tier_id" → name="upgrade", group_by="tier_id", group_by_type="number"

Limitations: only one property/value pair per call. group_by only works when a name filter is set. Returns at most limit rows per group (default 10, max 50). For revenue use revenue.sum, which understands the Money type.

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
nameNoFilter to a specific event name (e.g. "signup", "checkout_completed", "button_clicked"). Event names are case-sensitive strings set by the developer.
limitNoMax rows to return (1-50). Defaults to 10.
valueNoFilter to events where the property key equals this value. Must be used together with the "property" parameter. Pass the value as a string regardless of underlying type; combine with "value_type" for numbers/booleans.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
compareNoWhen true (only meaningful on the unfiltered listing — no `name`, no `group_by`), each row also carries `prev_count` and `prev_visitors` from the equal-length previous period. Events absent now but present before appear with count=0 (dead-event signal). Defaults to false.
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
group_byNoGroup results by this custom property key (e.g. "plan" to see signups broken down by plan). Returns each unique value with its count. Must be used with a name filter.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
propertyNoA custom property key to filter or group by (e.g. "plan", "source", "button_id"). Property keys are strings, max 128 chars. Only works when a name filter is set.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
value_typeNoType of the value being filtered. Defaults to "string". Set to "number" or "boolean" when the property is declared as such in event-schema.yaml — otherwise the lookup hits the wrong column and returns no matches.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
group_by_typeNoType of the group_by property. Defaults to "string". Set to "number"/"boolean" for numeric/boolean properties; results come back stringified ("5", "true") for transport.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true. The description adds extensive behavioral details: excluded events, dead-event signal with compare, type handling and silent misses if value_type wrong, max limit, and more. No contradictions.

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

Conciseness4/5

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

Description is lengthy but well-structured with paragraphs, examples, and bullet points. Front-loaded core purpose. Each part adds value given the tool's complexity. Could be slightly more concise, but earns its length.

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

Completeness5/5

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

With 26 parameters and an output schema, the description is very complete: covers all behaviors, filtering options, compare mode, type handling, limitations, and examples. Return values are implied; output schema exists so not needed. Highly informative.

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

Parameters4/5

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

Schema coverage is 100% so baseline is 3. The description adds significant value through examples, interaction explanations (e.g., compare only works without name/group_by), and practical context (e.g., event names case-sensitive, property keys max 128 chars). Slightly above baseline but not a full 5 as schema already describes each parameter well.

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

Purpose5/5

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

The description clearly states it lists custom events, explicitly excludes $-prefixed system and revenue events, and distinguishes from revenue.* tools. It covers behavior with and without name filter, making the purpose very specific.

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

Usage Guidelines5/5

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

Provides explicit guidance: when to use (custom events), when to use alternatives (revenue.sum for billing), limitations (one property/value pair, group_by only with name filter), and examples for various use cases.

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

events.observed_schemaA
Read-only

Return what's actually firing into ingest as a structured signature, for diffing against the project's authored event-schema.yaml. Scoped to custom user-defined events; all $-prefixed system and canonical revenue events are excluded by default. Different shape from the YAML — this is observation, not declaration.

Response shape:

{
  period: "30d",
  events: [
    { name: "checkout", count: 42,
      properties: {
        plan:  [{ type: "string", occurrences: 42 }],
        count: [{ type: "number", occurrences: 39 },
                { type: "string", occurrences: 3 }]   // ← drift!
      }}
  ]
}

Each property value is an array of typed observations. One entry = the key consistently fired with one type. Two-plus entries = same key fired under multiple storage columns in the period, which is exactly the silent-type-drift signal you want to surface (one call site sending count: 5, another sending count: "5").

Use it to compare declared vs reality:

  • Events declared, missing here → dead instrumentation

  • Events here, not declared → unauthored events firing

  • Properties on a declared event missing from the schema → silent property drift

  • properties[key].length > 1 → type-column collision; one of the call sites is sending the wrong type

Examples:

  • "what events are firing in production" → no params (defaults to 30d, excludes SDK-internal events)

  • "did the spec drift this week" → period="7d"

  • "include the SDK's automatic events too" → include_pageviews=true

Limitations: returns keys + types only, no property values. occurrences is row-level (each event firing counts), not unique visitors. Custom user-defined events only — all $-prefixed system and canonical revenue events ($pageview, $pageview_end, $web_vital, $section_viewed, $error, $subscription_started, $subscription_canceled, …) are excluded by default since the SDK owns their schema. Set include_pageviews=true to include them.

Pairs with: events.list for per-event volume context (this tool also returns count, but events.list supports filters and grouping); the local event-schema.yaml for declared-vs-observed diff.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
include_pageviewsNoInclude $-prefixed system and canonical revenue events ($pageview, $pageview_end, $web_vital, $section_viewed, $error, $subscription_started, $subscription_canceled, …) in the output. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventsYes
periodYes

TDQS

A4.8/5.0
Behavior5/5

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

The description fully discloses behavioral traits beyond annotations. It explains the response shape, including the array of typed observations to detect type drift. It mentions limitations: 'returns keys + types only, no property values' and that occurrences are row-level. It also clarifies the default exclusion of $-prefixed system events and how to include them. No contradiction with annotations (readOnlyHint=true).

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

Conciseness4/5

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

The description is well-structured with a clear purpose, examples, a response shape block, and usage guidance. It front-loads the main purpose and uses bullet points for examples. However, it is somewhat lengthy and could be more concise by reducing the detailed list of system events.

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

Completeness5/5

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

Given the tool's complexity and the presence of an output schema (implied by context signals), the description is complete. It covers the tool's purpose, usage, response shape, limitations, and pairing with siblings. It leaves no significant gaps for an agent to understand how to select and invoke the tool.

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

Parameters4/5

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

Although schema description coverage is 100%, the description adds significant meaning beyond the schema. For period, it gives examples of valid values and defaults. For include_pageviews, it lists the specific events included. For project_id, it explains when it's required and how to discover project IDs. This adds context that the schema does not provide.

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

Purpose5/5

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

The description clearly states the tool's function: 'Return what's actually firing into ingest as a structured signature, for diffing against the project's authored event-schema.yaml.' It specifies the verb (return), the resource (firing events), and the purpose (diffing). It distinguishes itself from sibling tools by mentioning that it excludes system events and that it is observation-based, not declaration-based.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use the tool: 'Use it to compare declared vs reality' with concrete examples such as 'what events are firing in production' and 'did the spec drift this week.' It also explains when to use parameters (e.g., 'include the SDK's automatic events too' for include_pageviews) and how to set period. Additionally, it pairs the tool with siblings and the local event-schema.yaml.

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

events.property_valuesA
Read-only

Top distinct values a string-typed property has taken on a specific event in the period, ranked by occurrence count. Useful when you need to know the value space before filtering — e.g. cohort definitions, segment filters, "what values does plan take on signup?".

Response shape:

{
  event: "signup",
  property: "plan",
  period: "30d",
  values: [
    { value: "free", count: 412 },
    { value: "pro",  count: 138 },
    { value: "growth", count: 22 }
  ]
}

Examples:

  • "what plans do signups come from" → event="signup", property="plan"

  • "which countries hit the checkout event" → event="checkout", property="country" (only if you instrument it as a property; otherwise use traffic.breakdown)

  • "what source values does the lead event carry" → event="lead", property="source"

Limitations: STRING properties only — same scope as cohort filter values (cohort filtering is string-equality only). Numeric / boolean / money properties are out of scope. Results are capped at limit (default 50, max 200) so very high-cardinality properties (user_id, session_id, URLs) are truncated to the top-N by count. Events without the property at all are skipped — only rows where the property is present and non-empty contribute.

Pairs with: events.observed_schema to discover which properties an event actually fires; cohorts.create to scope a cohort by a specific value of those.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventYesEvent name (e.g. "signup", "checkout_completed"). Required — values are scoped to one event at a time.
limitNoMax distinct values to return, ranked by count desc (1-200). Defaults to 50.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
propertyYesProperty key on the event (e.g. "plan", "source"). Required. Only string-typed properties are surfaced; pass a numeric/boolean property name and you'll get an empty `values` array.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventYes
periodYes
valuesYes
propertyYes

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint, and description adds behavior: only string properties, non-string returns empty array, results capped at limit, events without property skipped. No contradiction.

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

Conciseness5/5

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

Front-loaded with purpose, followed by examples and limitations. Every sentence earns its place. Concise yet comprehensive, no unnecessary text.

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

Completeness5/5

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

For a 5-parameter tool with output schema, the description covers return shape (via example), use cases, limitations, and pairing with siblings. All critical context for correct invocation is provided.

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

Parameters5/5

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

Schema coverage is 100%; description adds value with examples (event='signup', property='plan'), period format details, limit defaults, and behavior for invalid property type. Each parameter's role and constraints are well explained.

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

Purpose5/5

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

The description clearly states the tool returns top distinct values for a string-typed property on an event, ranked by count. It differentiates from siblings by referencing events.observed_schema for property discovery and traffic.breakdown for country data, and pairs with cohorts.create.

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

Usage Guidelines5/5

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

Explicitly states when to use: to understand value space before filtering (cohort definitions, segment filters). Provides examples and limitations (string only, capped results, omitted events). Also suggests alternative pattern with other tools.

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

funnels.createA

Create and immediately evaluate a conversion funnel. A funnel measures how many unique visitors complete an ordered sequence of steps. Returns step-by-step counts, per-step conversion rates (vs the previous step), and overall conversion (last step / first step). The funnel is saved by name and can be re-evaluated later or for different periods via funnels.list.

Step format: a custom event name like "signup", a pathname-scoped pageview like "pageview:/pricing", and optionally one or more property predicates appended in brackets — "cta_click[location=hero_primary]" matches only cta_click events whose location property equals "hero_primary". Stack predicates to AND them: "cta_click[location=hero_primary][plan=pro]". Predicates work on pageview steps too: "pageview:/pricing[utm_source=google]". Requires Pro plan.

Predicates default to string-typed comparisons (the property is read from the string column). For number- or boolean-typed properties (declared as such in event-schema.yaml), append a type tag: "purchase[count:n=5]" matches numeric 5; "checkout[refunded:b=false]" matches boolean false; "purchase[plan:s=5]" forces string matching when the value looks numeric. Tags: ":n" number, ":b" boolean (true|false|1|0), ":s" string (default).

Examples:

  • pricing-to-signup → name="pricing-to-signup", steps=["pageview:/pricing", "signup"]

  • which CTA actually converts → name="hero-cta-funnel", steps=["cta_click[location=hero_primary]", "signup_completed"]

  • onboarding flow → name="onboarding", steps=["signup", "onboarding_started", "onboarding_completed", "first_purchase"]

  • multi-item checkouts only → name="multi-item-checkout", steps=["pageview:/cart", "checkout_completed[items:n=3]"]

  • non-refunded purchases → name="purchase-net", steps=["pageview:/pricing", "purchase[refunded:b=false]"]

  • blog-to-newsletter → name="blog-newsletter", steps=["pageview:/blog", "newsletter_subscribed"]

Limitations: between 2 and 10 steps; step strings ≤500 chars; names ≤200 chars. Step order matters — once a session skips a step, it cannot complete later steps. Pageview pathnames match exact strings only (no wildcards). Predicate keys must be snake_case; string values may not contain ']' or '['. Number predicates require a finite value; boolean predicates require true|false|1|0. Funnel evaluation is per-session, not per-user across devices. Names must be unique within a project — a duplicate-name create returns 409; use funnels.delete first or pick a new name. Funnel definitions are immutable after creation; to change steps, delete and re-create.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesA descriptive display name for this funnel (e.g. "Pricing → Signup", "Onboarding flow", "pricing-to-signup"). Used to retrieve it later. Permissive charset — spaces, capitals, arrows, and punctuation are all fine. Must not contain "/", ",", "[", or "]" because those collide with URL routing and the step-DSL grammar. Max 200 chars.
stepsYesOrdered array of 2-10 funnel steps. Each step: a custom event name ("signup"), a pathname-scoped pageview ("pageview:/pricing"), or either form with property predicates appended in brackets ("cta_click[location=hero_primary]", "pageview:/pricing[utm_source=google]"). Stack predicates to AND them: "cta_click[location=hero_primary][plan=pro]". Predicates default to string matching; append ":n" for number ("checkout[items:n=3]"), ":b" for boolean ("purchase[refunded:b=false]"), or ":s" to force string when the value looks numeric ("plan:s=5").
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
stepsYes
periodYes
overall_conversionYes

TDQS

A4.9/5.0
Behavior5/5

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

Discloses behavioral traits beyond annotations: funnel saved and re-evaluable, per-session evaluation, immutable definitions (delete and re-create), step order importance, name uniqueness, and step DSL constraints. 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.

Conciseness4/5

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

Long but well-structured: core purpose first, then step format, examples, limitations. Every sentence adds value, though could be slightly more concise given the complexity.

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

Completeness5/5

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

Covers all essential aspects: step format, examples, limitations, error cases (duplicate name), and return values (step counts, conversion rates). Despite no output schema shown, description adequately describes behavior.

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

Parameters5/5

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

Schema coverage is 100%, but description adds extensive meaning: steps DSL with predicate types, examples, and limitations; name charset and collision info; project_id multi-project handling. Goes far beyond schema.

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

Purpose5/5

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

The description clearly states the tool creates and immediately evaluates a conversion funnel, explains what a funnel measures, and returns step-by-step counts and conversion rates. It distinguishes from siblings like funnels.list (re-evaluation) with specific verb and resource.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance, including handling duplicate names (409 error, suggests delete or new name), contrasts with funnels.list, and includes limitations (2-10 steps, char limits, step order, pageview exact match).

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

funnels.deleteA
DestructiveIdempotent

Delete a saved funnel by name. Irreversible — the agent should confirm intent with the user before calling this. The underlying event data isn't touched; only the funnel definition row is removed.

Since funnel definitions are immutable post-creation, deleting and re-creating is the canonical way to "edit" a funnel — change the name or the steps, call delete, then funnels.create.

Examples:

  • "delete the old onboarding funnel" → name="onboarding-v1"

  • "remove the test funnel I just created" → name="test"

Limitations: irreversible. Returns 404 if the funnel doesn't exist. Definition is not returned before deletion — capture it from funnels.list first if you may need to recreate it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFunnel name to delete.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes

TDQS

A4.7/5.0
Behavior5/5

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

Adds context beyond annotations: describes irreversibility, that only definition is removed (not events), and that definition isn't returned before deletion. No contradiction.

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

Conciseness4/5

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

Well-structured with main action first, then warnings, alternatives, examples, and limitations. Slightly lengthy but all sentences add value.

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

Completeness4/5

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

Covers key aspects: purpose, irreversibility, editing pattern, error behavior, and prerequisites. Output schema exists but not described, which is acceptable.

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

Parameters4/5

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

Schema coverage is 100% and description adds examples and clarifies project_id requirements. The name parameter is straightforward, but the extra context enhances usefulness.

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

Purpose5/5

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

The description clearly states 'Delete a saved funnel by name' with specific verb and resource. It distinguishes from siblings by explaining the editing workflow (delete+create).

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

Usage Guidelines5/5

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

Explicitly advises confirming with user before calling, describes when to use (delete) and not (edit via delete+create), provides examples, and notes limitations (irreversible, 404).

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

funnels.listA
Read-only

Retrieve and re-evaluate a previously created funnel against current data for the specified period. Without a name, lists all funnels saved for the project. With a name, returns the same step-by-step counts and conversion rates as funnels.create, recomputed for the requested period and any cohort filters. Cohort filters (channel, country, device_type, utm_*) let you compare conversion across segments — e.g. mobile users from the US who came via organic search.

Examples:

  • list all funnels → no params

  • "how is pricing-to-signup converting this month" → name="pricing-to-signup", period="30d"

  • "mobile conversion for onboarding" → name="onboarding", device_type="mobile"

  • "paid traffic vs organic conversion" → call twice with channel="paid" then channel="organic_search"

Limitations: returns 404 if no funnel exists by that name — call funnels.list with no name first to enumerate. Cohort filters apply at the session level, not retroactively per step. Funnel definitions are immutable after creation (re-create with a new name to change steps).

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
nameNoThe funnel name to retrieve. Omit to list all funnels for the project.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
funnelsYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description adds that the funnel is re-evaluated against current data, returns step-by-step counts and conversion rates, cohort filters are session-level and not retroactive, and funnel definitions are immutable. No contradictions with annotations.

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

Conciseness5/5

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

The description is well-structured: a concise core explanation, followed by practical examples, and then limitations. Every sentence adds useful information without redundancy.

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

Completeness5/5

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

Given the complexity (19 optional parameters), the description covers primary use cases, provides examples for common patterns, and notes limitations. The output schema exists to document return values, so the description is sufficiently complete for usage.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining how cohort filters work in combination, providing example parameter values, and stating defaults (e.g., period defaults to '30d'). This enriches the semantic understanding beyond the param descriptions.

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

Purpose5/5

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

The description clearly states it retrieves and re-evaluates funnels, distinguishes between listing all (no 'name') and getting a specific one (with 'name'), and contrasts with funnels.create for re-evaluation. It differentiates from sibling tools like funnels.create and funnels.delete.

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

Usage Guidelines5/5

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

Provides explicit examples for common scenarios (list all, specific funnel with period, segment filters, comparing segments). Mentions when to call without name first to avoid 404, and implies when to use funnels.create instead for new funnels.

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

pages.engagementA
Read-only

Per-page metrics with a selectable detail level. The view parameter chooses what comes back:

  • view="summary" (default): pathname, pageviews, visitors. Cheap; use as the standard "top pages" call.

  • view="engagement": adds avg_engagement_seconds (active tab time from the SDK's pageview_end beacon), bounce_rate (% of single-page sessions that started on this path), avg_max_scroll (mean max scroll % the user reached on the page), and scroll_distribution (cumulative % of pageview_end events that reached 25/50/75/100 scroll depth — answers "how far do visitors actually get down this page"). Use to answer "which pages hold attention", "which pages bounce", or "are visitors reading past the fold".

  • view="sections": returns per-section view counts for the specified pathname. Requires pathname to be set. Each section is a data-clamp-section element on that page, counted once per session when at least 40% scrolls into view. Use to answer "which parts of /pricing get seen" or "is the FAQ being read".

Examples:

  • "top pages this week" → view omitted (or "summary"), period="7d"

  • "which pages bounce hardest" → view="engagement", then sort by bounce_rate

  • "how far down /pricing do people scroll" → view="sections", pathname="/pricing"

Limitations: avg_engagement_seconds is null for pages without pageview_end data (SDK <0.3 or pages closed during navigation). view="sections" requires the section-views SDK extension installed (see /docs/sdk/extensions/section-views) and only counts elements with the data-clamp-section attribute — pages with no instrumented sections return []. view="sections" without pathname returns 400.

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
viewNoDetail level. "summary" (default) returns pathname/pageviews/visitors only. "engagement" adds avg_engagement_seconds and bounce_rate. "sections" returns per-section view counts for the pathname (requires pathname).
limitNoMax rows to return (1-50). Defaults to 10.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pagesNo
sectionsNo

TDQS

A4.7/5.0
Behavior5/5

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

Goes beyond the readOnlyHint annotation by detailing behavior: null values for avg_engagement_seconds, SDK requirements for sections, 400 error without pathname, and the definition of bounce_rate and scroll metrics. No contradictions with annotations.

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

Conciseness5/5

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

Well-structured with bullet points for each view, followed by examples. Every sentence is informative, no padding. Front-loaded with the core purpose.

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

Completeness5/5

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

Given the complexity (20 parameters, output schema exists), the description fully explains the tool's purpose, three modes, and key behavioral quirks. An agent can confidently select and invoke this tool with the provided information.

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

Parameters4/5

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

Schema covers all 20 parameters with 100% coverage, so the description focuses on the view parameter's impact, which is the key differentiator. Adds examples and limitations that clarify parameter usage beyond the schema alone.

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

Purpose5/5

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

The description clearly states it returns per-page metrics with three distinct detail levels: summary, engagement, and sections. Each level is defined with specific returned fields and use cases, distinguishing this tool from siblings like traffic.overview or sessions.paths.

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

Usage Guidelines4/5

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

Provides explicit guidance on when to use each view, with examples like 'top pages this week' for summary and 'which pages bounce hardest' for engagement. Explains limitations and prerequisites, but lacks explicit instructions on when to avoid this tool in favor of alternatives.

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

projects.listA
Read-only

List all Clamp projects this credential can access. Returns each project's id, name, and plan ('free', 'pro', or 'growth'). Use this when the user asks "which sites do you see" or when the agent needs a project_id to disambiguate before calling another tool — most other tools auto-resolve when the credential has access to exactly one project, so explicit calls are only needed for multi-project setups.

Examples:

  • "which sites are tracked" → projects.list

  • before drilling into a specific project's data when several exist

Limitations: returns an empty array if the credential is org-scoped but has no projects yet. The plan field is the current billing plan, not a permission level.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
projectsYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, but description adds valuable context: returns empty array if org-scoped with no projects, and clarifies plan field is billing plan not permission. No contradiction with annotations.

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

Conciseness5/5

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

Description is concise yet comprehensive: single paragraph split into purpose, usage guidance, examples, and limitations. No fluff, every sentence adds value.

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

Completeness5/5

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

Given zero parameters and existence of output schema, description covers return fields, use cases, and edge cases (empty array, plan interpretation). Complete for a listing tool.

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

Parameters4/5

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

No parameters exist in input schema, so baseline is 4. Description adds no parameter information but none is needed; the tool is simple with no configuration.

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

Purpose5/5

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

The description clearly states the tool lists all accessible Clamp projects with id, name, and plan. It uniquely identifies the tool's purpose among siblings by specifying that it's for listing projects, contrasting with other tools like alerts, cohorts, etc.

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

Usage Guidelines5/5

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

Explicitly states when to use (e.g., user asks 'which sites do you see', need project_id) and when not needed (most tools auto-resolve for single-project). Includes concrete examples like 'which sites are tracked' and before drilling into specific project data.

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

revenue.retentionA
Read-only

Cohort revenue retention. Anchors each customer at their first cohort event (default: $subscription_started), then reports user retention + dollar retention at each anniversary window (default: 7d, 30d, 60d, 90d). Use this to answer "are customers sticking around?" and "is revenue churning, flat, or expanding?" in one round-trip.

Math is MRR-on-MRR: for each member, mrr_at_d is the cumulative sum of mrr_delta from anchor through anchor + d (the member's current MRR balance at that point). Retained members are mature members with mrr_at_d > 0. NRR = sum(mrr_at_d) / sum(baseline_mrr) across the same mature cohort — above 1.0 means net expansion (upgrades > churn), below 1.0 means contraction.

mature_size < size for windows the cohort isn't old enough to reach yet (e.g. a 90d window for a 30d-old cohort). Use mature_size to dim early windows or label them "cohort not yet mature".

Examples:

  • "what's our 30d retention" → read retention[].window=="30d".retention_rate (null when no mature members)

  • "are we expanding or contracting" → compare nrr across windows

  • "how many of last quarter's signups are still paying" → cohort_period="90d", read retention[].window=="90d"

Limitations: anchor is the user's FIRST cohort event in the period — re-subscribers after a cancel won't get a new anchor. The math assumes mrr_delta is set on $subscription_started / $subscription_canceled / plan-change events; events without mrr_delta don't affect the running balance. Canonical billing events are $-prefixed on the wire — pass cohort_event="$subscription_started" (not bare subscription_started) to anchor on them.

ParametersJSON Schema
NameRequiredDescriptionDefault
windowsNo
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
cohort_eventNo
cohort_periodNo
cohort_filter_valueNo
cohort_filter_propertyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
sizeYes
cohortYes
currencyYes
retentionYes
baseline_mrrYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description details the MRR-on-MRR math, how mature_size works, and event requirements (e.g., $ prefix). No contradictions.

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

Conciseness5/5

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

Well-structured: purpose first, then math, then examples, then limitations. Every sentence adds value, and the description is front-loaded.

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

Completeness5/5

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

For a complex tool without an output schema provided, the description fully explains output concepts (retention_rate, mature_size, NRR) and how to interpret results. Covers limitations and edge cases.

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

Parameters3/5

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

Defaults for cohort_event and windows are explained, and the $ prefix for events is highlighted. However, cohort_filter_property and cohort_filter_value are not described; schema coverage is only 17%.

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

Purpose5/5

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

The description clearly states the tool computes cohort revenue retention, anchoring at first cohort event and reporting user and dollar retention per window. It distinguishes itself from sibling 'cohorts.retention' by focusing on revenue metrics.

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

Usage Guidelines4/5

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

Provides concrete examples of queries and mentions limitations (e.g., re-subscribers). Lacks explicit comparison to sibling tools like 'revenue.sum' but gives good context.

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

revenue.sumA
Read-only

Sum revenue from Money-typed event properties. Returns per-currency totals, optionally grouped by a traffic dimension (referrer_host, channel, country, device_type, pathname, utm_source/medium/campaign). Different currencies are never mixed in a single sum — each row is one (group, currency) pair. Money properties are tracked via clamp.track("purchase", { total: { amount: 29, currency: "USD" } }) — see /docs/concepts/revenue for the full Money type.

Attribution: attribution_model="last_touch" (default) groups revenue by the dimensions of the session where the revenue event fired — answers "what surface was active at conversion?". attribution_model="first_touch" joins each revenue event with the visitor's earliest-known session and groups by that session's acquisition dimension — answers "where did my paying customers actually come from?". For multi-visit funnels (typical B2B SaaS), first-touch is usually the more honest read on which channels actually drive revenue.

Examples:

  • "total revenue this month" → no group_by, period="30d"

  • "revenue by channel" → group_by="channel", period="30d"

  • "where did paying customers actually come from" → group_by="channel", attribution_model="first_touch"

  • "first-touch revenue per UTM campaign" → group_by="utm_campaign", attribution_model="first_touch"

  • "how much did Stripe purchases bring in from organic search" → event="purchase", channel="organic_search"

  • "top revenue countries" → group_by="country"

Limitations: events without any Money property contribute zero. If property is set, only that one Money key is summed; omitted, every Money property on matched events is included. Stripe-typed revenue (recommended) flows through server-side webhooks; client-only revenue is subject to ad-blocker loss. attribution_model="first_touch" only supports acquisition-dimension group_by (channel, referrer_host, utm_*); first-touch country / device / pathname are rejected because they're rarely what people actually mean by them. First-touch breakdowns are extremely sensitive to small samples — at single-digit paying-customer counts the per-channel rate is dominated by 1-2 users' acquisition history; check visitors before reading the rate, or pair with users.journey to validate against specific customers.

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
eventNoFilter to a specific event name (e.g. "purchase", "checkout_completed"). Omit to sum Money properties across all events.
limitNoMax rows to return (1-50). Defaults to 10.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
group_byNoGroup revenue by a traffic dimension. Returns one row per (dimension, currency) pair. Omit for a single total per currency.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
propertyNoRestrict the sum to a single Money property key on the event (e.g. "total", "mrr", "ltv"). Omit to sum every Money-typed property on matched events.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.
attribution_modelNoAttribution model. "last_touch" (default) groups by the dimensions of the session where revenue fired. "first_touch" joins each revenue event with the visitor's earliest session and groups by that session's acquisition dim. First-touch only supports group_by in acquisition dimensions (channel, referrer_host, utm_*).

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes

TDQS

A4.7/5.0
Behavior5/5

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

Discloses key behaviors beyond readOnlyHint: never mixes currencies, attribution model differences, first-touch limitations, ad-blocker loss for client-only revenue. 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.

Conciseness4/5

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

Description is long but well-organized into sections (core, attribution, examples, limitations). Front-loaded with purpose. A minor condensation could be beneficial, but every sentence earns its place.

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

Completeness5/5

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

Given 23 optional parameters, existence of output schema, and the complexity of revenue attribution, the description covers usage patterns, edge cases, and limitations comprehensively for an AI agent.

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

Parameters5/5

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

Schema coverage is 100% with clear descriptions. The description adds significant value: explains attribution models in detail, provides practical examples, clarifies default behaviors (no group_by gives total per currency, property omitted sums all Money properties).

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

Purpose5/5

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

The description clearly states the tool sums revenue from Money-typed event properties, returns per-currency totals, and optionally groups by a traffic dimension. It distinguishes from sibling tools (e.g., traffic.breakdown, funnels) by focusing on revenue summation.

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

Usage Guidelines4/5

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

Provides explicit when-to-use (sum revenue) and when-not (events without Money property contribute zero). Includes examples and limitations (first-touch only supports acquisition dimensions, small-sample sensitivity). Does not explicitly name alternative tools but the context signals and sibling list provide differentiation.

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

revenue.summaryA
Read-only

One call that returns the canonical revenue dashboard. Bundles every KPI tile + per-plan + per-product rollup + prior-period comparison into one round-trip. Use this for "how's revenue doing?" questions.

Returns:

  • total_revenue per currency (sum of every Money-typed property in the period)

  • revenue — total in the dominant currency (a flat number)

  • customers — distinct paying users (user_id when identified, else anonymous_id)

  • orders — count of revenue events in the period

  • aov — revenue / orders

  • ltv — mean cumulative revenue per paying customer to date

  • mrr — running balance of mrr_delta through period end (null when not subscription-shaped)

  • arr — mrr × 12 (null when mrr is null)

  • is_subscription — true when any plan carries non-zero mrr_contribution OR the project's running MRR is non-zero

  • has_one_time — true when any non-subscription revenue event landed in the period (mixed sellers have both flags set)

  • plans[] — per-plan rollup: revenue (in period), mrr_contribution (CUMULATIVE MRR balance per plan AT PERIOD END — forward-looking, not the in-period delta), customers

  • products[] — per-product rollup: groups by the reserved product property, falls back to event name when product isn't set

  • comparison — per-metric % change vs the prior period of equal length (revenue, customers, orders, aov, ltv, mrr, arr)

Examples:

  • "how's MRR this month" → period="30d", read mrr + comparison.mrr.change

  • "which plan has the most paying customers" → read plans[], sort by customers

  • "ARPU" → revenue / customers (no top-level field; divide client-side)

  • "top one-time products by revenue" → read products[], already sorted desc

  • "do we have any subscription customers" → read is_subscription

Limitations: MRR/ARR/per-plan mrr_contribution require events to carry the reserved mrr_delta numeric property (set automatically by clamp.revenue() with billing="monthly" or "annual"). MRR is reported only in the project's dominant currency; multi-currency MRR is a future scope. customers uses user_id when present (clamp.identify() was called) and falls back to anonymous_id otherwise — counts are honest but can over-count if a paying customer uses two devices without identifying. For per-channel/per-campaign revenue, use revenue.sum with group_by + attribution_model="first_touch". For cohort retention with NRR, use revenue.retention.

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
aovYes
arrYes
ltvYes
mrrYes
plansYes
ordersYes
periodYes
revenueYes
currencyYes
productsYes
customersYes
comparisonYes
has_one_timeYes
total_revenueYes
is_subscriptionYes

TDQS

A4.6/5.0
Behavior5/5

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

Discloses all return fields in detail, limitations (MRR requires mrr_delta, customer counting caveat), and is consistent with readOnlyHint=true annotation. No contradiction.

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

Conciseness4/5

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

Well-structured with clear opening, bulleted returns, examples, and limitations. Slightly long but every section serves a purpose. Front-loaded with the core purpose.

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

Completeness5/5

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

Completely covers the tool's behavior with detailed return fields, usage examples, limitations, and alternatives. With 18 parameters and rich output, the description is exhaustive and actionable.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description does not add new meaning to parameters beyond schema; it references parameters in examples but does not elaborate on individual parameter semantics.

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

Purpose5/5

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

The description clearly states the tool returns a revenue dashboard with specific KPIs, and distinguishes from siblings like revenue.sum and revenue.retention by stating when to use those instead.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance ('Use this for 'how's revenue doing?' questions') and multiple examples for different use cases (MRR, plan breakdown, etc.). Also recommends alternative tools for per-channel revenue or cohort retention.

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

search.landing_pagesA
Read-only

The pre-click → post-click join: Search Console metrics per landing page, joined to what those organic-search visitors actually did. For each page that gets search traffic, returns clicks / impressions / average position (from Search Console) alongside organic_sessions and conversions (from Clamp's own data). This answers the question Search Console alone can't: not "which pages get search clicks" but "which search traffic actually converts".

The join is page-level by necessity — Google strips the search query after the click, so conversions attribute to the landing PAGE, not to a specific query. conversion_event defaults to "signup_completed"; set it to whatever event marks a conversion for this project.

Use for "which search pages convert", "are our top-ranking pages actually working", "where is search traffic leaking".

Examples:

  • "which pages get search clicks but don't convert" → read pages, find high clicks + low conversions

  • "do our docs pages convert organic search" → scan pages for /docs paths

  • "conversions from search on /pricing" → conversion_event set, find the /pricing row

Limitations: page-level only — query→conversion cannot be attributed (see above). Search Console pages are matched to Clamp landing pages by URL path, so pages differing only by query string may not line up. organic_sessions counts sessions whose ENTRY channel is organic search. Requires a connected Search Console property.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows to return (1-50). Defaults to 10.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
conversion_eventNoEvent name that counts as a conversion. Default "signup_completed".

Output Schema

ParametersJSON Schema
NameRequiredDescription
pagesYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true. Description adds behavioral context: join nature, attribution constraints, default conversion event, and URL path matching. No contradictions.

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

Conciseness5/5

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

Description is thorough but well-structured: starts with core purpose, then details, examples, and limitations. Every sentence adds value.

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

Completeness5/5

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

Given complexity of joining two data sources, description covers purpose, usage, parameters, examples, and limitations. Output schema exists, so return values are not needed.

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

Parameters4/5

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

Schema covers 100% of parameters. Description adds meaning: explains default conversion_event and project_id requirement when multiple projects. Period and limit are also clarified.

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

Purpose5/5

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

Clearly states it joins Search Console metrics with Clamp's organic_sessions and conversions to answer which search traffic converts. Distinct from siblings like search.queries.

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

Usage Guidelines5/5

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

Explicitly states when to use (e.g., 'which search pages convert') and provides examples. Also notes limitations like page-level only and URL path matching.

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

search.queriesA
Read-only

Google Search Console query metrics — the pre-click side of search. Returns the search terms that drove clicks to the site, with clicks, impressions, CTR (0–1), and average position (1 = top of results), over the period. Sourced from the project's connected Search Console property, synced daily; data lags ~2 days, same as Search Console itself.

Use for "what are we ranking for", "which queries drive the most clicks", "where do we sit on [term]".

Examples:

  • "top search queries this month" → period="28d", read queries (already sorted by clicks)

  • "what position are we for 'X'" → scan queries for X, read position

Limitations: only queries with at least one click in the period appear — Search Console omits zero-click impressions and anonymized rare queries, so totals won't match site-wide impressions. Requires a connected Search Console property (returns an empty list if none is connected). For what those clicks did AFTER landing — sessions and conversions — use search.landing_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows to return (1-50). Defaults to 10.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queriesYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, ensuring safety. The description adds useful behavioral context: data lags ~2 days, synced daily, and requires a connected Search Console property (returns empty list if none). This goes beyond what annotations provide.

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

Conciseness5/5

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

Well-structured, front-loaded with core definition, then use cases, examples, and limitations. Every sentence adds value, no fluff.

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

Completeness5/5

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

Given the presence of an output schema (not shown but exists), return values are covered. The description covers purpose, limitations, prerequisites, and alternatives to other tools. Complete for the complexity.

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

Parameters4/5

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

Input schema has 100% description coverage, but the description adds practical usage context (e.g., period examples, hint to call projects.list for project_id, default limit). This adds value beyond the schema.

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

Purpose5/5

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

The description clearly states it returns Google Search Console query metrics (clicks, impressions, CTR, position) for search terms that drove clicks. It explicitly distinguishes from sibling tool 'search.landing_pages' by noting that the latter covers post-click activity.

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

Usage Guidelines5/5

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

Provides explicit when-to-use examples ('what are we ranking for', 'which queries drive the most clicks', 'where do we sit on [term]') and includes limitations (only queries with at least one click, no zero-click impressions). Also directs to a sibling tool for post-click data.

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

sessions.pathsA
Read-only

Aggregate (entry_page → exit_page) session pairs. Returns the top pairs with how many sessions followed each path, average pages per session, average duration in seconds, and a bounce flag. Use to answer "what do visitors do after landing on /pricing", "where do sessions end", or "which entry pages lead to the deepest engagement". Aggregate-only — no per-user traces, no full pageview chains, no individual session reconstruction.

Examples:

  • "top entry → exit pairs last week" → period="7d"

  • "longest sessions starting from the blog" → pathname="/blog", min_pages=3

  • "where do paid-traffic visitors end up" → channel="paid"

Limitations: shows entry and exit only, not the full pageview chain in between (use events.list for granular event analysis). min_pages=1 (default) includes single-page sessions which always show as bounces; set min_pages=2 to exclude them. Sessions ending without a pageview_end beacon (e.g. browser crash) may have null durations.

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
limitNoMax rows to return (1-50). Defaults to 10.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
min_pagesNoMinimum pageviews in a session to include it. Defaults to 1 (include bounces). Set to 2 to exclude single-page sessions.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathsYes

TDQS

A4.6/5.0
Behavior5/5

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

The description goes beyond the readOnlyHint annotation by detailing that the tool is aggregate-only, returns no per-user traces, no full pageview chains, and includes potential null durations for sessions without a pageview_end beacon. This adds important behavioral context.

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

Conciseness4/5

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

The description is concise and front-loaded with the main purpose. It uses examples effectively. However, it is a single paragraph without clear section breaks, which could be improved for scanning. Still, it is well-structured overall.

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

Completeness5/5

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

The description covers the return fields (top pairs, sessions count, avg pages, avg duration, bounce flag), limitations, and parameter guidance. With an output schema present and 100% parameter coverage, the description sufficiently completes the context for an agent.

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

Parameters3/5

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

The input schema has 100% coverage with descriptions for all 20 parameters. The tool description adds minimal extra value by showing examples and explaining min_pages behavior, but it largely repeats or implies what's in the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool aggregates entry_page to exit_page session pairs and returns top pairs with metrics. It specifies the resource (sessions.paths) and the verb (aggregate). It distinguishes itself from siblings like events.list and users.journey.

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

Usage Guidelines5/5

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

The description provides explicit examples of when to use (e.g., 'what do visitors do after landing on /pricing') and when not to (e.g., 'use events.list for granular event analysis'). It also gives usage tips like setting min_pages=2 to exclude bounces.

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

traffic.breakdownA
Read-only

Aggregate visitors and pageviews grouped by a single dimension. The dimension parameter chooses what to group by — page paths, traffic sources, geography, devices, or marketing attribution. Results are sorted by visitors descending and capped by limit (default 10, max 50). Some dimensions return additional joined columns: dimension="referrer_host" includes the channel for each referrer; dimension="city" includes the ISO country code. All other dimensions return only {name, pageviews, visitors}. Filters narrow the set before aggregation.

Examples:

  • "top pages last week" → dimension="pathname", period="7d"

  • "who is sending traffic" → dimension="referrer_host"

  • "mobile vs desktop split" → dimension="device_type"

  • "best UTM campaigns" → dimension="utm_campaign"

  • "top cities in Germany" → dimension="city", country="DE"

  • "browser version distribution" → dimension="browser_version"

Limitations: aggregates pageview events only — for custom event breakdowns use events.list with group_by. The name column is the raw stored value (lowercase ISO codes for country, exact pathname strings including trailing slash). Per-page time-on-page or bounce rate is not included here — use pages.engagement for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
limitNoMax rows to return (1-50). Defaults to 10.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
dimensionYesWhat to group by. Page paths: "pathname", "entry_page", "exit_page". Traffic sources: "referrer_host" (returns channel too), "channel", "utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term". Geography: "country", "region", "city" (returns country too). Devices: "device_type", "browser", "browser_version", "os", "os_version".
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes

TDQS

A4.7/5.0
Behavior5/5

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

The description adds significant context beyond the readOnlyHint annotation: it explains sorting by visitors descending, limit cap, joined columns for certain dimensions, and the raw format of the name column. It fully discloses behavior without contradiction.

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

Conciseness5/5

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

The description is structured with a clear summary, detailed dimension explanation, result format, examples, and limitations. Every sentence adds value, no redundancy.

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

Completeness5/5

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

Given the full schema coverage, readOnly annotation, and the description covering output shape, limitations, and examples, the tool definition is complete. The lack of an output schema is mitigated by the description specifying return fields.

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

Parameters4/5

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

Schema coverage is 100%, but the description enriches parameter meaning by grouping dimensions by category (page paths, traffic sources, geography, etc.) and providing example usage. It clarifies the effect of the limit parameter and the extra columns returned for specific dimensions.

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

Purpose5/5

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

The description clearly states the tool aggregates visitors and pageviews grouped by a single dimension. It provides numerous examples covering all dimension categories, and the purpose is distinct from sibling tools like traffic.timeseries and traffic.compare.

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

Usage Guidelines4/5

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

The description explicitly mentions when to use alternatives: for custom event breakdowns use events.list with group_by, and for per-page time-on-page use pages.engagement. It implies usage context but could more directly contrast with traffic.overview or traffic.live.

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

traffic.compareA
Read-only

Compare one metric across two arbitrary periods side-by-side. Returns both period values plus absolute delta and percentage delta. Periods do not need to be the same length — the percentage delta normalizes by ratio so longer/shorter comparisons remain meaningful. Use when the user asks month-over-month, before-vs-after-launch, or "how does this week compare to last".

Examples:

  • "this month vs last month" → metric="visitors", a="2026-04-01:2026-04-25", b="2026-03-01:2026-03-31"

  • "is /pricing converting better since the redesign" → metric="pageviews", a="2026-04-16:2026-04-25", b="2026-04-01:2026-04-15", pathname="/pricing"

Limitations: one metric per call — for multi-metric comparison either call repeatedly or use traffic.overview (which always includes the previous period). Period strings must be a preset ("today", "yesterday", "7d", "30d", "90d") or a YYYY-MM-DD:YYYY-MM-DD range; relative phrases like "last quarter" are not parsed.

ParametersJSON Schema
NameRequiredDescriptionDefault
aYesFirst period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range "YYYY-MM-DD:YYYY-MM-DD".
bYesSecond period. Same format as `a`.
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
metricYesThe metric to compare.
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
aYes
bYes
metricYes
pct_deltaYes
absolute_deltaYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=true, and description adds that percentage delta normalizes by ratio for unequal period lengths. No contradictions. Adds useful behavioral nuance.

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

Conciseness5/5

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

Three concise paragraphs: purpose, examples, limitations. Front-loaded with key information. No extraneous text.

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

Completeness5/5

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

With output schema present, description need not explain return values. Covers usage, examples, limitations, and parameter formats, fully adequate for a tool with 20 parameters.

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

Parameters4/5

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

Schema covers 100% of parameters with descriptions. Description adds value with examples for metric, pathname, and period format, clarifying usage beyond schema.

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

Purpose5/5

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

Description clearly states it compares one metric across two periods, returning period values, delta, and percentage delta. It distinguishes from sibling 'traffic.overview' by noting that overview always includes the previous period.

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

Usage Guidelines5/5

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

Explicitly specifies when to use: month-over-month, before-vs-after-launch, week comparison. Also states limitations (one metric per call, relative phrases not parsed) and suggests alternatives.

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

traffic.liveA
Read-only

See who is on the site in the last N minutes. Returns the active visitor count plus top pages, top referrers, and top countries within that window. Defaults to 5 minutes; max 60. Use during incidents ("is anyone hitting the broken page right now"), launches ("is the new post getting traffic"), or whenever the user asks "who is on the site".

Examples:

  • "who is on the site right now" → window_minutes=5

  • "has anyone visited in the last hour" → window_minutes=60

  • "is the launch page getting hits" → window_minutes=15

Limitations: ingestion lag is ~30 seconds, so "live" is approximate. Visitor count is unique anonymous_ids in the window, not active sessions. For historical questions ("who visited last week"), use traffic.overview instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
window_minutesNoLookback window in minutes. Defaults to 5, max 60.

Output Schema

ParametersJSON Schema
NameRequiredDescription
visitorsYes
pageviewsYes
top_pagesYes
top_sourcesYes
top_countriesYes
window_minutesYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations indicate readOnlyHint=true. Description adds critical behavioral context: ingestion lag ~30s, approximate nature, visitor count definition as unique anonymous_ids, and limitations, which goes beyond annotation info.

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

Conciseness5/5

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

Description is brief yet comprehensive, with clear structure: purpose, use cases, examples, limitations. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the tool's simplicity (2 parameters, output schema present, annotations provided), the description covers all necessary aspects: purpose, when to use, tech details, and parameter usage. No gaps remain.

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

Parameters4/5

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

Schema coverage is 100% with detailed descriptions. Description adds value through examples (window_minutes defaults and max) and context for project_id usage, though it does not repeat schema details.

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

Purpose5/5

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

Description clearly states the tool shows active visitors and top metrics within a time window, using specific verbs 'See' and 'Returns'. It distinguishes from siblings like traffic.overview by specifying real-time vs historical.

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

Usage Guidelines5/5

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

Explicit use cases are provided (incidents, launches) with example queries. Also states when not to use it (for historical questions, use traffic.overview), guiding appropriate tool selection.

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

traffic.overviewA
Read-only

High-level snapshot of website traffic over a period: total pageviews, unique visitors, sessions, bounce rate (%), and average session duration (seconds). Always includes a comparison block with the same metrics for the previous period of equal length plus the absolute and percentage delta. Use this as the first call when the user asks how the site is doing, before drilling into channels, pages, or funnels.

Examples:

  • "how is traffic this week" → period="7d"

  • "overview for last month" → period="30d"

  • "organic search performance this quarter" → period="90d", channel="organic_search"

Limitations: bounce_rate and avg_duration are derived from the SDK's pageview_end beacon — for SDK <0.3 they return null. Custom date ranges must be in YYYY-MM-DD:YYYY-MM-DD format. Maximum range is 365 days.

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sessionsYes
visitorsYes
pageviewsYes
comparisonYes
bounce_rateYes
avg_durationYes

TDQS

A4.5/5.0
Behavior5/5

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

Discloses key behaviors: always returns a comparison block with deltas, lists derived metric limitations (bounce_rate/avg_duration null for SDK<0.3), and specifies custom date range format and max range (365 days). Adds value beyond readOnlyHint= true annotation.

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

Conciseness4/5

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

Description is front-loaded with core snapshot characteristics followed by usage guidance, examples, and limitations. Concise enough; no filler. Could be slightly shortened but still well-structured.

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

Completeness4/5

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

Given 18 optional parameters and an existing output schema, the description covers purpose, comparison behavior, limitations, and usage context thoroughly. It compensates for complexity without overwhelming detail.

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

Parameters3/5

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

Input schema has 100% description coverage with detailed parameter definitions. The tool description adds minor contextual examples (e.g., period mappings) but does not heavily extend schema details. Baseline 3 is appropriate.

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

Purpose5/5

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

Clearly states it provides a high-level snapshot of traffic metrics (pageviews, visitors, sessions, bounce rate, session duration) and a comparison block. Unambiguously distinguishes itself from sibling tools like traffic.breakdown by positioning as the first call before drilling.

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

Usage Guidelines5/5

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

Explicitly instructs to use this as the first call when the user asks 'how is the site doing', before diving into channels, pages, or funnels. Provides concrete examples mapping user queries to period values, offering clear decision support.

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

traffic.timeseriesA
Read-only

Traffic metrics over time as date buckets. Returns [{ date, count }] sorted ascending, where count is the chosen metric's value per bucket. By default charts pageview counts; set metric to chart unique visitors, sessions, bounce rate, or average session duration instead — the same KPIs as traffic.overview, broken out over time. Alternatively set event to count occurrences of a custom event. Granularity is automatic based on period length (hourly for ≤2 days, daily for ≤90 days, weekly for ≤365 days, monthly beyond) and can be overridden via granularity.

Examples:

  • "pageview trend last week" → period="7d"

  • "unique visitors per day this month" → metric="visitors", period="30d"

  • "is bounce rate climbing?" → metric="bounce_rate", period="90d"

  • "signups per day this month" → event="signup", period="30d", granularity="day"

  • "hourly pageviews yesterday" → period="1d", granularity="hour"

Limitations: metric and event are mutually exclusive — when metric is set it always scopes to pageviews and ignores event/property/value. bounce_rate is a percentage (e.g. 47.2), avg_duration is in seconds. Forcing granularity="hour" over a 90-day period produces hundreds of buckets and may be truncated server-side. Buckets with no matching events return zero (the series does not skip missing dates).

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoOperating system family (e.g. "macOS", "iOS", "Windows", "Android"). Use traffic.breakdown(dimension="os") to discover stored values.
cityNoCity name (e.g. "San Francisco", "London"). Case-sensitive; must match the stored value. Use traffic.breakdown(dimension="city") to discover values.
eventNoEvent name to chart raw counts of (defaults to "$pageview"). Ignored when `metric` is set. Pass any custom event name (e.g. "signup") or $-prefixed system/canonical event (e.g. "$error", "$subscription_started") to see its trend over time.
valueNoFilter to events where the property key equals this value.
metricNoWhich traffic metric to chart over time, mirroring the overview KPIs: "pageviews", "visitors" (unique), "sessions", "bounce_rate" (% of single-pageview sessions), or "avg_duration" (avg session length in seconds). When set, the metric is always scoped to pageviews and `event`/`property`/`value` are ignored. Omit to chart raw counts of a custom `event` instead.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
regionNoAdministrative region inside a country (e.g. "California", "Bavaria"). Case-sensitive; must match the stored region exactly. Use traffic.breakdown(dimension="region") to discover values.
browserNoBrowser family (e.g. "Chrome", "Safari", "Firefox"). Use traffic.breakdown(dimension="browser") to discover the exact stored values.
channelNoTraffic channel. One of: "direct", "organic_search", "organic_social", "paid", "email", "referral".
countryNoISO 3166-1 alpha-2 country code, uppercase (e.g. "US", "GB", "DE", "NL", "JP"). Filter results to visitors from this country.
pathnameNoFilter to a specific page path (e.g. "/pricing", "/blog/my-post"). Must start with /.
propertyNoFilter by this custom property key (used with value).
utm_termNoFilter by UTM term (e.g. "running+shoes"). Case-sensitive.
os_versionNoOS version string (e.g. "14.2"). Case-sensitive.
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
utm_mediumNoFilter by UTM medium (e.g. "cpc", "email", "social"). Case-sensitive.
utm_sourceNoFilter by UTM source (e.g. "google", "twitter", "newsletter"). Case-sensitive, must match the value in the tracking URL.
device_typeNoDevice category. One of: "desktop", "mobile", "tablet".
granularityNoOverride the automatic granularity. "hour" for hourly buckets, "day" for daily, "week" for weekly, "month" for monthly. If omitted, chosen automatically based on the period length.
utm_contentNoFilter by UTM content (e.g. "hero-cta", "sidebar-banner"). Case-sensitive.
utm_campaignNoFilter by UTM campaign name (e.g. "spring-launch", "product-hunt"). Case-sensitive.
referrer_hostNoFilter by referrer hostname (e.g. "news.ycombinator.com", "twitter.com", "github.com"). Use this to see what traffic from a specific source did. Must match the value returned by `traffic.breakdown(dimension="referrer_host")` exactly (lowercase, no protocol or path).
browser_versionNoBrowser version string (e.g. "120.0"). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
seriesYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations indicate readOnlyHint=true, which matches read-only behavior. Description adds critical behavioral details: automatic granularity based on period length, mutual exclusivity of metric and event, zero vs. skipped missing dates, and server-side truncation warnings.

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

Conciseness4/5

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

Well-structured with a clear initial statement followed by examples and limitations. The examples are particularly helpful but slightly increase length. Could be tightened slightly, but the content is valuable.

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

Completeness5/5

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

Given 23 optional parameters, 100% schema coverage, and an output schema, the description is complete. It covers all major behaviors, limitations, and edge cases (e.g., mutual exclusivity, granularity override, zero counts). No apparent gaps.

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

Parameters4/5

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

Schema description coverage is 100%, so each parameter is already documented. The description adds value by explaining parameter interactions (e.g., metric vs. event), selection patterns, and providing examples that illustrate parameter usage in context.

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

Purpose5/5

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

The description clearly states it returns traffic metrics over time as date buckets, with the output format [{ date, count }]. It distinguishes from sibling tools like traffic.overview (overview vs. time series) and traffic.live (live vs. historical).

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

Usage Guidelines5/5

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

Provides explicit examples for different use cases (pageviews, visitors, bounce rate, custom events) and explains the mutual exclusivity of metric and event. Also details behavior of automatic granularity and limitations (e.g., metric vs. event exclusivity, truncation for long periods).

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

users.journeyA
Read-only

Chronological session history for a single visitor (anonymous_id). Each session collapses to one row showing the start and end timestamps, entry page, channel, referrer host, UTMs, country, device type, pageview count, and the distinct custom event names fired in that session. The first row is flagged with is_first_touch: true.

Use this when an aggregate query can't answer the question — multi-touch attribution analysis, support / debugging investigations ("what did this user do before signing up?"), or sanity-checking a specific account's journey before drawing conclusions about a cohort.

Examples:

  • "show me what this user did across all their visits" → anonymous_id="anon_xxx"

  • "where did this paying customer first come from?" → anonymous_id="anon_xxx", read sessions[0].channel

  • "did they convert on their first visit or come back later?" → check if signup-event sessions match is_first_touch=true

Limitations: requires the visitor's anonymous_id, which the SDK exposes via getAnonymousId() on the browser side. Aggregate questions ("which channels drive my best users") use revenue.sum with attribution_model="first_touch" — don't loop this tool over thousands of users. Defaults to a 365-day lookback so first-touch is meaningful; tighten with period if needed.

Pairs with: revenue.sum(attribution_model="first_touch") to validate the aggregate first-touch read against specific high-value customers' actual paths.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax sessions to return. Defaults to 50, max 200.
periodNoTime period. Use "today", "yesterday", "7d", "30d", "90d", or a custom range as "YYYY-MM-DD:YYYY-MM-DD" (e.g. "2026-01-01:2026-03-31"). Defaults to "30d".
project_idNoTarget project ID (e.g. "proj_abc123"). Required when the credential has access to multiple projects. If omitted and only one project is accessible, that project is used automatically. Call `projects.list` to discover available project IDs.
anonymous_idYesThe visitor's anonymous_id. From the browser SDK's getAnonymousId() / localStorage clamp_aid; from server-side tracks, whatever you passed as anonymousId.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sessionsYes
anonymous_idYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only provide readOnlyHint=true. The description adds rich behavioral context: 365-day lookback default, session collapse with fields, is_first_touch flag, and limitations like requiring anonymous_id.

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

Conciseness5/5

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

Well-structured: output description first, then use cases, examples, limitations, and pairing. Every sentence adds value with no redundancy.

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

Completeness5/5

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

Given high schema coverage, presence of output schema, and detailed description covering input, output, use cases, limitations, and cross-tool pairing, the description is fully complete for agent usage.

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

Parameters4/5

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

Schema descriptions cover all 4 parameters (100% coverage). The description adds value by explaining the anonymous_id source (SDK getAnonymousId) and the period default's significance for first-touch meaning.

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

Purpose5/5

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

The description clearly states it provides 'chronological session history for a single visitor (anonymous_id)', specifying the verb (chronological session history), resource (single visitor), and scope. It differentiates from sibling tools like revenue.sum by focusing on individual-level analysis.

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

Usage Guidelines5/5

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

Explicitly states when to use (multi-touch attribution, debugging) and when not to (aggregate queries). Provides alternative tool (revenue.sum with attribution_model) and warns against looping over thousands of users.

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

Tool Schema Changelog

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

  1. 2 tool updatesv5.4.1
    • Addedsearch.landing_pages
    • Addedsearch.queries
  2. 5 tool updatesv5.4.0
    • Changedevents.observed_schema1 field changed
      • changedInput schema / properties / include_pageviews / description
        Previous value: -"Include SDK-internal events (pageview, pageview_end, web_vital, section_viewed, $error) in the output. Defaults to false."New value: +"Include $-prefixed system and canonical revenue events ($pageview, $pageview_end, $web_vital, $section_viewed, $error, $subscription_started, $subscription_canceled, …) in the output. Defaults to false."
    • Changedpages.engagement2 fields changed
      • addedOutput schema / properties / pages / items / properties / avg_max_scroll
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / pages / items / properties / scroll_distribution
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "pct_reached_100": {
        +          "anyOf": [
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "pct_reached_25": {
        +          "anyOf": [
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "pct_reached_50": {
        +          "anyOf": [
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "pct_reached_75": {
        +          "anyOf": [
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "samples": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "samples",
        +        "pct_reached_25",
        +        "pct_reached_50",
        +        "pct_reached_75",
        +        "pct_reached_100"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
    • Addedrevenue.retention
    • Addedrevenue.summary
    • Changedtraffic.timeseries1 field changed
      • changedInput schema / properties / event / description
        Previous value: -"Event name to chart raw counts of (defaults to \"pageview\"). Ignored when `metric` is set. Use any custom event name to see its trend over time."New value: +"Event name to chart raw counts of (defaults to \"$pageview\"). Ignored when `metric` is set. Pass any custom event name (e.g. \"signup\") or $-prefixed system/canonical event (e.g. \"$error\", \"$subscription_started\") to see its trend over time."
  3. 5 tool updatesv5.2.0
    • Changedcohorts.compare8 fields changed
      • removedInput schema / properties / a
        Removed value: -{
        -  "description": "Name of the first cohort.",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • removedInput schema / properties / b
        Removed value: -{
        -  "description": "Name of the second cohort.",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • addedInput schema / properties / names
        Added value: +{
        +  "description": "Comma-separated cohort names, 2–10 entries. First name is treated as the primary. Example: \"signups_apr_14,signups_apr_07\" or \"control,variant_a,variant_b\".",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "a",
        -  "b"
        -]New value: +[
        +  "names"
        +]
      • removedOutput schema / properties / a
        Removed value: -{
        -  "additionalProperties": false,
        -  "properties": {
        -    "cohort": {
        -      "type": "string"
        -    },
        -    "retention": {
        -      "items": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "count": {
        -            "type": "number"
        -          },
        -          "period": {
        -            "type": "string"
        -          },
        -          "rate": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "period",
        -          "count",
        -          "rate"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "size": {
        -      "type": "number"
        -    }
        -  },
        -  "required": [
        -    "cohort",
        -    "size",
        -    "retention"
        -  ],
        -  "type": "object"
        -}
      • removedOutput schema / properties / b
        Removed value: -{
        -  "additionalProperties": false,
        -  "properties": {
        -    "cohort": {
        -      "type": "string"
        -    },
        -    "retention": {
        -      "items": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "count": {
        -            "type": "number"
        -          },
        -          "period": {
        -            "type": "string"
        -          },
        -          "rate": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "period",
        -          "count",
        -          "rate"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "size": {
        -      "type": "number"
        -    }
        -  },
        -  "required": [
        -    "cohort",
        -    "size",
        -    "retention"
        -  ],
        -  "type": "object"
        -}
      • addedOutput schema / properties / cohorts
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "cohort": {
        +        "type": "string"
        +      },
        +      "retention": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "period": {
        +              "type": "string"
        +            },
        +            "rate": {
        +              "type": "number"
        +            },
        +            "retained": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "period",
        +            "retained",
        +            "rate"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "size": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "cohort",
        +      "size",
        +      "retention"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "a",
        -  "b"
        -]New value: +[
        +  "cohorts"
        +]
    • Changedcohorts.retention4 fields changed
      • removedOutput schema / properties / retention / items / properties / count
        Removed value: -{
        -  "type": "number"
        -}
      • changedOutput schema / properties / retention / items / properties / rate / type
        Previous value: -"string"New value: +"number"
      • addedOutput schema / properties / retention / items / properties / retained
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / retention / items / required
        Previous value: -[
        -  "period",
        -  "count",
        -  "rate"
        -]New value: +[
        +  "period",
        +  "retained",
        +  "rate"
        +]
    • Addedevents.property_values
    • Changedfunnels.create4 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"A descriptive name for this funnel (e.g. \"pricing-to-signup\", \"onboarding-flow\"). Used to retrieve it later. Max 200 chars."New value: +"A descriptive display name for this funnel (e.g. \"Pricing → Signup\", \"Onboarding flow\", \"pricing-to-signup\"). Used to retrieve it later. Permissive charset — spaces, capitals, arrows, and punctuation are all fine. Must not contain \"/\", \",\", \"[\", or \"]\" because those collide with URL routing and the step-DSL grammar. Max 200 chars."
      • addedInput schema / properties / name / maxLength
        Added value: +200
      • addedInput schema / properties / name / minLength
        Added value: +1
      • addedInput schema / properties / name / pattern
        Added value: +"^[^/,[\\]]+$"
    • Addedfunnels.delete
  4. 27 tool updatesv4.2.0
    • Addedalerts.create
    • Addedalerts.delete
    • Addedalerts.list
    • Addedcohorts.compare
    • Addedcohorts.create
    • Addedcohorts.delete
    • Addedcohorts.list
    • Addedcohorts.retention
    • Addeddocs.search
    • Addederrors.context
    • Addederrors.groups
    • Addederrors.list
    • Addederrors.timeline
    • Addedevents.list
    • Addedevents.observed_schema
    • Addedfunnels.create
    • Addedfunnels.list
    • Addedpages.engagement
    • Addedprojects.list
    • Addedrevenue.sum
    • Addedsessions.paths
    • Addedtraffic.breakdown
    • Addedtraffic.compare
    • Addedtraffic.live
    • Addedtraffic.overview
    • Addedtraffic.timeseries
    • Addedusers.journey
  5. 27 tool updatesv4.0.1
    • Removedalerts.create
    • Removedalerts.delete
    • Removedalerts.list
    • Removedcohorts.compare
    • Removedcohorts.create
    • Removedcohorts.delete
    • Removedcohorts.list
    • Removedcohorts.retention
    • Removeddocs.search
    • Removederrors.context
    • Removederrors.groups
    • Removederrors.list
    • Removederrors.timeline
    • Removedevents.list
    • Removedevents.observed_schema
    • Removedfunnels.create
    • Removedfunnels.list
    • Removedpages.engagement
    • Removedprojects.list
    • Removedrevenue.sum
    • Removedsessions.paths
    • Removedtraffic.breakdown
    • Removedtraffic.compare
    • Removedtraffic.live
    • Removedtraffic.overview
    • Removedtraffic.timeseries
    • Removedusers.journey
  6. 27 tool updatesv4.0.0
    • Changedalerts.create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "condition": {
        +      "type": "string"
        +    },
        +    "created_at": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "metric": {
        +      "type": "string"
        +    },
        +    "pathname": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "period": {
        +      "type": "string"
        +    },
        +    "threshold": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "metric",
        +    "condition",
        +    "threshold",
        +    "period",
        +    "pathname",
        +    "created_at"
        +  ],
        +  "type": "object"
        +}
    • Changedalerts.delete1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "ok": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedalerts.list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "alerts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "condition": {
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "metric": {
        +            "type": "string"
        +          },
        +          "pathname": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "period": {
        +            "type": "string"
        +          },
        +          "threshold": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "metric",
        +          "condition",
        +          "threshold",
        +          "period",
        +          "pathname",
        +          "created_at"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "alerts"
        +  ],
        +  "type": "object"
        +}
    • Changedcohorts.compare1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "a": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "cohort": {
        +          "type": "string"
        +        },
        +        "retention": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "count": {
        +                "type": "number"
        +              },
        +              "period": {
        +                "type": "string"
        +              },
        +              "rate": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "period",
        +              "count",
        +              "rate"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "size": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "size",
        +        "retention"
        +      ],
        +      "type": "object"
        +    },
        +    "b": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "cohort": {
        +          "type": "string"
        +        },
        +        "retention": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "count": {
        +                "type": "number"
        +              },
        +              "period": {
        +                "type": "string"
        +              },
        +              "rate": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "period",
        +              "count",
        +              "rate"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "size": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "size",
        +        "retention"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "a",
        +    "b"
        +  ],
        +  "type": "object"
        +}
    • Changedcohorts.create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "definition": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "event": {
        +          "type": "string"
        +        },
        +        "filter": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "property": {
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "property",
        +            "value"
        +          ],
        +          "type": "object"
        +        },
        +        "period": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "event",
        +        "period"
        +      ],
        +      "type": "object"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "size": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "definition",
        +    "size"
        +  ],
        +  "type": "object"
        +}
    • Changedcohorts.delete1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "ok": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok"
        +  ],
        +  "type": "object"
        +}
    • Changedcohorts.list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "cohorts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "created_at": {
        +            "type": "string"
        +          },
        +          "definition": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "event": {
        +                "type": "string"
        +              },
        +              "filter": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "property": {
        +                    "type": "string"
        +                  },
        +                  "value": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "property",
        +                  "value"
        +                ],
        +                "type": "object"
        +              },
        +              "period": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "event",
        +              "period"
        +            ],
        +            "type": "object"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "size": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "definition"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "cohorts"
        +  ],
        +  "type": "object"
        +}
    • Changedcohorts.retention1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "cohort": {
        +      "type": "string"
        +    },
        +    "retention": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "period": {
        +            "type": "string"
        +          },
        +          "rate": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "period",
        +          "count",
        +          "rate"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "size": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "cohort",
        +    "size",
        +    "retention"
        +  ],
        +  "type": "object"
        +}
    • Changeddocs.search1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "query": {
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "desc": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "url",
        +          "title",
        +          "desc"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "query",
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Changederrors.context1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "anonymous_id": {
        +      "type": "string"
        +    },
        +    "before_timestamp": {
        +      "type": "string"
        +    },
        +    "count": {
        +      "type": "number"
        +    },
        +    "events": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "pathname": {
        +            "type": "string"
        +          },
        +          "referrer": {
        +            "type": "string"
        +          },
        +          "timestamp": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "timestamp",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "anonymous_id",
        +    "before_timestamp",
        +    "count",
        +    "events"
        +  ],
        +  "type": "object"
        +}
    • Changederrors.groups1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "groups": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "fingerprint": {
        +            "type": "string"
        +          },
        +          "first_seen": {
        +            "type": "string"
        +          },
        +          "last_seen": {
        +            "type": "string"
        +          },
        +          "sample_message": {
        +            "type": "string"
        +          },
        +          "sample_type": {
        +            "type": "string"
        +          },
        +          "users_affected": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "fingerprint",
        +          "count",
        +          "users_affected",
        +          "first_seen",
        +          "last_seen"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "period": {
        +      "type": "string"
        +    },
        +    "sort_by": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "period",
        +    "sort_by",
        +    "groups"
        +  ],
        +  "type": "object"
        +}
    • Changederrors.list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "count": {
        +      "type": "number"
        +    },
        +    "errors": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "anonymous_id": {
        +            "type": "string"
        +          },
        +          "browser": {
        +            "type": "string"
        +          },
        +          "browser_version": {
        +            "type": "string"
        +          },
        +          "country": {
        +            "type": "string"
        +          },
        +          "device_type": {
        +            "type": "string"
        +          },
        +          "fingerprint": {
        +            "type": "string"
        +          },
        +          "handled": {
        +            "type": "boolean"
        +          },
        +          "message": {
        +            "type": "string"
        +          },
        +          "os": {
        +            "type": "string"
        +          },
        +          "pathname": {
        +            "type": "string"
        +          },
        +          "session_id": {
        +            "type": "string"
        +          },
        +          "stack": {
        +            "type": "string"
        +          },
        +          "timestamp": {
        +            "type": "string"
        +          },
        +          "type": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "timestamp",
        +          "handled"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "period": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "period",
        +    "count",
        +    "errors"
        +  ],
        +  "type": "object"
        +}
    • Changederrors.timeline1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "fingerprint": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "interval": {
        +      "type": "string"
        +    },
        +    "period": {
        +      "type": "string"
        +    },
        +    "series": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "bucket": {
        +            "type": "string"
        +          },
        +          "count": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "bucket",
        +          "count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "period",
        +    "interval",
        +    "fingerprint",
        +    "series"
        +  ],
        +  "type": "object"
        +}
    • Changedevents.list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "events": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "group_value": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "events"
        +  ],
        +  "type": "object"
        +}
    • Changedevents.observed_schema1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "events": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "properties": {
        +            "additionalProperties": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "occurrences": {
        +                    "type": "number"
        +                  },
        +                  "type": {
        +                    "type": "string"
        +                  }
        +                },
        +                "required": [
        +                  "type",
        +                  "occurrences"
        +                ],
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "count",
        +          "properties"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "period": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "period",
        +    "events"
        +  ],
        +  "type": "object"
        +}
    • Changedfunnels.create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "overall_conversion": {
        +      "type": "string"
        +    },
        +    "period": {
        +      "type": "string"
        +    },
        +    "steps": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "rate": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "count",
        +          "rate"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "steps",
        +    "overall_conversion",
        +    "period"
        +  ],
        +  "type": "object"
        +}
    • Changedfunnels.list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "funnels": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "overall_conversion": {
        +            "type": "string"
        +          },
        +          "period": {
        +            "type": "string"
        +          },
        +          "steps": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "count": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "rate": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "count",
        +                "rate"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "steps",
        +          "overall_conversion",
        +          "period"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "funnels"
        +  ],
        +  "type": "object"
        +}
    • Changedpages.engagement1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "pages": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "avg_engagement_seconds": {
        +            "anyOf": [
        +              {
        +                "type": "number"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "bounce_rate": {
        +            "anyOf": [
        +              {
        +                "type": "number"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "pageviews": {
        +            "type": "number"
        +          },
        +          "pathname": {
        +            "type": "string"
        +          },
        +          "visitors": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "pathname",
        +          "pageviews",
        +          "visitors"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "sections": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "pageviews": {
        +            "type": "number"
        +          },
        +          "section": {
        +            "type": "string"
        +          },
        +          "view_rate": {
        +            "anyOf": [
        +              {
        +                "type": "number"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "views": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "section",
        +          "views",
        +          "view_rate",
        +          "pageviews"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedprojects.list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "projects": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "plan": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "plan"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "projects"
        +  ],
        +  "type": "object"
        +}
    • Changedrevenue.sum1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "rows": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "amount": {
        +            "type": "string"
        +          },
        +          "currency": {
        +            "type": "string"
        +          },
        +          "events": {
        +            "type": "number"
        +          },
        +          "group_value": {
        +            "type": "string"
        +          },
        +          "visitors": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "currency",
        +          "amount",
        +          "events",
        +          "visitors"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "rows"
        +  ],
        +  "type": "object"
        +}
    • Changedsessions.paths1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "paths": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "avg_duration_seconds": {
        +            "type": "number"
        +          },
        +          "avg_pages": {
        +            "type": "number"
        +          },
        +          "bounced": {
        +            "type": "boolean"
        +          },
        +          "entry_page": {
        +            "type": "string"
        +          },
        +          "exit_page": {
        +            "type": "string"
        +          },
        +          "sessions": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "entry_page",
        +          "exit_page",
        +          "sessions",
        +          "avg_pages",
        +          "avg_duration_seconds",
        +          "bounced"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "paths"
        +  ],
        +  "type": "object"
        +}
    • Changedtraffic.breakdown1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "rows": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "channel": {
        +            "type": "string"
        +          },
        +          "country": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "pageviews": {
        +            "type": "number"
        +          },
        +          "visitors": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "pageviews",
        +          "visitors"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "rows"
        +  ],
        +  "type": "object"
        +}
    • Changedtraffic.compare1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "a": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "period": {
        +          "type": "string"
        +        },
        +        "value": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "period",
        +        "value"
        +      ],
        +      "type": "object"
        +    },
        +    "absolute_delta": {
        +      "type": "number"
        +    },
        +    "b": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "period": {
        +          "type": "string"
        +        },
        +        "value": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "period",
        +        "value"
        +      ],
        +      "type": "object"
        +    },
        +    "metric": {
        +      "type": "string"
        +    },
        +    "pct_delta": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "metric",
        +    "a",
        +    "b",
        +    "absolute_delta",
        +    "pct_delta"
        +  ],
        +  "type": "object"
        +}
    • Changedtraffic.live1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "pageviews": {
        +      "type": "number"
        +    },
        +    "top_countries": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "visitors": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "visitors"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "top_pages": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "pageviews": {
        +            "type": "number"
        +          },
        +          "visitors": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "pageviews",
        +          "visitors"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "top_sources": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "visitors": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "visitors"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "visitors": {
        +      "type": "number"
        +    },
        +    "window_minutes": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "window_minutes",
        +    "visitors",
        +    "pageviews",
        +    "top_pages",
        +    "top_sources",
        +    "top_countries"
        +  ],
        +  "type": "object"
        +}
    • Changedtraffic.overview1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "avg_duration": {
        +      "type": "number"
        +    },
        +    "bounce_rate": {
        +      "type": "number"
        +    },
        +    "comparison": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "bounce_rate": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "change": {
        +              "type": "string"
        +            },
        +            "previous": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "previous",
        +            "change"
        +          ],
        +          "type": "object"
        +        },
        +        "pageviews": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "change": {
        +              "type": "string"
        +            },
        +            "previous": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "previous",
        +            "change"
        +          ],
        +          "type": "object"
        +        },
        +        "sessions": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "change": {
        +              "type": "string"
        +            },
        +            "previous": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "previous",
        +            "change"
        +          ],
        +          "type": "object"
        +        },
        +        "visitors": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "change": {
        +              "type": "string"
        +            },
        +            "previous": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "previous",
        +            "change"
        +          ],
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "pageviews",
        +        "visitors",
        +        "sessions",
        +        "bounce_rate"
        +      ],
        +      "type": "object"
        +    },
        +    "pageviews": {
        +      "type": "number"
        +    },
        +    "sessions": {
        +      "type": "number"
        +    },
        +    "visitors": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "pageviews",
        +    "visitors",
        +    "sessions",
        +    "bounce_rate",
        +    "avg_duration",
        +    "comparison"
        +  ],
        +  "type": "object"
        +}
    • Changedtraffic.timeseries1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "series": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "count": {
        +            "type": "number"
        +          },
        +          "date": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "date",
        +          "count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "series"
        +  ],
        +  "type": "object"
        +}
    • Changedusers.journey1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "anonymous_id": {
        +      "type": "string"
        +    },
        +    "sessions": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "channel": {
        +            "type": "string"
        +          },
        +          "country": {
        +            "type": "string"
        +          },
        +          "device_type": {
        +            "type": "string"
        +          },
        +          "ended_at": {
        +            "type": "string"
        +          },
        +          "entry_page": {
        +            "type": "string"
        +          },
        +          "events": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "is_first_touch": {
        +            "type": "boolean"
        +          },
        +          "pageviews": {
        +            "type": "number"
        +          },
        +          "referrer_host": {
        +            "type": "string"
        +          },
        +          "session_id": {
        +            "type": "string"
        +          },
        +          "started_at": {
        +            "type": "string"
        +          },
        +          "utm_campaign": {
        +            "type": "string"
        +          },
        +          "utm_medium": {
        +            "type": "string"
        +          },
        +          "utm_source": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "session_id",
        +          "is_first_touch",
        +          "started_at",
        +          "ended_at",
        +          "entry_page",
        +          "channel",
        +          "referrer_host",
        +          "utm_source",
        +          "utm_medium",
        +          "utm_campaign",
        +          "country",
        +          "device_type",
        +          "pageviews",
        +          "events"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "anonymous_id",
        +    "sessions"
        +  ],
        +  "type": "object"
        +}
  7. 38 tool updates
    • Addedalerts.create
    • Addedalerts.delete
    • Addedalerts.list
    • Addedcohorts.compare
    • Addedcohorts.create
    • Addedcohorts.delete
    • Addedcohorts.list
    • Addedcohorts.retention
    • Removedcreate_alert
    • Removedcreate_funnel
    • Addeddocs.search
    • Addederrors.context
    • Addederrors.groups
    • Addederrors.list
    • Addederrors.timeline
    • Addedevents.list
    • Addedevents.observed_schema
    • Addedfunnels.create
    • Addedfunnels.list
    • Removedget_cities
    • Removedget_countries
    • Removedget_devices
    • Removedget_events
    • Removedget_funnel
    • Removedget_overview
    • Removedget_timeseries
    • Removedget_top_pages
    • Removedget_top_referrers
    • Addedpages.engagement
    • Addedprojects.list
    • Addedrevenue.sum
    • Addedsessions.paths
    • Addedtraffic.breakdown
    • Addedtraffic.compare
    • Addedtraffic.live
    • Addedtraffic.overview
    • Addedtraffic.timeseries
    • Addedusers.journey
  8. 11 tool updatesv1.0.0
    • First observedcreate_alert
    • First observedcreate_funnel
    • First observedget_cities
    • First observedget_countries
    • First observedget_devices
    • First observedget_events
    • First observedget_funnel
    • First observedget_overview
    • First observedget_timeseries
    • First observedget_top_pages
    • First observedget_top_referrers

TDQS

A4.4/5.0
Disambiguation5/5

Every tool targets a distinct resource or analytical question: traffic, pages, sessions, users, events, errors, cohorts, funnels, revenue, alerts, docs, and projects. No two tools overlap in purpose; each serves a clear, separate function.

Naming Consistency5/5

Tools follow a consistent `domain.action_or_noun` pattern with lowercase and dot separation. CRUD operations use verbs (create, delete, list), while analytical queries use descriptive nouns (retention, compare, breakdown, summary). This pattern is predictable across all domains.

Tool Count2/5

With 31 tools, the server exceeds the 25-tool threshold considered 'too many' per calibration guidelines. Although each tool is purposeful, the sheer number makes the surface heavy and increases cognitive load for agents.

Completeness4/5

The tool set covers a broad range of analytics needs: traffic, engagement, sessions, users, events, errors, cohorts, funnels, revenue, and alerts. Minor gaps exist—e.g., no tool to retrieve individual non-error event details or per-customer revenue—but the overall surface is strong.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    A Model Context Protocol server that enables Claude Desktop users to interact directly with PostHog, allowing them to view projects and create annotations through natural language commands.
    10
    -
  • A
    license
    A
    quality
    B
    maintenance
    Connects Google Analytics 4 data to Claude, Cursor and other MCP clients, enabling natural language queries of website traffic, user behavior, and analytics data with access to 200+ GA4 dimensions and metrics.
    10
    240
    MIT
  • A
    license
    B
    quality
    F
    maintenance
    Connects AI assistants like Claude to Sealmetrics analytics data, enabling natural language queries for traffic analysis, conversions, marketing performance, ROAS tracking, and funnel analysis.
    8
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/clamp-sh/mcp'

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