Skip to main content
Glama

Server Details

Privacy-first web analytics for AI agents: visitors, revenue, funnels, visitor profiles.

Ownership verified
Status
Healthy
Uptime
90.8% over 41 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.3/5.0

Scored across 28 tools

Disambiguation4/5

The many get_* breakdown tools (browsers, countries, cities, pages, campaigns, channels, referrers, etc.) target distinct dimensions, and each description explicitly cross-references its neighbors to steer selection. The main overlap is get_breakdown, which generically covers dimensions the named tools already handle, but descriptions acknowledge this ('the dedicated tool returns the same rows'), keeping misselection limited.

Naming Consistency5/5

Every tool follows a strict verb_noun pattern (get_*, list_*, delete_*, track_*, update_*), all in snake_case. No deviations or mixed conventions.

Tool Count3/5

At 28 tools this is heavy for the stated analytics purpose, above the comfortable range. Many dimension tools earn their place, but the generic get_breakdown duplicates several of them, inflating the surface somewhat.

Completeness4/5

Strong coverage of analytics reading (overview, timeseries, breakdowns, realtime, visitor/issue detail), plus goal and payment tracking and issue status updates. Minor gaps remain, e.g. no website create/update and no goal-definition management, but core workflows are covered.

Available Tools

28 tools
delete_goalsDelete Goal EventsA
Destructive
Inspect

Permanently delete recorded goal completions matching every filter given (filters combine with AND). At least one of visitorId, name, startAt, or endAt is required or the call fails before reaching the API; startAt and endAt are independent, so one bound alone is allowed. Without a date range, matches are deleted across the whole history. Returns the number of rows deleted. Cannot be undone: restate website, filters, and range and get explicit confirmation first. Deletes completions only; the goal definition stays and get_goals still lists it. Use delete_payments for revenue records and update_issue_status for issues. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDelete completions of this goal name (as listed by get_goals)
endAtNoISO 8601 end of the deletion window, inclusive (e.g. "2026-01-31T23:59:59Z"). May be used without startAt.
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
startAtNoISO 8601 start of the deletion window, inclusive (e.g. "2026-01-01T00:00:00Z"). May be used without endAt.
visitorIdNoDelete completions of this visitor (the id get_visitor takes). Combined with the other filters using AND.
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: deleted (number of completions removed) and a confirmation message.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description adds substantial context: cannot be undone, requires restating website/filters/range and explicit confirmation, deletes completions only while the definition persists, returns the deleted row count, and requires websiteId or domain with a workspace token.

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?

Front-loaded with the destructive action and confirmation requirement, and nearly every sentence carries unique information. The closing auth sentence partially duplicates the websiteId/domain schema descriptions, a minor redundancy in an otherwise tight block.

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 destructive, 7-param tool with an output schema, the definition covers prerequisites, confirmation, scope boundaries, and sibling alternatives. Nothing an agent needs to invoke it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema lacks: filters combine with AND, at least one is mandatory despite zero required fields, and startAt/endAt are independent bounds. This genuinely extends beyond the structured field 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?

States a specific verb and resource ('permanently delete recorded goal completions') with the matching scope ('matching every filter given'). It explicitly distinguishes itself from delete_payments and update_issue_status, and clarifies it removes completions only, not the goal definition get_goals still lists.

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?

Gives explicit when-to-use rules and exclusions: at least one of visitorId/name/startAt/endAt is required or the call fails, one date bound alone is allowed, and no range means whole history. It routes revenue deletions to delete_payments and issues to update_issue_status.

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

delete_paymentsDelete PaymentsA
Destructive
Inspect

Permanently delete analytics payment records, without issuing refunds or changing a payment provider. Delete records matching every filter given (filters combine with AND): one transactionId, all payments of a visitorId, and/or a createdAt window. At least one of transactionId, visitorId, startAt, or endAt is required or the call fails before reaching the API; startAt and endAt are independent, so one bound alone is allowed. Without a date range, matches are deleted across the whole history. Returns the number of rows deleted. Cannot be undone and removes revenue from every report and visitor profile, so restate website, filters, and range and get explicit confirmation first. To record a refund that already occurred, use track_payment with isRefund; it only updates analytics. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the deletion window, inclusive (e.g. "2026-01-31T23:59:59Z"). May be used without startAt.
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
startAtNoISO 8601 start of the deletion window, inclusive (e.g. "2026-01-01T00:00:00Z"). May be used without endAt.
visitorIdNoDelete all payments of this visitor (the id get_visitor takes)
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
transactionIdNoDelete the single payment with this transaction ID. Combined with the other filters using AND.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: deleted (number of payment records removed) and a confirmation message.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, so the description builds on that with concrete consequences: deletion cannot be undone, removes revenue from every report and visitor profile, returns the number of rows deleted, and fails before reaching the API if no filter is given. It also explains that filters combine with AND and that missing date range deletes across all history. No contradiction with annotations.

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

Conciseness5/5

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

The description is dense but front-loads the destructive action, then flows through filters, required constraints, consequences, alternatives, and auth. Every sentence carries operational or safety-relevant information, which is appropriate for a high-risk deletion tool.

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 destructive operation, seven filters, an output schema, and annotations covering the safety profile, the description supplies everything an agent needs: required filter semantics, date-range behavior, auth context, irreversibility, return value, and the correct alternative for refunds. No material gap remains.

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 documents each parameter individually, so the baseline is 3. The description adds combination and requiredness semantics beyond the schema: filters combine with AND, startAt and endAt are independent and one bound alone is allowed, and at least one filter is required. That is meaningful added value, though it does not fully restate per-parameter meaning already in 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?

Starts with a precise verb and resource: "Permanently delete analytics payment records." It immediately scopes the action by excluding refunds and provider changes, and later names track_payment as the alternative for refunds, so an agent can distinguish it from siblings without opening any schema.

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 the sibling instead ("To record a refund that already occurred, use track_payment with isRefund") and when not to use this tool (refunds, provider changes). It also gives prerequisites: at least one of transactionId, visitorId, startAt, or endAt must be supplied, websiteId or domain with workspace token is required, and explicit confirmation should be obtained first.

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

get_breakdownGet Breakdown by DimensionA
Read-only
Inspect

Group visitors by any one of 25 dimensions, ranked by visitors descending, for a date range. Generic form of the named get_* breakdown tools: use it for dimensions without one (entry_page, exit_link, browser_version, os_version, utm_source, utm_medium, utm_term, utm_content, ref, source, via, all_params); for page, referrer, country, region, city, device, browser, os, campaign, hostname, channel, or goal the dedicated tool returns the same rows. Combine dimension with filter_* to drill in: dimension page plus filter_utm_campaign shows where one campaign landed. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
dimensionYesDimension to group by. Without a dedicated tool: entry_page (landing page), exit_link (outbound click), browser_version, os_version, utm_source, utm_medium, utm_term, utm_content, ref, source, via, all_params (every tracking parameter at once). With one: device, page, hostname, referrer, channel, campaign (same as utm_campaign), goal, country, region, city, browser, os.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (rows of the requested dimension with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/non-destructive, and the description adds real context beyond them: descending rank order, the returned row fields (value, visitors, revenue, percentage), pagination.total linkage, limit default/max, 30-day date default, that all filter_* apply, and the auth requirement (websiteId/domain plus workspace token).

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?

Information-dense but front-loaded: purpose, then routing, then example, then output/limits, then auth. No filler sentences; each clause carries actionable content.

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 29-parameter generic breakdown tool with full schema coverage and an output schema, the description supplies the missing conceptual layer: routing among siblings, filter interaction, defaults, and auth requirements. Nothing needed to call it correctly is absent.

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 the baseline is 3. The description nonetheless adds routing value by explaining which dimension values lack dedicated tools and clarifying the generic-vs-dedicated relationship, plus the filter combination model, going modestly beyond the schema text.

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

Purpose5/5

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

States a specific verb+resource (group visitors by dimension), the output ordering (ranked by visitors descending), and the scoping (date range). It also positions itself against the sibling get_* tools by naming exactly which dimensions have dedicated tools and which do not.

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 routing: use this for dimensions without a dedicated tool (with the full list), use the dedicated tool for the enumerated others, and combine dimension with filter_* to drill in, illustrated with a concrete example. Both when-to-use and when-to-prefer-alternatives are covered.

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

get_browsersGet Visitors by BrowserA
Read-only
Inspect

Get visitors grouped by browser name (Chrome, Safari, Firefox, Edge, and others), ranked by visitors descending, for a date range. Names only: use get_breakdown with dimension browser_version for versions, get_operating_systems for the OS split, and get_devices for desktop versus mobile. Pass filter_browser to other tools to scope them to one browser. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (browser rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

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, destructiveHint=false, openWorldHint=false, so safety is covered. The description adds genuinely new behavior: rows carry value/visitors/revenue/percentage with pagination.total, limit defaults to 100 (max 1000), dates default to last 30 days, and auth requires websiteId or domain with a workspace token. Only minor gap is that the row payload partially duplicates the output schema.

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?

Four tight sentences, front-loaded with what the tool returns, then routing alternatives, then output shape/defaults, then auth. No filler and nothing repeats the parameter list verbatim.

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 28-parameter tool, the description covers the essentials an agent needs: defaults, pagination, auth requirement, the universal applicability of filter_* arguments, and how to get sibling breakdowns. With an output schema present it correctly avoids re-documenting return fields in depth.

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 the baseline is 3. The description adds cross-cutting semantics not obvious from the schema alone: that all filter_* arguments apply here, that filter_browser values come from this tool's own output, and that limit/date defaults and the websiteId-or-domain auth rule govern invocation.

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

Purpose5/5

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

States a specific verb and resource ('Get visitors grouped by browser name'), names the ranking and grouping semantics, and explicitly distinguishes itself from get_breakdown (browser_version), get_operating_systems, and get_devices. An agent can select it without opening any sibling schema.

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 routes the agent: use get_breakdown with dimension browser_version for versions, get_operating_systems for OS, get_devices for device type, and use filter_browser on other tools to scope them to one browser. This is exactly the when-to-use/when-not framing.

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

get_campaignsGet Campaign PerformanceA
Read-only
Inspect

Get UTM campaigns (utm_campaign values) ranked by visitors descending for a date range. Only visits tagged with utm_campaign appear, so untagged traffic is absent; use get_referrers or get_channels for the full source picture. Use get_breakdown with dimension utm_source, utm_medium, utm_term, utm_content, or all_params for the other tracking parameters. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (utm_campaign rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, closed-world). The description adds real behavioral context beyond that: the data-scope caveat that only visits tagged with utm_campaign appear and untagged traffic is silently absent, the auth requirement (websiteId or domain plus a workspace token), and pagination.total semantics. It stops short of describing rate limits or exact sort tie-breaking, so 4 rather than 5.

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?

Dense and front-loaded: scoping/ranking first, then alternatives, then return shape and defaults, then auth. Almost every clause earns its place, though the row-shape and limit-default sentences partly duplicate the schema and output schema.

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 28-parameter read tool with an output schema, the description covers the essentials an agent needs: scope limitations, sibling routing, defaults, pagination, and auth requirements. Return-value detail is redundant given the output schema but nothing required for a correct call is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 28 parameters including defaults, filter operators, and value sources. The description largely restates what is already structured (limit default 100/max 1000, dates default to last 30 days, all filter_* apply), adding little semantic meaning beyond 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?

States a specific verb and resource (get UTM campaigns / utm_campaign values), specifies ranking (visitors descending) and scope (date range), and explicitly differentiates itself from get_referrers, get_channels, and get_breakdown by naming what those return instead. An agent can immediately tell this apart from its siblings.

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?

Gives explicit when-to-use (UTM campaign values ranked by visitors), when-not (only tagged traffic appears; untagged traffic is absent), and names concrete alternatives (get_referrers, get_channels for full source picture; get_breakdown with utm_source/utm_medium/utm_term/utm_content/all_params for other tracking parameters). Nothing is left to inference.

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

get_channelsGet Traffic by ChannelA
Read-only
Inspect

Get visitors grouped into GA4-aligned marketing channels (Organic Search, Paid Search, Organic Social, Paid Social, Email, Display, Referral, Direct, Affiliate, Video, SMS, Audio), ranked by visitors descending, for a date range. Channels are classified from the referrer domain and utm_medium or utm_source. Use this first for the traffic mix, then get_referrers for the domains behind Referral and Organic Social, or get_campaigns for tagged campaigns. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (channel rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond them: the classification logic (referrer domain + utm_medium/utm_source), the returned fields (value, visitors, revenue, percentage, pagination.total), limit defaults, and the auth requirement of websiteId or domain with a workspace token.

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?

Three dense sentences with the core purpose front-loaded; the channel enumeration is bulky but earns its place by explaining how classification maps to output rows. Nothing is redundant padding, though the channel list could be trimmed.

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 28-parameter tool with an output schema, the description covers everything an agent needs: purpose, sequencing versus siblings, auth requirement (websiteId/domain + workspace token), date and limit defaults, filter applicability, and pagination field. Return values need not be re-explained given the output schema.

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

Parameters3/5

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

Schema description coverage is 100%, so each of the 28 parameters is already documented, which sets the baseline at 3. The description restates a few defaults (limit 100/1000, last-30-day dates) and generalizes that all filter_* arguments apply, but adds no operator or value syntax beyond what the schema already provides.

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

Purpose5/5

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

States a specific verb and resource ('Get visitors grouped into GA4-aligned marketing channels'), enumerates the channel set, and specifies ranking and date scoping. It is immediately distinguishable from siblings like get_referrers and get_campaigns, which it names directly.

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 sequences usage: 'Use this first for the traffic mix, then get_referrers for the domains behind Referral and Organic Social, or get_campaigns for tagged campaigns.' This gives both a when-to-use and a condition-based routing to two alternatives.

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

get_citiesGet Visitors by CityA
Read-only
Inspect

Get visitors grouped by city, ranked by visitors descending, for a date range. Finest geographic tool and the longest tail: pass filter_country or filter_region first so the top rows are meaningful, and raise limit above the default 100 (max 1000) when you need more. Use get_countries or get_regions for a coarser view. Rows carry value, visitors, revenue, and percentage with pagination.total. Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (city rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/non-destructive, and the description adds real context: the response row shape (value, visitors, revenue, percentage, pagination.total), the 30-day default window, and the auth requirement (websiteId or domain with a workspace token). It stops short of richer operational detail such as rate limits or exact pagination semantics beyond pointing at pagination.total.

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?

Front-loads the core purpose and ordering, then packs constraints into four more sentences with little waste. It is slightly dense, mixing performance tips with output/auth notes, but every sentence carries information an agent needs.

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 28-param read tool with a 100%-covered schema and an output schema, the description is complete: auth path, date defaults, ranking, pagination hook, and sibling routing are all present. Return values need not be fully explained given the output schema, and the sketch provided is a bonus.

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

Parameters3/5

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

Schema description coverage is 100%, so the 28 parameters are already fully documented in the schema, which sets the baseline at 3. The description reinforces a few defaults (limit 100/1000 max, last-30-days window) and notes that all filter_* arguments apply, but adds no operator or format detail beyond what the schema provides.

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

Purpose5/5

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

States a specific verb and resource ('Get visitors grouped by city'), plus the ordering guarantee (ranked by visitors descending) and the date-range scoping. It also names the coarser alternatives (get_countries, get_regions), so an agent can distinguish it from its siblings without opening a schema.

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?

Gives explicit when-to-use guidance: pass filter_country or filter_region first to make the long tail meaningful, and raise limit above the default 100 (max 1000) when more rows are needed. It also routes the agent to get_countries/get_regions for a coarser view.

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

get_countriesGet Visitors by CountryA
Read-only
Inspect

Get visitors grouped by country, ranked by visitors descending, for a date range. Coarsest of the three geographic tools: use get_regions for states or provinces and get_cities for cities, and add filter_country to either to drill into one country. Use get_realtime_map for where visitors are right now instead of over a range. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (country rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds real context beyond that: default ranking order, default date window (last 30 days), limit default/max, presence of pagination.total for paging, and the auth requirement (websiteId or domain with a workspace token). Return-field enumeration is partly redundant with the output schema, keeping it from a 5.

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?

Dense but front-loaded: routing guidance first, then output shape, then defaults and auth. Every sentence carries information, though the return-field list and limit default partially duplicate the output schema and parameter descriptions.

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 28-parameter analytics query with a full output schema and annotations, the description covers the essential extras an agent needs: sibling routing, default window, pagination mechanism, and authentication requirement. Nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter including defaults and formats; the description largely restates the limit default and the date default. 'All filter_* arguments apply' is the one additive statement but adds little beyond what the schema shows. 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?

States a specific verb+resource+ordering ('Get visitors grouped by country, ranked by visitors descending, for a date range') and explicitly positions itself as the coarsest of three geographic tools, naming get_regions and get_cities as finer-grained alternatives. An agent can distinguish it from all siblings without opening a schema.

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 routing: use get_regions for states/provinces, get_cities for cities, add filter_country to drill into one country, and use get_realtime_map for 'right now' instead of a range. Clear when-to-use and when-to-use-something-else.

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

get_devicesGet Visitors by DeviceA
Read-only
Inspect

Get visitors split by device type (Desktop, Mobile, Tablet), ranked by visitors descending, for a date range. Use this for the mobile-versus-desktop question; use get_browsers or get_operating_systems for the software split. Pass filter_device to any other tool to restrict it to one device type instead. Three rows at most, so pagination rarely matters. Rows carry value, visitors, revenue, and percentage. Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (up to three rows, Desktop, Mobile, Tablet, with value, visitors, revenue, percentage), and pagination.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already establish readOnly/no-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: cardinality ('three rows at most, so pagination rarely matters'), default window (last 30 days), that all filter_* arguments apply, and the auth requirement (websiteId or domain with a workspace token). It stops short of explaining how results are bucketed or what happens with timezone edge cases.

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 the core purpose, then routing, then operational caveats. Every sentence carries distinct information — no filler, no restatement of the tool name.

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 an output schema present the description need not explain return shape, yet it still flags that rows carry value/visitors/revenue/percentage and that cardinality is bounded. Auth requirements, defaults, and scope are all covered for a 28-param tool, leaving nothing an agent must guess before calling.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description still adds value by noting date defaults and that every filter_* argument applies, and by reframing filter_device as a cross-tool switch rather than just this tool's own filter. That is meaningful semantics beyond the per-parameter schema text.

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

Purpose5/5

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

States a specific verb and resource (get visitors split by device type), names the exact dimension values, the ranking order, and the time scoping. It explicitly separates itself from get_browsers and get_operating_systems, so an agent can route correctly without opening any schema.

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 routing guidance: 'Use this for the mobile-versus-desktop question; use get_browsers or get_operating_systems for the software split.' It also tells the agent the alternative pattern (pass filter_device to another tool) when a single device slice is wanted rather than a breakdown.

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

get_goalsGet Goal CompletionsA
Read-only
Inspect

Get every configured goal (custom events plus the auto-created payment and free_trial goals) with how many visitors completed it in the date range. Use this to compare conversions across goals; use get_overview for conversion_rate against the site's KPI goal, get_breakdown with dimension goal for the same list with revenue and percentage, and get_visitor for one person's completions. Dates default to the last 30 days; filter_* narrows the visitors counted and limit/offset page the goal list. Goals are created by track_goal. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (one entry per configured goal with its name and completion count for the window), and pagination.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely useful context beyond that: the auth requirement (websiteId or domain with a workspace token), the 30-day default window, and how filter_* narrows the counted visitors. It stops short of rate-limit or pagination-edge behavior but is solid.

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?

Purpose and routing are front-loaded, then defaults/pagination, then the creation/auth notes. Every sentence carries distinct information with no filler, despite the density required by 28 parameters.

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 an output schema present, return values need not be explained. The description covers what an agent needs to call correctly: scope, defaults, filter semantics, pagination, sibling routing, and auth requirements.

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 meaning on top: filter_* narrows the visitors counted, limit/offset page the goal list, and dates default to the last 30 days, plus the note that goals originate from track_goal. This goes beyond restating schema fields.

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

Purpose5/5

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

States a specific verb+resource (get every configured goal) and the exact return content (completion counts per goal in the date range), including which goals are included (custom plus auto-created payment and free_trial). This clearly distinguishes it from sibling tools like get_overview and get_breakdown.

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 routes the agent: use get_overview for conversion_rate against the KPI goal, get_breakdown with dimension goal for revenue/percentage, get_visitor for a single person. It also states the alternative and condition, leaving nothing to inference.

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

get_hostnamesGet Traffic by HostnameA
Read-only
Inspect

Get visitors grouped by hostname, ranked by visitors descending, for a date range. Useful when one website tracks several domains or subdomains (www, app, docs); a single-domain site returns one row. Use get_pages for paths within a host, and pass filter_hostname to any other tool to scope it to one host. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (hostname rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare a safe read-only, non-open-world operation, so the safety burden is lifted. The description adds real behavioral context beyond that: the required auth (websiteId or domain with a workspace token), that limit defaults to 100 and caps at 1000, and that dates default to the last 30 days. It does not discuss rate limits or cross-workspace id caveats, but the coverage is solid.

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?

Front-loaded with purpose and scope, then alternatives, then output shape, then auth — a sensible ordering. Dense but every sentence carries information; slightly long as a single block with no visual separation for the defaults/auth clauses.

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 28 parameters, the description covers the composite defaults (limit, dates), the alternative tool, the sibling-scoping pattern, the row shape, and the auth requirement. An output schema exists so return-value explanation is not strictly required, yet the row/pagination summary is a bonus. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is already 100%, so baseline is 3, but the description adds meaning on top: default/max limit values, the 30-day default date window, that all filter_* arguments apply, and the operand semantics pointer on filter_hostname. That is genuine added value over the per-parameter schema text.

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

Purpose5/5

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

States a specific verb and resource ('Get visitors grouped by hostname, ranked by visitors descending, for a date range'), plus the distinguishing edge case that a single-domain site returns one row. An agent can immediately tell this apart from get_pages and the other breakdown 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?

Explicitly names the alternative ('Use get_pages for paths within a host') and the cross-cutting pattern ('pass filter_hostname to any other tool to scope it to one host'), and states when this tool degenerates to a single row. This covers when-to-use and when-not-to-use without inference.

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

get_issueGet Issue Detail
Read-only
Inspect

Get full detail for one AI-detected issue: every occurrence with timestamps, the sessions behind it, steps to replicate, comments, and any linked Linear or Jira ticket. Get issueId from list_issues; use this only when you need the evidence behind one issue. An unknown id, or one from another website, fails with 'Issue not found'; on a free trial only the first 10 issues are available, and later ones fail as not included in the current plan. Each session lists its recording id, the anonymous visitorUid, start URL and page title, timing and event counts; no names, emails or locations are returned, so surface only what answers the question. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
issueIdYesIssue ID from list_issues
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: the issue with its occurrences, affected sessions, steps to replicate, comments, and external ticket link if any.
get_metadataGet Website SettingsA
Read-only
Inspect

Get one website's settings: domain, timezone, currency, KPI goal name, logo, and color scheme. Read-only; nothing is changed. Call it after list_websites to learn the timezone and currency before running date-range reports, then pass that timezone to the report tools. With a workspace token pass websiteId or domain; with neither it returns the same website list as list_websites, so prefer list_websites for discovery. A website key needs no selector.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: one entry with domain, timezone, currency, kpi, kpiColorScheme, and logo. Without a selector on a workspace token, the website list instead.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, and openWorldHint, so the safety profile is covered. The description adds important auth/selector behavior: workspace-token calls need websiteId or domain, without either it behaves like list_websites, and a website key needs no selector. It does not discuss rate limits or error behavior.

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 front-loaded and information-dense, with the purpose and fields stated first. It is slightly longer than necessary because 'Read-only; nothing is changed' repeats the readOnlyHint annotation, but the remaining sentences earn their 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 that an output schema exists and schema coverage is complete, the description does not need to explain return values. It covers the purpose, when to use it, selector behavior, auth-token variations, and the preferred sibling for discovery, making it complete for an agent to call 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 description coverage is 100%, so the schema already defines the three parameters. The description adds meaningful conditional semantics beyond the schema: workspace-token calls should pass websiteId or domain, a website key needs no selector, and calling with neither returns the website list.

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

Purpose5/5

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

The description states a specific verb and resource: get one website's settings, and enumerates the key fields returned (domain, timezone, currency, KPI goal name, logo, color scheme). It also distinguishes itself from list_websites by saying list_websites is preferred 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 Guidelines5/5

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

It explicitly says to call it after list_websites to learn timezone and currency before running date-range reports, then pass that timezone to report tools. It also gives clear selector guidance: with a workspace token pass websiteId or domain, with neither it returns the website list, and a website key needs no selector.

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

get_operating_systemsGet Visitors by Operating SystemA
Read-only
Inspect

Get visitors grouped by operating system (Mac OS, Windows, iOS, Android, Linux, and others), ranked by visitors descending, for a date range. Names only: use get_breakdown with dimension os_version for versions, get_browsers for the browser split, and get_devices for desktop versus mobile. Pass filter_os to other tools to scope them to one OS. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (operating system rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, closed-world), and the description adds real context: authentication requirement (websiteId or domain with a workspace token), default window of the last 30 days, default limit of 100 with max 1000, and that all filter_* arguments apply. It restates return fields that the output schema already documents, which caps this below a 5.

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 routing constraints are front-loaded and the sentences are dense without filler. The return-shape sentence (value, visitors, revenue, percentage, pagination.total) is partly redundant with the existing output schema, so the description is slightly longer than strictly necessary.

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 28-parameter, zero-required-parameter analytics tool with an output schema already present, the description covers what the schema cannot: auth mode, default time range, ranking order, pagination behavior, and how to reuse the OS filter across sibling tools. Nothing essential for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds cross-tool semantics the schema does not: filter_os values are names returned by this tool, and the same filter_os can be passed to other tools. It also notes defaults for limit and the date range, though individual parameter syntax is largely left to 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 states a precise verb+resource+scope: visitors grouped by operating system, ranked by visitors descending, within a date range. It also names the sibling tools that answer adjacent questions (get_breakdown with os_version, get_browsers, get_devices), so an agent can distinguish it without opening other schemas.

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?

It gives explicit alternatives and the condition selecting each: versions → get_breakdown with dimension os_version, browsers → get_browsers, desktop vs mobile → get_devices. It further states that filter_os can be passed to other tools to scope them to one OS, which is actionable routing guidance.

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

get_overviewGet Traffic OverviewA
Read-only
Inspect

Get headline totals for one website over a date range as a single row: visitors, sessions, bounce rate, average session duration, revenue, revenue per visitor, and conversion rate. Dates default to the last 30 days ending now; timezone defaults to the site setting. Every filter_* argument narrows the whole result, so filter_country plus filter_device answers 'mobile visitors from Germany' in one call. Use get_timeseries for the trend over time and a get_* breakdown tool for the split by page, source, or geography. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: a single row with visitors, sessions, bounceRate (percentage), avgSessionDuration and avgEngagedTime (seconds), revenue, renewalRevenue, refundedRevenue, revenuePerVisitor, conversionRate (percentage), kpiValue, kpiPerVisitor, kpiConversionRate, and currency for the window.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description usefully adds default window behavior (last 30 days ending now), timezone default from site settings, that every filter_* narrows the whole result, and the auth requirement (websiteId or domain with a workspace token). It stops short of noting rate limits or how pagination/limits interact for a single-row tool, so it is strong but not exhaustive.

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?

Four sentences, front-loaded with the metric list, then defaults, then filter semantics, then sibling routing and auth. Every sentence carries information, though the metric enumeration and the routing sentence make it denser than strictly necessary. No filler.

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 28-parameter, zero-required read tool with a full output schema and annotations, the description covers the essentials: what it returns, default date/timezone behavior, how filters compose, when to prefer siblings, and the auth requirement. Return-value details are correctly left to the output schema.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description earns above baseline by adding cross-parameter semantics the schema does not state: that every filter_* argument narrows the entire result and that filters can be combined in one call to answer compound questions, plus the websiteId/domain auth distinction tied to token type.

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

Purpose5/5

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

The description states a specific verb and resource ('Get headline totals for one website over a date range as a single row') and then enumerates the exact metrics returned (visitors, sessions, bounce rate, etc.), so the agent knows precisely what this tool produces. It also explicitly distinguishes itself from sibling tools get_timeseries and get_* breakdown 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?

It gives explicit routing: 'Use get_timeseries for the trend over time and a get_* breakdown tool for the split by page, source, or geography.' It also shows when/how to combine filters with a concrete example ('mobile visitors from Germany' via filter_country plus filter_device), leaving nothing to inference.

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

get_pagesGet Top PagesA
Read-only
Inspect

Get page paths ranked by visitors, descending, for a date range: which pages get the most traffic. Use get_breakdown with dimension entry_page for landing pages or exit_link for outbound clicks, and get_hostnames when the site serves several domains. Add filter_utm_campaign or filter_referrer to see where one source's traffic landed. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish the safe-read profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false). The description adds real context beyond them: the row shape (value, visitors, revenue, percentage, pagination.total), the default window (last 30 days) and limit default/max, and the auth prerequisite (websiteId or domain with a workspace token). It stops short of describing failure modes or token/key differences in detail, so a 4 rather than 5.

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?

Front-loaded with purpose, ordering and unit, then routing, then response shape and defaults. Dense but nearly every clause carries information. Minor redundancy: 'which pages get the most traffic' restates 'ranked by visitors' and could be cut.

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

Completeness4/5

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

With an output schema present, the description need not explain return values, yet it still names the key row fields and pagination.total for offset/limit reasoning. Auth requirements and defaults are covered. For a 28-parameter read tool this is close to complete; only edge-case behavior (empty results, invalid token) is unaddressed.

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

Parameters3/5

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

Schema description coverage is 100% across 28 parameters, so the schema already documents each argument, including the shared filter operator syntax. The description's contributions (limit default 100/max 1000, dates default to last 30 days, all filter_* apply) largely restate schema content. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (get), resource (page paths) and an explicit ordering (ranked by visitors, descending) plus scope (date range). It actively disambiguates itself from siblings by naming get_breakdown with dimension entry_page / exit_link and get_hostnames. An agent can pick this tool without opening any schema.

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 routing rules: use get_breakdown with entry_page for landing pages, exit_link for outbound clicks, get_hostnames for multi-domain sites. It also tells the agent how to narrow results with filter_utm_campaign / filter_referrer. Both when-to-use and when-to-use-something-else are given.

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

get_realtimeGet Active Visitor CountA
Read-only
Inspect

Count the visitors active on the site within the last 5 minutes. A point-in-time number with no history: it takes no date, filter, or pagination arguments. Use get_timeseries with interval hour for recent trends and get_realtime_map when you need where those visitors are. Returns data[0].visitors. Poll no more than once every 5 seconds. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: data[0].visitors is the count of visitors active in the last 5 minutes.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare a safe read operation, but the description adds important behavioral context: point-in-time scope, no date/filter/pagination arguments, polling rate limit of once per 5 seconds, and authentication requirements (websiteId or domain with a workspace token).

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 front-loaded with the core purpose, then efficiently covers constraints, alternatives, return path, polling limit, and auth. Every sentence adds distinct value with no wasted wording.

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 annotations covering safety, full schema coverage, and an output schema available, the description supplies all remaining operational context an agent needs: scope, alternatives, polling rate, and auth requirements.

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 the schema already documents each parameter. The description still adds useful semantics by stating that the tool takes no date, filter, or pagination arguments and clarifying the websiteId/domain token dependency, which goes slightly beyond the schema text.

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

Purpose5/5

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

States a specific verb and resource (count active visitors), defines the time window (last 5 minutes), and distinguishes the result as point-in-time with no history. It also names sibling tools for different needs, so an agent can disambiguate immediately.

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 says when to use alternatives: get_timeseries with interval hour for recent trends, and get_realtime_map when location is needed. It also provides a clear polling constraint, making intended usage unambiguous.

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

get_realtime_mapGet Live Visitor Map
Read-only
Inspect

Get the visitors active on the site in the last 5 minutes with their approximate location, for a live map view. Locations come from the IP address at city level, with coordinates rounded to 0.1 degrees. Use get_realtime when only the count matters, and get_countries or get_cities for geography over a historical date range. Takes only the website selector: no dates, filters, or pagination. Poll no more than once every 5 seconds. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: up to 1000 active visitors, each with visitorId, country, countryCode, region, city, latitude and longitude rounded to 0.1 degrees, browser, os, deviceType, currentUrl, referrer, and pageviews. Names, emails and per-visitor revenue are left out; use get_visitor for one specific visitor.
get_referrersGet Top ReferrersA
Read-only
Inspect

Get referrers ranked by visitors, descending: which external sites sent traffic in the date range. Recognized sites appear under a source name (Google, ChatGPT, Reddit), others under their domain. Use get_channels when you want traffic grouped into GA4-style channels (Direct, Organic Search, Paid Social) instead of individual domains, and get_campaigns or get_breakdown with dimension utm_source for traffic identified by UTM tags rather than referrer. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (referrer rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint false, and openWorld false, so safety is covered. The description adds real behavioral context beyond annotations: recognized sites collapse under a source name (Google, ChatGPT, Reddit) while others show as domains, rows carry value/visitors/revenue/percentage with pagination.total, limit defaults to 100 (max 1000), dates default to 30 days, and it requires websiteId or domain with a workspace token.

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?

Front-loaded with the core purpose, then routing guidance, then defaults and auth requirements. Dense but every clause carries information; only the row-shape detail slightly overlaps the output schema.

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 28-parameter read tool with an output schema, the description covers purpose, sibling routing, defaults, auth requirements, and row contents. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description exceeds it by confirming that all filter_* arguments apply, spelling out default values for limit and the date window, and clarifying the semantics of filter_referrer (source name vs domain). With 28 parameters this is meaningful added 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?

States a specific verb and resource (get referrers) plus sort order (ranked by visitors, descending) and scope (external sites sending traffic in the date range). It further distinguishes itself from get_channels, get_campaigns, and get_breakdown by name, so an agent can route correctly without opening schemas.

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 names the alternatives and the exact condition that selects each: get_channels for GA4-style channel grouping, get_campaigns or get_breakdown with dimension utm_source for UTM-tagged traffic. This is a textbook when-to-use-this-vs-that statement.

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

get_regionsGet Visitors by RegionA
Read-only
Inspect

Get visitors grouped by region or state name (such as California or Bavaria), ranked by visitors descending, for a date range. Sits between get_countries (coarser) and get_cities (finer); combine with filter_country to list the regions of one country. Pass filter_region to other tools to scope them to one region. Rows carry value, visitors, revenue, and percentage with pagination.total; limit defaults to 100 (max 1000). Dates default to the last 30 days; all filter_* arguments apply. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (region rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/destructive/openWorld, so safety is covered. The description adds real behavioral context beyond that: returned columns (value, visitors, revenue, percentage), pagination.total, limit default/max, 30-day date default, and the auth prerequisite (websiteId or domain with a workspace token). Return-shape detail partially overlaps the output schema, keeping this just short of a 5.

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?

Four tight sentences, front-loaded with what it returns and where it sits in the hierarchy, then defaults, then auth. No filler; each clause carries information an agent needs.

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 28-parameter tool with full schema coverage, an output schema, and annotations covering safety, the description supplies the missing pieces: sibling positioning, auth requirement, pagination semantics, and default windows. Nothing essential for correct invocation is absent.

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% and each filter_* parameter is documented in the schema (including operator syntax). The description only restates a few defaults (limit 100/1000, last 30 days) and the blanket 'all filter_* arguments apply', adding little 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?

States a specific verb and resource (visitors grouped by region/state), the ranking (by visitors descending), and the date-range scope. It explicitly positions itself in the geographic hierarchy between get_countries and get_cities, so an agent can distinguish it from siblings immediately.

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?

Gives concrete when-to-use routing: combine with filter_country to list one country's regions, and pass filter_region to other tools to scope them. Names the alternatives (get_countries, get_cities) with their relative granularity.

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

get_timeseriesGet Analytics Time SeriesA
Read-only
Inspect

Get the same metrics as get_overview bucketed by hour, day, week, or month, plus totals across the whole window. Returns one point per bucket with timestamp, name, visitors, sessions, revenue split into newRevenue, renewalRevenue and refundedRevenue, conversionRate, and kpiValue. Use this for trends and charts; use get_overview for one total and a get_* breakdown tool for a split by dimension rather than time. Dates default to the last 30 days and interval to day. Match interval to range: hourly buckets across a year return thousands of points. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
endAtNoISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now.
limitNoMax rows to return (1-1000, default 100).
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoRows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response.
startAtNoISO 8601 start of the reporting window, date or datetime (e.g. "2026-01-01" or "2026-01-01T00:00:00Z"). Defaults to 30 days ago.
intervalNoBucket size: hour, day, week, or month (default: day). Pick hour only for ranges of a few days.
timezoneNoIANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata.
filter_osNoFilter by operating system name as returned by get_operating_systems (e.g. "iOS")
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
filter_refNoFilter by ref URL parameter
filter_viaNoFilter by via URL parameter
filter_cityNoFilter by city name as returned by get_cities
filter_goalNoFilter to visitors who completed this goal name (as returned by get_goals)
filter_pageNoFilter by page path as returned by get_pages (e.g. "/pricing")
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
filter_deviceNoFilter by device type as returned by get_devices: "Desktop", "Mobile" or "Tablet". Matching is case-sensitive.
filter_regionNoFilter by region name as returned by get_regions (e.g. "California")
filter_sourceNoFilter by source URL parameter
filter_browserNoFilter by browser name as returned by get_browsers (e.g. "Chrome")
filter_channelNoFilter by marketing channel as returned by get_channels (e.g. "Organic Search")
filter_countryNoFilter by country name as returned by get_countries (e.g. "United States"). Every filter_* value accepts the same operators: "v" is, "!v" is not, "~v" contains, "!~v" does not contain, "a|b" any of. Filters combine with AND.
filter_hostnameNoFilter by hostname as returned by get_hostnames (e.g. "app.example.com")
filter_referrerNoFilter by referrer as returned by get_referrers: a source name such as "Google" for recognized sites, otherwise the domain
filter_utm_termNoFilter by UTM term
filter_entry_pageNoFilter by entry/landing page
filter_utm_mediumNoFilter by UTM medium
filter_utm_sourceNoFilter by UTM source
filter_utm_contentNoFilter by UTM content
filter_utm_campaignNoFilter by UTM campaign

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with interval, timezone, currency, data (one point per bucket with timestamp, name, visitors, sessions, revenue, newRevenue, renewalRevenue, refundedRevenue, conversionRate, kpiValue), totals {visitors, sessions, revenue} across the window, and pagination.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint=false. The description adds real behavioral context beyond that: default date range (last 30 days), default interval (day), an auth requirement (websiteId or domain with a workspace token), and a performance warning about hourly buckets over a year producing thousands of points. It omits pagination interaction details, which is why it is not a 5.

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 the core purpose and return shape, then guidance, then defaults, then auth. Every sentence carries distinct information and none is wasted.

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 an output schema present, the description needn't document return values, and it nonetheless summarizes the point structure. For a 29-parameter read tool it covers routing, defaults, interval/range trade-offs and auth — nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 29 parameters including defaults, enums and filter operators. The description restates date/interval defaults but adds no format or syntax beyond 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?

States a specific verb+resource ('Get the same metrics as get_overview bucketed by hour, day, week, or month') and enumerates the returned fields. It explicitly distinguishes itself from get_overview and get_* breakdown tools, so an agent can route without opening a schema.

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?

Names the alternatives and the conditions that select them: 'use get_overview for one total and a get_* breakdown tool for a split by dimension rather than time.' It also gives practical guidance on matching interval to range and notes the defaults.

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

get_visitorGet Visitor ProfileA
Read-only
Inspect

Get one visitor's full profile: geo, device, and browser identity, acquisition source, activity (visit and pageview counts, visited pages, completed goals), revenue (total, customer flag, seconds to first conversion), the identified profile (userId, name, email), and a merged timeline of pageviews, goals, and payments, newest first. Contains personal data: call it only when asked about a specific visitor and surface the minimum needed. profile is null for anonymous visitors; each list is capped at the 100 most recent items. Use the aggregate get_* tools for questions about many visitors. visitorId is the visitor record ID from get_realtime_map or the dashboard visitor view, not the _fs_vid cookie value; an unknown id, or one from another website, fails with 'Visitor not found'. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
visitorIdYesVisitor record ID from get_realtime_map or the dashboard visitor view (not the _fs_vid cookie value)
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: visitorId, identity, source, sourceIconUrl, activity, revenue, profile (null when anonymous), and activityTimeline sorted newest first.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already establish readOnly/no-destructive safety, but the description goes well beyond them: profile is null for anonymous visitors, each list is capped at the 100 most recent items, unknown/foreign ids fail with 'Visitor not found', and workspace-or-domain auth is required. Only the timeline ordering and cap nuance are covered; return shape is delegated to the output schema, which is appropriate.

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?

A single dense paragraph that is front-loaded with the resource description before constraints. Every sentence carries information (privacy, nullability, caps, errors, auth), though the volume of clauses makes it heavier than an ideal short brief.

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 4-param read tool with an output schema, the description covers purpose, privacy obligations, edge cases (anonymous visitors, 100-item caps, not-found errors), auth prerequisites, and sibling routing. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuinely non-redundant semantics: visitorId is the record ID from get_realtime_map or the dashboard view and explicitly NOT the _fs_vid cookie value, plus the websiteId-or-domain token requirement. That disambiguates the most error-prone parameter beyond the schema text.

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?

Specific verb+resource (one visitor's full profile) followed by an enumerated inventory of what the profile contains: geo/device/browser, acquisition, activity, revenue, identified profile, merged timeline. The closing contrast with the aggregate get_* siblings makes it unmistakably distinct from get_overview, get_breakdown, 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?

Explicit when-to-use and when-not: 'call it only when asked about a specific visitor', 'surface the minimum needed', and 'Use the aggregate get_* tools for questions about many visitors.' The privacy constraint plus the named alternative leaves nothing to inference.

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

list_issuesList Detected IssuesA
Read-only
Inspect

List issues the AI found while analyzing session recordings: bugs, broken flows, and UX problems, deduplicated across sessions and ranked by severity (or by last seen with sort recency). Each row has title, severity, status, sessions affected, and first/last seen; the response also carries site-wide open, in_progress, and resolved counts plus pagination.total. Start here for 'what is broken', then call get_issue with an id for occurrences, steps to replicate, and comments. Suspended issues are hidden unless status is suspended, so an issue that vanished was probably suspended, not deleted. On a free trial only the first 10 issues are listed and counted. Limit defaults to 100 (max 1000). Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoOrder by severity (default) or recency (last seen)
limitNoMax issues to return (1-1000, default 100)
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
offsetNoIssues to skip for pagination (default 0)
searchNoMatch against issue title and description
statusNoFilter by status. Omit for open, in_progress, and resolved together; suspended issues only appear with status=suspended
severityNoFilter by severity
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status, data (issues with id, title, description, severity, status, sessionsCount, firstSeenAt, lastSeenAt, stepsToReplicate, externalTicketUrl), counts {open, inProgress, resolved} for the whole site, and pagination {limit, offset, total}.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare a safe read, but the description adds substantial context beyond them: deduplication across sessions, default severity ranking, suspended issues being hidden rather than deleted, a free-trial cap of 10 issues, and the auth requirement (websiteId or domain with a workspace token). This is exactly the behavioral detail annotations cannot convey.

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?

Front-loaded with the core purpose and routing to get_issue before the finer details of counts, trial limits, and pagination. Dense but nearly every clause carries actionable information; slightly long with some redundancy between the response-field listing and the existing output schema.

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 what the tool returns (row fields, site-wide counts, pagination.total), how records can disappear, trial limitations, and default/max limits. Even though an output schema exists, the added context about suspended issues and trial truncation makes the description fully sufficient for correct invocation.

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 already 100%, so the baseline is 3, but the description reinforces key semantics: limit defaults to 100 with a 1000 max, recency means 'last seen', and status omission covers open/in_progress/resolved while suspended is opt-in. It doesn't add format or syntax beyond the schema, so not a 5.

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

Purpose5/5

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

States a specific verb and resource ('List issues the AI found while analyzing session recordings') and immediately enumerates the resource's content (bugs, broken flows, UX problems) with dedup and severity ranking. It is clearly distinguishable from siblings like list_websites and get_issue.

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 positions itself as the entry point ('Start here for what is broken') and names the follow-up tool with its purpose ('then call get_issue with an id for occurrences, steps to replicate, and comments'). It also explains the suspended-status edge case so an agent can interpret a missing issue correctly.

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

list_websitesList WebsitesA
Read-only
Inspect

List the websites the current API token can read, with id, domain, timezone, currency, and KPI goal per site. A workspace token (flow_ws_) returns every website in the workspace; a website key (flow_) returns only its own. Call this first with a workspace token: every other tool then needs websiteId or domain from this list, and omitting both fails with 'Website ID or domain is required'. Takes no parameters. Use get_metadata instead when you already know the website and only need its settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: one entry per website with id, domain, timezone, currency, kpi, logo, and trackingId. Use id as websiteId or domain as domain in other tools.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false. The description adds valuable behavioral context: workspace token returns every website, website key returns only its own, and omitting both identifiers fails with a specific error. However, it also says 'Takes no parameters,' which inaccurately describes the tool's behavior relative to the schema.

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?

Information is front-loaded with the core purpose and token behavior, and the failure condition is clearly stated. The only wasted and harmful sentence is 'Takes no parameters,' which is both unnecessary and incorrect.

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?

An output schema exists, so return values need not be explained, yet the description still lists them. It covers token types, call ordering, dependency requirements, and failure conditions well. The only meaningful gap is the inaccurate parameter statement that conflicts with the schema.

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

Parameters2/5

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

Schema description coverage is 100% for the optional workspaceId parameter, so the baseline would be 3. But the description states 'Takes no parameters,' which directly contradicts the schema and could mislead an agent into omitting workspaceId, causing calls to default to the wrong workspace.

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

Purpose5/5

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

States a specific verb 'List' and resource 'websites', defines scope by token type, and lists returned fields. It distinguishes itself from get_metadata by naming the alternative when the website is already known.

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 says to call this first with a workspace token, explains that every other tool needs websiteId or domain from this list, and gives the exact failure message when both are omitted. It also names get_metadata as the alternative for known-website settings.

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

list_workspacesList WorkspacesA
Read-only
Inspect

List the workspaces this sign-in can act in, across every organization the user belongs to. Returns { status, data } with one entry per workspace: id, name, organization { id, name }, role { key, name }, permissions, isDefault and current. Call this when the user names a workspace, client or organization, or when data they expect is missing, then pass the matching id as workspaceId to every other tool. Without workspaceId, tools act in the workspace marked current. A workspace API token (flow_ws_) belongs to one workspace, so it lists only that one; a website key (flow_) belongs to one website and fails with a 400 here. Takes no arguments.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoOne entry per workspace with id, name, organization, role, permissions, isDefault and current. Pass id as workspaceId to other tools.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/destructive/openWorld annotations, the description discloses auth-scoped behavior: a flow_ws_ token lists only its own workspace, a flow_ token fails here with a 400, and omitting workspaceId silently changes what other tools target. Those are non-obvious behavioral traits that annotations do not cover.

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?

Front-loaded with the purpose, then routing, then edge cases. Every sentence carries information, though the enumeration of return fields is partly redundant given the output schema exists.

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

Completeness5/5

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

For a zero-arg, multi-tenant discovery tool this covers purpose, routing, token/scope edge cases, and error behavior. An output schema exists, so the return-shape sentence is a bonus rather than a necessity, and nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Zero parameters, so the baseline is 4. The description reinforces this with 'Takes no arguments', and the semantics it does explain (workspaceId consumed by other tools) are about other tools rather than this one's inputs.

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

Purpose5/5

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

States a specific verb and resource ('List the workspaces this sign-in can act in') plus scope ('across every organization the user belongs to'), which clearly distinguishes it from sibling list_websites and the metric getters.

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?

Gives explicit trigger conditions ('when the user names a workspace, client or organization, or when data they expect is missing'), the downstream action ('pass the matching id as workspaceId to every other tool'), and the fallback semantics when workspaceId is omitted (tools act in the 'current' workspace). This is genuine routing guidance.

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

track_goalTrack Goal EventAInspect

Record one completion of a custom goal. The goal is created on first use, so no setup call is needed; names are lowercase letters, digits, underscores, and hyphens, max 64 chars. Pass visitorUid (the _fs_vid cookie value of a visitor the tracking script has already seen) so the completion attaches to that visitor's sessions and source; omit it for an anonymous completion. Each call appends a completion, so repeating it counts the goal twice. Use track_payment for revenue, which records a payment goal on its own. Undo with delete_goals. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesGoal name: lowercase letters, numbers, underscores, hyphens only (max 64 chars). E.g. "newsletter_signup", "add-to-cart"
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
metadataNoUp to 10 string key-value pairs stored with the completion. More than 10 fails with a 400.
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
visitorUidNoVisitor UID from the _fs_vid browser cookie of a visitor the tracking script has seen. Omit to record an anonymous completion.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: a confirmation message. The completion itself is written asynchronously and appears in get_goals shortly after.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare the safety profile (not read-only, not destructive, closed-world). The description adds behavior beyond them: auto-creation on first use, append semantics with the explicit warning that repeating counts the goal twice, visitor attribution behavior, and the auth requirement (websiteId or domain with a workspace token). That is exactly the value structured fields don't carry.

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 the core action, then behaviors, alternatives, undo path, and auth. Sentences are dense but each carries distinct information — no restatement of the title or filler.

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?

An output schema exists so return values need not be described. For a 6-param mutation with nested metadata, the description covers auto-creation, append/idempotency risk, attribution, alternatives, and auth — everything an agent needs to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description nonetheless adds interpretation beyond the schema for visitorUid (what it is, and the consequence of omitting it: anonymous completion) and reinforces the name/websiteId/domain auth relationship, though name constraints are largely restated from 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?

States a specific verb and resource: 'Record one completion of a custom goal.' It names the distinct sibling for adjacent work ('Use track_payment for revenue') and the inverse tool ('Undo with delete_goals'), so an agent can tell it apart from the other track_* tool without opening schemas.

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 when/when-not/alternatives: no setup call needed since the goal is created on first use, use track_payment for revenue, undo via delete_goals, pass visitorUid to attribute vs omit for anonymous. Every routing decision is stated, not inferred.

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

track_paymentTrack PaymentA
Destructive
Inspect

Record an analytics payment; this never charges a customer, moves money, or issues a refund. Revenue appears in get_overview, get_timeseries, and the visitor profile. Skip it when the site's provider (Stripe, LemonSqueezy, Polar, and other connected providers) is tracked automatically; use track_goal for conversions without revenue. transactionId must be unique: a repeated id is rejected, not deduplicated. A new payment also records a payment goal completion (free_trial when amount is 0); isRenewal skips that. isRefund with an existing transactionId overwrites that payment's recorded refund amount and any supplied customer attribution instead of adding a row. Attribution looks up a known visitor by visitorUid, customerId, or email; with no match the revenue is kept but its source shows as Unknown. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCustomer name
emailNoCustomer email
amountYesPayment amount in major currency units (e.g. 29.99). With isRefund, the amount refunded. 0 records a free_trial goal instead of a payment goal.
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
currencyYesCurrency code (e.g. "USD", "EUR")
isRefundNoTrue to record a refund. With an existing transactionId, marks that payment refunded by amount instead of creating a new record.
isRenewalNoTrue for recurring/renewal charges. Renewals are counted in revenue but do not record the automatic payment goal.
timestampNoISO 8601 time the payment happened (e.g. "2026-01-15T10:30:00Z"), for backfilling. Defaults to now.
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
customerIdNoCustomer ID from the payment provider. Also used to find the visitor when visitorUid is absent.
sessionUidNoSession ID for the current visitor session
visitorUidNoVisitor UID from the _fs_vid cookie. Strongly recommended: without it (or customerId/email matching a known visitor) the payment is attributed to Unknown
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another
transactionIdYesUnique transaction ID from your payment provider. Must not repeat across payments; reuse it only with isRefund to mark that payment refunded.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: a confirmation message once the payment is stored.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=true), and the description goes well beyond them: it states no money moves, that repeated transactionIds are rejected rather than deduplicated, that isRefund overwrites an existing record, that a payment auto-creates a goal, and that unmatched attribution falls back to Unknown. This is exactly the mutation semantics an agent needs before calling.

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?

Dense but front-loaded, leading with what the tool is not (never charges, moves money, refunds) before edge cases. Every sentence carries usable information, though the single block paragraph could be broken up for scanability.

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 14-parameter mutation tool with an output schema present, the description covers the risky behaviors, attribution fallback, goal side effect, and identifier prerequisites. Nothing an agent needs to invoke it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real semantic detail the schema lacks: the rejected-not-deduplicated behavior of transactionId, the overwrite semantics of isRefund, the free_trial goal on zero amount, and the attribution lookup order. Some phrasing (websiteId/domain requirement) restates schema, keeping it from a 5.

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?

Opens with a specific verb+resource ('Record an analytics payment') and immediately scopes it against siblings by naming track_goal as the no-revenue alternative. An agent can distinguish this from delete_payments, get_overview, etc. without opening a schema.

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?

Gives explicit when-not guidance ('Skip it when the site's provider is tracked automatically') and a named alternative for the adjacent case ('use track_goal for conversions without revenue'). Prerequisites (websiteId or domain with a workspace token) are also stated.

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

update_issue_statusUpdate Issue StatusInspect

Set an issue's status to open, in_progress, resolved, or suspended and return the updated issue. Only the status changes; title, severity, occurrences, and comments stay, and any status can be set again later, so this is reversible. Confirm which state the user means before calling: resolved asserts the bug is fixed, suspended hides a known non-problem from the default list_issues result. Not a delete: issues cannot be removed through this server. Get issueId from list_issues; an unknown id fails with 'Issue not found', and on a free trial issues beyond the first 10 fail as not included in the current plan. Requires websiteId or domain with a workspace token.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoWebsite domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token.
statusYesNew status. resolved asserts the bug is fixed; suspended hides a known non-problem from default listings; open and in_progress keep it visible
issueIdYesIssue ID from list_issues
websiteIdNoWebsite ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key.
workspaceIdNoWorkspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNoObject with status and data: the full issue detail after the change, with the new status.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedget_realtime_map1 field changed
      • changedOutput schema / properties / result / description
        Previous value: -"Object with status and data: up to 1000 active visitors, each with visitorId, country, countryCode, region, city, latitude, longitude, browser, os, deviceType, currentUrl, referrer, and pageviews. Names, emails and per-visitor revenue are left out; use get_visitor for one specific visitor."New value: +"Object with status and data: up to 1000 active visitors, each with visitorId, country, countryCode, region, city, latitude and longitude rounded to 0.1 degrees, browser, os, deviceType, currentUrl, referrer, and pageviews. Names, emails and per-visitor revenue are left out; use get_visitor for one specific visitor."
  2. 28 tool updates
    • Changeddelete_goals2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changeddelete_payments2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_breakdown2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_browsers2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_campaigns2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_channels2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_cities2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_countries2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_devices2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_goals2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_hostnames2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_issue2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_metadata2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_operating_systems2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_overview2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_pages2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_realtime2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_realtime_map2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_referrers2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_regions2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_timeseries2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_visitor2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedlist_issues2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedlist_websites2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedlist_workspaces2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedtrack_goal2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedtrack_payment2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedupdate_issue_status2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
  3. 18 tool updates
    • Changedget_breakdown5 fields changed
      • changedInput schema / properties / dimension / description
        Previous value: -"Dimension to group by. Without a dedicated tool: entry_page (landing page), exit_link (outbound click), browser_version, os_version, utm_source, utm_medium, utm_term, utm_content, ref, source, all_params (every tracking parameter at once). With one: device, page, hostname, referrer, channel, campaign (same as utm_campaign), goal, country, region, city, browser, os."New value: +"Dimension to group by. Without a dedicated tool: entry_page (landing page), exit_link (outbound click), browser_version, os_version, utm_source, utm_medium, utm_term, utm_content, ref, source, via, all_params (every tracking parameter at once). With one: device, page, hostname, referrer, channel, campaign (same as utm_campaign), goal, country, region, city, browser, os."
      • changedInput schema / properties / dimension / enum
        Previous value: -[
        -  "device",
        -  "page",
        -  "entry_page",
        -  "exit_link",
        -  "hostname",
        -  "referrer",
        -  "channel",
        -  "campaign",
        -  "goal",
        -  "country",
        -  "region",
        -  "city",
        -  "browser",
        -  "browser_version",
        -  "os",
        -  "os_version",
        -  "utm_source",
        -  "utm_medium",
        -  "utm_campaign",
        -  "utm_term",
        -  "utm_content",
        -  "ref",
        -  "source",
        -  "all_params"
        -]New value: +[
        +  "device",
        +  "page",
        +  "entry_page",
        +  "exit_link",
        +  "hostname",
        +  "referrer",
        +  "channel",
        +  "campaign",
        +  "goal",
        +  "country",
        +  "region",
        +  "city",
        +  "browser",
        +  "browser_version",
        +  "os",
        +  "os_version",
        +  "utm_source",
        +  "utm_medium",
        +  "utm_campaign",
        +  "utm_term",
        +  "utm_content",
        +  "ref",
        +  "source",
        +  "via",
        +  "all_params"
        +]
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_browsers3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_campaigns3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_channels3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_cities3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_countries3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_devices4 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
      • changedOutput schema / properties / result / description
        Previous value: -"Object with status, data (up to three rows, desktop, mobile, tablet, with value, visitors, revenue, percentage), and pagination."New value: +"Object with status, data (up to three rows, Desktop, Mobile, Tablet, with value, visitors, revenue, percentage), and pagination."
    • Changedget_goals3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_hostnames3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_operating_systems3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_overview5 fields changed
      • removedInput schema / properties / fields
        Removed value: -{
        -  "description": "Comma-separated metrics to include: visitors, sessions, bounce_rate, avg_session_duration, currency, revenue, revenue_per_visitor, conversion_rate. Omit for all.",
        -  "type": "string"
        -}
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
      • changedOutput schema / properties / result / description
        Previous value: -"Object with status and data: a single row with visitors, sessions, bounce_rate, avg_session_duration, currency, revenue, revenue_per_visitor, and conversion_rate (a percentage) for the window."New value: +"Object with status and data: a single row with visitors, sessions, bounceRate (percentage), avgSessionDuration and avgEngagedTime (seconds), revenue, renewalRevenue, refundedRevenue, revenuePerVisitor, conversionRate (percentage), kpiValue, kpiPerVisitor, kpiConversionRate, and currency for the window."
    • Changedget_pages3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_referrers4 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
      • changedOutput schema / properties / result / description
        Previous value: -"Object with status, data (referrer domain rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."New value: +"Object with status, data (referrer rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_regions3 fields changed
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
    • Changedget_timeseries5 fields changed
      • removedInput schema / properties / fields
        Removed value: -{
        -  "description": "Comma-separated metrics: visitors, sessions, revenue, conversion_rate, name",
        -  "type": "string"
        -}
      • changedInput schema / properties / filter_device / description
        Previous value: -"Filter by device type: desktop, mobile, tablet"New value: +"Filter by device type as returned by get_devices: \"Desktop\", \"Mobile\" or \"Tablet\". Matching is case-sensitive."
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"New value: +"Filter by referrer as returned by get_referrers: a source name such as \"Google\" for recognized sites, otherwise the domain"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region code as returned by get_regions (e.g. US-CA)"New value: +"Filter by region name as returned by get_regions (e.g. \"California\")"
      • changedOutput schema / properties / result / description
        Previous value: -"Object with interval, timezone, currency, data (one point per bucket with timestamp, name, the requested metrics, and revenueBreakdown of new, renewal, refund), totals across the window, and pagination."New value: +"Object with interval, timezone, currency, data (one point per bucket with timestamp, name, visitors, sessions, revenue, newRevenue, renewalRevenue, refundedRevenue, conversionRate, kpiValue), totals {visitors, sessions, revenue} across the window, and pagination."
    • Changedlist_issues1 field changed
      • changedOutput schema / properties / result / description
        Previous value: -"Object with status, data (issues with id, title, severity, status, sessionsAffected, firstSeenAt, lastSeenAt), counts {open, inProgress, resolved} for the whole site, and pagination {limit, offset, total}."New value: +"Object with status, data (issues with id, title, description, severity, status, sessionsCount, firstSeenAt, lastSeenAt, stepsToReplicate, externalTicketUrl), counts {open, inProgress, resolved} for the whole site, and pagination {limit, offset, total}."
    • Changedtrack_goal1 field changed
      • changedInput schema / properties / metadata / description
        Previous value: -"Up to 10 custom key-value pairs. Keys: lowercase, max 64 chars. Values: max 255 chars."New value: +"Up to 10 string key-value pairs stored with the completion. More than 10 fails with a 400."
    • Changedtrack_payment1 field changed
      • addedInput schema / properties / timestamp
        Added value: +{
        +  "description": "ISO 8601 time the payment happened (e.g. \"2026-01-15T10:30:00Z\"), for backfilling. Defaults to now.",
        +  "type": "string"
        +}
  4. 28 tool updates
    • Changeddelete_goals1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changeddelete_payments1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_breakdown1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_browsers1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_campaigns1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_channels1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_cities1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_countries1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_devices1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_goals1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_hostnames1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_issue1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_metadata1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_operating_systems1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_overview1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_pages1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_realtime1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_realtime_map1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_referrers1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_regions1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_timeseries1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedget_visitor1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedlist_issues1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedlist_websites2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Addedlist_workspaces
    • Changedtrack_goal1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedtrack_payment1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
    • Changedupdate_issue_status1 field changed
      • addedInput schema / properties / workspaceId
        Added value: +{
        +  "description": "Workspace to act in: an id from list_workspaces. Omit to use the default workspace. Use the same workspaceId for every call about the same workspace, since ids from one workspace do not exist in another",
        +  "type": "string"
        +}
  5. 2 tool updates
    • Changedget_realtime_map1 field changed
      • changedOutput schema / properties / result / description
        Previous value: -"Object with status and data: up to 1000 active visitors, each with visitorId, country, countryCode, region, city, latitude, longitude, browser, os, deviceType, currentUrl, referrer, pageviews, totalRevenue, isCustomer, and name/email when identified."New value: +"Object with status and data: up to 1000 active visitors, each with visitorId, country, countryCode, region, city, latitude, longitude, browser, os, deviceType, currentUrl, referrer, and pageviews. Names, emails and per-visitor revenue are left out; use get_visitor for one specific visitor."
    • Changedget_visitor1 field changed
      • changedInput schema / properties / visitorId / description
        Previous value: -"Visitor ID, the _fs_vid cookie value set by the tracking script (also shown in the dashboard visitor view)"New value: +"Visitor record ID from get_realtime_map or the dashboard visitor view (not the _fs_vid cookie value)"
  6. 27 tool updates
    • Changeddelete_goals7 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end timestamp"New value: +"ISO 8601 end of the deletion window, inclusive (e.g. \"2026-01-31T23:59:59Z\"). May be used without startAt."
      • changedInput schema / properties / name / description
        Previous value: -"Delete goals matching this event name"New value: +"Delete completions of this goal name (as listed by get_goals)"
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start timestamp"New value: +"ISO 8601 start of the deletion window, inclusive (e.g. \"2026-01-01T00:00:00Z\"). May be used without endAt."
      • changedInput schema / properties / visitorId / description
        Previous value: -"Delete goals for this visitor"New value: +"Delete completions of this visitor (the id get_visitor takes). Combined with the other filters using AND."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Confirmation of the goal event deletion."New value: +"Object with status and data: deleted (number of completions removed) and a confirmation message."
    • Changeddelete_payments7 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end timestamp"New value: +"ISO 8601 end of the deletion window, inclusive (e.g. \"2026-01-31T23:59:59Z\"). May be used without startAt."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start timestamp"New value: +"ISO 8601 start of the deletion window, inclusive (e.g. \"2026-01-01T00:00:00Z\"). May be used without endAt."
      • changedInput schema / properties / transactionId / description
        Previous value: -"Delete the payment with this transaction ID"New value: +"Delete the single payment with this transaction ID. Combined with the other filters using AND."
      • changedInput schema / properties / visitorId / description
        Previous value: -"Delete all payments for this visitor"New value: +"Delete all payments of this visitor (the id get_visitor takes)"
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Confirmation of the payment record deletion."New value: +"Object with status and data: deleted (number of payment records removed) and a confirmation message."
    • Changedget_breakdown19 fields changed
      • changedInput schema / properties / dimension / description
        Previous value: -"Dimension to break down by: device, page, entry_page, exit_link, hostname, referrer, channel, campaign, goal, country, region, city, browser, browser_version, os, os_version, utm_source, utm_medium, utm_campaign, utm_term, utm_content, ref, source, all_params"New value: +"Dimension to group by. Without a dedicated tool: entry_page (landing page), exit_link (outbound click), browser_version, os_version, utm_source, utm_medium, utm_term, utm_content, ref, source, all_params (every tracking parameter at once). With one: device, page, hostname, referrer, channel, campaign (same as utm_campaign), goal, country, region, city, browser, os."
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Values of the requested dimension with visitor counts."New value: +"Object with status, data (rows of the requested dimension with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_browsers18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Browsers with visitor counts."New value: +"Object with status, data (browser rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_campaigns18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"UTM campaigns with visitor counts."New value: +"Object with status, data (utm_campaign rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_channels18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Marketing channels with visitor counts."New value: +"Object with status, data (channel rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_cities18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Cities with visitor counts."New value: +"Object with status, data (city rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_countries18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Countries with visitor counts."New value: +"Object with status, data (country rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_devices18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Device types (desktop, mobile, tablet) with visitor counts."New value: +"Object with status, data (up to three rows, desktop, mobile, tablet, with value, visitors, revenue, percentage), and pagination."
    • Changedget_goals18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Goals with completion stats for the selected date range."New value: +"Object with status, data (one entry per configured goal with its name and completion count for the window), and pagination."
    • Changedget_hostnames18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Hostnames with visitor counts."New value: +"Object with status, data (hostname rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_issue3 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"The issue with occurrences, affected sessions, steps to replicate, comments, and external ticket link if any."New value: +"Object with status and data: the issue with its occurrences, affected sessions, steps to replicate, comments, and external ticket link if any."
    • Changedget_metadata3 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Website configuration including domain, timezone, currency, KPI goal, and color scheme."New value: +"Object with status and data: one entry with domain, timezone, currency, kpi, kpiColorScheme, and logo. Without a selector on a workspace token, the website list instead."
    • Changedget_operating_systems18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Operating systems with visitor counts."New value: +"Object with status, data (operating system rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_overview18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Aggregated metrics such as visitors, sessions, bounce rate, average session duration, revenue, revenue per visitor, and conversion rate."New value: +"Object with status and data: a single row with visitors, sessions, bounce_rate, avg_session_duration, currency, revenue, revenue_per_visitor, and conversion_rate (a percentage) for the window."
    • Changedget_pages18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Pages ranked by visitor count for the selected range and filters."New value: +"Object with status, data (rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_realtime3 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Count of visitors active on the site within the last 5 minutes."New value: +"Object with status and data: data[0].visitors is the count of visitors active in the last 5 minutes."
    • Changedget_realtime_map3 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Currently active visitors with their geographic locations."New value: +"Object with status and data: up to 1000 active visitors, each with visitorId, country, countryCode, region, city, latitude, longitude, browser, os, deviceType, currentUrl, referrer, pageviews, totalRevenue, isCustomer, and name/email when identified."
    • Changedget_referrers18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Referrer domains with visitor counts for the selected range and filters."New value: +"Object with status, data (referrer domain rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_regions18 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Regions/states with visitor counts."New value: +"Object with status, data (region rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}."
    • Changedget_timeseries19 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / endAt / description
        Previous value: -"ISO 8601 end date (e.g. \"2026-01-31\")"New value: +"ISO 8601 end of the reporting window (e.g. \"2026-01-31\"). Defaults to now."
      • changedInput schema / properties / filter_browser / description
        Previous value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")"
      • changedInput schema / properties / filter_channel / description
        Previous value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")"
      • changedInput schema / properties / filter_city / description
        Previous value: -"Filter by city"New value: +"Filter by city name as returned by get_cities"
      • changedInput schema / properties / filter_country / description
        Previous value: -"Filter by country"New value: +"Filter by country name as returned by get_countries (e.g. \"United States\"). Every filter_* value accepts the same operators: \"v\" is, \"!v\" is not, \"~v\" contains, \"!~v\" does not contain, \"a|b\" any of. Filters combine with AND."
      • changedInput schema / properties / filter_goal / description
        Previous value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)"
      • changedInput schema / properties / filter_hostname / description
        Previous value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")"
      • changedInput schema / properties / filter_os / description
        Previous value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")"
      • changedInput schema / properties / filter_page / description
        Previous value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")"
      • changedInput schema / properties / filter_referrer / description
        Previous value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")"
      • changedInput schema / properties / filter_region / description
        Previous value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)"
      • changedInput schema / properties / interval / description
        Previous value: -"Aggregation interval: hour, day, week, month (default: day)"New value: +"Bucket size: hour, day, week, or month (default: day). Pick hour only for ranges of a few days."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response."
      • changedInput schema / properties / startAt / description
        Previous value: -"ISO 8601 start date (e.g. \"2026-01-01\")"New value: +"ISO 8601 start of the reporting window, date or datetime (e.g. \"2026-01-01\" or \"2026-01-01T00:00:00Z\"). Defaults to 30 days ago."
      • changedInput schema / properties / timezone / description
        Previous value: -"IANA timezone (e.g. \"America/New_York\"). Falls back to site default."New value: +"IANA timezone used to bound and bucket the window (e.g. \"America/New_York\"). Defaults to the website timezone from get_metadata."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Timestamped data points for the chosen interval with the requested metrics and totals."New value: +"Object with interval, timezone, currency, data (one point per bucket with timestamp, name, the requested metrics, and revenueBreakdown of new, renewal, refund), totals across the window, and pagination."
    • Changedget_visitor4 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / visitorId / description
        Previous value: -"Visitor ID (from _fs_vid cookie)"New value: +"Visitor ID, the _fs_vid cookie value set by the tracking script (also shown in the dashboard visitor view)"
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Visitor profile with identity, traffic source, activity, revenue, identified profile fields, and an activity timeline."New value: +"Object with status and data: visitorId, identity, source, sourceIconUrl, activity, revenue, profile (null when anonymous), and activityTimeline sorted newest first."
    • Changedlist_issues6 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results"New value: +"Max issues to return (1-1000, default 100)"
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset"New value: +"Issues to skip for pagination (default 0)"
      • changedInput schema / properties / status / description
        Previous value: -"Filter by status. Default excludes suspended issues"New value: +"Filter by status. Omit for open, in_progress, and resolved together; suspended issues only appear with status=suspended"
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Issues with severity, status, sessions affected, first/last seen, plus open/in-progress/resolved counts and pagination."New value: +"Object with status, data (issues with id, title, severity, status, sessionsAffected, firstSeenAt, lastSeenAt), counts {open, inProgress, resolved} for the whole site, and pagination {limit, offset, total}."
    • Changedlist_websites1 field changed
      • changedOutput schema / properties / result / description
        Previous value: -"List of websites the token can access, with identifiers and domains for use in other tools."New value: +"Object with status and data: one entry per website with id, domain, timezone, currency, kpi, logo, and trackingId. Use id as websiteId or domain as domain in other tools."
    • Changedtrack_goal5 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / name / description
        Previous value: -"Goal name — lowercase letters, numbers, underscores, hyphens only (max 64 chars). E.g. \"newsletter_signup\", \"add-to-cart\""New value: +"Goal name: lowercase letters, numbers, underscores, hyphens only (max 64 chars). E.g. \"newsletter_signup\", \"add-to-cart\""
      • changedInput schema / properties / visitorUid / description
        Previous value: -"Visitor UID from the _fs_vid browser cookie"New value: +"Visitor UID from the _fs_vid browser cookie of a visitor the tracking script has seen. Omit to record an anonymous completion."
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Confirmation of the recorded goal event."New value: +"Object with status and data: a confirmation message. The completion itself is written asynchronously and appears in get_goals shortly after."
    • Changedtrack_payment9 fields changed
      • changedInput schema / properties / amount / description
        Previous value: -"Payment amount (e.g. 29.99)"New value: +"Payment amount in major currency units (e.g. 29.99). With isRefund, the amount refunded. 0 records a free_trial goal instead of a payment goal."
      • changedInput schema / properties / customerId / description
        Previous value: -"Customer ID from payment provider"New value: +"Customer ID from the payment provider. Also used to find the visitor when visitorUid is absent."
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / isRefund / description
        Previous value: -"True for refunded payments"New value: +"True to record a refund. With an existing transactionId, marks that payment refunded by amount instead of creating a new record."
      • changedInput schema / properties / isRenewal / description
        Previous value: -"True for recurring/renewal payments"New value: +"True for recurring/renewal charges. Renewals are counted in revenue but do not record the automatic payment goal."
      • changedInput schema / properties / transactionId / description
        Previous value: -"Unique transaction ID from your payment provider"New value: +"Unique transaction ID from your payment provider. Must not repeat across payments; reuse it only with isRefund to mark that payment refunded."
      • changedInput schema / properties / visitorUid / description
        Previous value: -"Visitor UID from _fs_vid cookie — strongly recommended for accurate revenue attribution"New value: +"Visitor UID from the _fs_vid cookie. Strongly recommended: without it (or customerId/email matching a known visitor) the payment is attributed to Unknown"
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"Confirmation of the recorded payment."New value: +"Object with status and data: a confirmation message once the payment is stored."
    • Changedupdate_issue_status4 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Website domain to query. Required when using a workspace token unless websiteId is provided."New value: +"Website domain from list_websites (e.g. \"example.com\"). Alternative to websiteId with a workspace token."
      • changedInput schema / properties / status / description
        Previous value: -"New status"New value: +"New status. resolved asserts the bug is fixed; suspended hides a known non-problem from default listings; open and in_progress keep it visible"
      • changedInput schema / properties / websiteId / description
        Previous value: -"Website ID to query. Required when using a workspace token unless domain is provided."New value: +"Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key."
      • changedOutput schema / properties / result / description
        Previous value: -"The updated issue with its new status."New value: +"Object with status and data: the full issue detail after the change, with the new status."
  7. 27 tool updates
    • First observeddelete_goals
    • First observeddelete_payments
    • First observedget_breakdown
    • First observedget_browsers
    • First observedget_campaigns
    • First observedget_channels
    • First observedget_cities
    • First observedget_countries
    • First observedget_devices
    • First observedget_goals
    • First observedget_hostnames
    • First observedget_issue
    • First observedget_metadata
    • First observedget_operating_systems
    • First observedget_overview
    • First observedget_pages
    • First observedget_realtime
    • First observedget_realtime_map
    • First observedget_referrers
    • First observedget_regions
    • First observedget_timeseries
    • First observedget_visitor
    • First observedlist_issues
    • First observedlist_websites
    • First observedtrack_goal
    • First observedtrack_payment
    • First observedupdate_issue_status

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Privacy friendly, cookieless web analytics built MCP-first. "Add analytics to my Next.js app" → an AI agent runs the setup_analytics_for_site tool, picks the right install snippet, edits your layout file, and verifies the script is loading. OAuth onboarding, no API keys to paste.
    28
    34 npm
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    First-party web analytics MCP server for AI agents, providing 42 tools to query traffic, events, funnels, conversions, sources, and performance data.
    40
    27 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Real-time e-commerce analytics: visitors, Shopify/Stripe revenue attribution, funnels, and a live visitor feed. Agents can self-register a website with one no-auth POST and get a site-scoped read-only MCP token back.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources