flowsery
OfficialEnables automatic revenue and payment tracking from Stripe transactions for attribution in Flowsery analytics.
Flowsery Agent
Give your AI agent the ability to query web analytics — real-time visitors, traffic breakdowns, revenue, goals, and visitor profiles.
Privacy-first, cookie-free analytics. Alternative to Google Analytics.
Install
npx skills add flowsery/agentWorks with Claude Code, Cursor, Windsurf, Codex, and any agent that supports skills.
Other installation methods
Manual: Copy the skills/flowsery/ folder into your project's skills directory.
Cursor remote rules: Point to https://raw.githubusercontent.com/flowsery/agent/main/skills/flowsery/SKILL.md
Related MCP server: Gizmo Analytics
Setup
Create an account at flowsery.com
Add your website and install the tracking snippet
Create an API key at Site Settings > API
Run:
./scripts/flowsery.js setup --key flow_sk_live_xxxxx
What it does
Once installed, your AI agent can:
Overview — aggregated site metrics (visitors, sessions, bounce rate, revenue)
Time series — trend data by hour, day, week, or month
Realtime — current active visitor count and geographic map
Breakdowns — top pages, referrers, countries, devices, browsers, OS, campaigns, channels, and 20+ dimensions
Visitor profiles — full journey with identity, activity timeline, revenue, and identified user info
Goal tracking — track custom events with metadata
Revenue tracking — record payments for attribution (Stripe/LemonSqueezy/Polar auto-tracked)
Filters — drill down by country, device, browser, UTM params, page, channel, and more
Example
You: How's my traffic this week?
Agent: Your site had 2,847 visitors and 3,912 sessions this week.
Bounce rate is 62%. Revenue: $1,240 from 18 conversions.
Top sources: Google (41%), Direct (28%), Twitter (12%).Alternative: MCP
For deeper integration with Claude Desktop, Cursor, or other MCP-compatible clients, use the Flowsery MCP server:
{
"mcpServers": {
"flowsery": {
"type": "http",
"url": "https://mcp.flowsery.com/mcp",
"headers": {
"Authorization": "Bearer flow_sk_live_your_key"
}
}
}
}Run it locally
The server source lives in mcp-server/. Run it over stdio with Bun:
{
"mcpServers": {
"flowsery": {
"command": "bun",
"args": ["run", "/path/to/agent/mcp-server/src/index.ts"],
"env": { "FLOWSERY_API_KEY": "flow_sk_live_your_key" }
}
}
}Or with Docker:
docker build -t flowsery-mcp .
docker run -i -e FLOWSERY_API_KEY=flow_sk_live_your_key flowsery-mcpLinks
License
MIT
Available Tools
27 toolsdelete_goalsDelete Goal EventsADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Delete completions of this goal name (as listed by get_goals) | |
| endAt | No | ISO 8601 end of the deletion window, inclusive (e.g. "2026-01-31T23:59:59Z"). May be used without startAt. | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| startAt | No | ISO 8601 start of the deletion window, inclusive (e.g. "2026-01-01T00:00:00Z"). May be used without endAt. | |
| visitorId | No | Delete completions of this visitor (the id get_visitor takes). Combined with the other filters using AND. | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status and data: deleted (number of completions removed) and a confirmation message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses irreversibility ('Cannot be undone') and scoping of deletion ('Deletes completions only; the goal definition stays and get_goals still lists it'). This goes beyond the destructiveHint annotation by explaining the exact extent of the destructive action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries essential information—purpose, constraints, alternatives, side effects. No redundant or vague phrasing; well organized for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (destructive, multiple filters, alternative authentication), the description fully covers prerequisites, behavior, side effects, and output (number of rows deleted). No critical information missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Every parameter has a description that clarifies its purpose, examples for date formats, and relationships (e.g., websiteId/domain alternatives, visitorId combining with AND). The description adds practical context beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: 'Permanently delete recorded goal completions matching every filter given'. The resource (goal completions) is specific and distinguishes from sibling tools like delete_payments and get_goals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use alternatives: 'Use delete_payments for revenue records and update_issue_status for issues.' Also details required filter conditions and that startAt/endAt can be used independently, giving clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_paymentsDelete PaymentsADestructive
Permanently delete payment 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 reverse a charge while keeping history, use track_payment with isRefund instead. Requires websiteId or domain with a workspace token.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the deletion window, inclusive (e.g. "2026-01-31T23:59:59Z"). May be used without startAt. | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| startAt | No | ISO 8601 start of the deletion window, inclusive (e.g. "2026-01-01T00:00:00Z"). May be used without endAt. | |
| visitorId | No | Delete all payments of this visitor (the id get_visitor takes) | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| transactionId | No | Delete the single payment with this transaction ID. Combined with the other filters using AND. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status and data: deleted (number of payment records removed) and a confirmation message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It goes beyond the destructiveHint annotation by warning that deletion is permanent, cannot be undone, and removes revenue from reports and visitor profiles, advising explicit confirmation before proceeding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet comprehensive, using separate sentences for function, filters, requirements, output, warning, alternative, and authentication. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All relevant context is covered: purpose, filter semantics, return value, destructive consequences, alternative for reversal, and authentication details. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Each parameter has a detailed description in the schema, and the description adds clarity on how filters combine with AND and that startAt/endAt are independent. Schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool permanently deletes payment records matching filters, and explicitly contrasts it with track_payment for reversing charges. It also differentiates from delete_goals by specifying the payment domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies when to use (delete payments) and when not to (use track_payment with isRefund for reversal), lists required filter conditions, and notes authentication requirements with websiteId/domain.
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 DimensionARead-only
Group visitors by any one of 24 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, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| dimension | Yes | 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. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (rows of the requested dimension with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate read-only and non-destructive behavior; the description adds useful behavioral details such as default date range, ranking order, pagination semantics, and the meaning of returned rows. No contradictions exist between the description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but still well organized and front-loaded with the primary purpose. It efficiently conveys defaults, pagination, filtering, and sibling-tool differentiation without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description does not need to fully document return values, but it still mentions key response elements such as pagination.total and row fields. It also covers defaults and filtering enough for an agent to call the tool correctly in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter has a meaningful description. The dimension parameter's enum values are further clarified by explaining which are dedicated-tool dimensions and which are generic-only, and filter parameter descriptions include operator syntax and AND semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: grouping visitors by one of 24 dimensions, ranked by visitors descending, for a date range. It also distinguishes itself as the generic form of the named get_* breakdown tools, which is essential for choosing between this tool and its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool versus dedicated alternatives, listing dimensions that lack a dedicated tool and those that have one. It also mentions filter combination behavior and default date/limit behavior, giving clear practical guidance.
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 BrowserARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (browser rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only; description adds that rows include value, visitors, revenue, and percentage with pagination, plus default limit and date range. This makes behavior transparent without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense but efficient: main purpose, alternatives, response shape, defaults, and requirements are each addressed in one or two sentences. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (27 params, output schema), description provides sufficient context: how to select among sibling tools, response fields, pagination, default dates, filter application, and auth. Enough for an agent to call and interpret correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 27 parameters with descriptions; description adds only general statements like 'all filter_* arguments apply' and repeats authentication requirement already in the schema. No new parameter-specific semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact resource (visitors grouped by browser) and action (get), and distinguishes itself from get_breakdown, get_operating_systems, and get_devices by clarifying what this tool does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use this tool versus alternatives (browser names only, not versions, OS, or devices) and how to combine with filter_browser for other tools. Also notes authentication requirement and applicable filter_* arguments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignsGet Campaign PerformanceARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (utm_campaign rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavioral context beyond the readOnlyHint annotation: it explains authentication requirements (websiteId or domain with a workspace token), default values for limit, startAt, and timezone, and pagination behavior via offset and total. These details help an agent understand how the tool behaves without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-organized paragraph that packs all essential information—purpose, exclusions, output fields, defaults, and authentication—without unnecessary fluff. Each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description mentions output fields (value, visitors, revenue, percentage) and pagination.total, it does not provide a full output schema. However, given that this is a read-only reporting tool and the summary of rows is sufficient for an agent to understand the response, it remains largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter descriptions enrich the schema with concrete examples and operator explanations (e.g., filter_country's operator syntax). This goes beyond merely repeating the schema, providing practical usage details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: retrieving UTM campaigns ranked by visitors for a date range. It also distinguishes itself from sibling tools by explicitly naming alternatives like get_referrers, get_channels, and get_breakdown for other tracking dimensions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives: it notes that only visits with utm_campaign appear and suggests using get_referrers or get_channels for untagged traffic, and get_breakdown for other UTM parameters. This gives clear direction for an agent.
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 ChannelARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (channel rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavior: how channels are classified (from referrer domain and utm_medium/utm_source), default date range (last 30 days), limit default and max (100/1000), pagination via pagination.total, that all filter_* arguments apply, and authentication requirements (websiteId or domain with workspace token). This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence serves a purpose: purpose, classification logic, usage guidance, row content, defaults, and auth. It is front-loaded with the core function, then progressively adds necessary context. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 27 parameters, 0 required, and an output schema present, the description covers all critical aspects: what is returned (rows with value, visitors, revenue, percentage), pagination details, default limits, filter applicability, and authentication. The output schema handles return structure, so the description is complete for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is already described in the schema. The description adds context that all filter_* arguments apply and clarifies default date behavior (startAt/endAt default to 30 days). It also explains the websiteId/domain requirement. This adds value beyond the schema, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool groups visitors into GA4-aligned marketing channels, ranked by visitors, for a date range. It names specific channel examples and explicitly differentiates from sibling tools by stating what it is not (get_referrers, get_campaigns) and when to use them instead. The verb 'Get' and resource 'Traffic by Channel' are precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance: '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 tells the agent exactly when to use this tool and when to switch to alternatives, with clear routing logic.
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 CityARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (city rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description's burden is reduced. It adds useful context: rows carry value, visitors, revenue, percentage with pagination.total, default 30-day window, and that all filter_* arguments apply. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: the core purpose is front-loaded, followed by practical usage advice and alternatives. Every sentence contributes value—no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 27 parameters and an output schema present, the description covers all essential aspects: return format, pagination, date defaults, filter operators, and differentiation from siblings. An agent can call this tool correctly without needing additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds strategic guidance beyond the schema: it explains the filter operator syntax (e.g., 'v', '!v', '~v'), the need to pre-filter with country/region for meaningful results, and the limit range. This enriches parameter understanding beyond the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific verb and resource: 'Get visitors grouped by city, ranked by visitors descending, for a date range.' It also differentiates from sibling tools by explicitly naming get_countries and get_regions as coarser alternatives, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Finest geographic tool and the longest tail' and instructs to pass filter_country or filter_region first for meaningful results. It also advises raising the limit above 100 and names the coarser alternatives, leaving no ambiguity about selection criteria.
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 CountryARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (country rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds valuable behavior beyond that: return fields (value, visitors, revenue, percentage), pagination via pagination.total, default limit (100) and max (1000), default date range (30 days), and the requirement for websiteId or domain with a workspace token. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, sibling differentiation, return details, defaults, and auth requirement. It is front-loaded with the core purpose and scoping, making it efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 27 parameters, full schema coverage, and an output schema, the description covers all essential context: what it returns, how pagination works, default behaviors, auth needs, and how it relates to siblings. Nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds a general note that 'all filter_* arguments apply' and clarifies defaults for limit and dates, but it does not enrich individual parameter meaning beyond what the schema already provides. This is adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get visitors grouped by country, ranked by visitors descending, for a date range.' It immediately distinguishes from siblings by naming get_regions and get_cities as the finer-grained alternatives and get_realtime_map for current data, so an agent can select it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool versus alternatives: '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.' Also clarifies auth requirement and defaults.
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 DeviceARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (up to three rows, desktop, mobile, tablet, with value, visitors, revenue, percentage), and pagination. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and destructiveHint, but the description adds behavioral details not in annotations: 'Three rows at most, so pagination rarely matters' and 'Rows carry value, visitors, revenue, and percentage'. These clarify what the response will look like without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense paragraph that front-loads the purpose and then efficiently covers usage, behavior, and parameter notes. No redundant or filler sentences; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high parameter count and the presence of an output schema, the description provides all necessary context: date range defaults, pagination behavior, row content, filter semantics, and the relationship to sibling tools. No essential context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter already having a description. The tool description does not add additional semantic meaning beyond the schema descriptions; it only reinforces existing parameter details like websiteId/domain and filter_* operators. Thus baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get visitors split by device type', identifies the exact resource (device types), and explicitly contrasts with sibling tools (get_browsers, get_operating_systems) to disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('mobile-versus-desktop question') and when to use alternatives, and even directs passing filter_device to other tools for device-specific filtering. This leaves no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_goalsGet Goal CompletionsARead-only
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 when you need filters and pagination on the same list, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (one entry per configured goal with its name and completion count for the window), and pagination. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description reinforces the read-only intent by using 'Get' and 'compare conversions', and also notes that goals are created by track_goal, giving helpful lifecycle context. It does not contradict annotations and adds a small amount of behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph but packs in the core purpose, sibling-tool distinctions, default behavior, filtering semantics, pagination, and authentication requirements. While not broken into sections, it is efficient and every sentence contributes useful context. The length is justified given the tool's complexity and the number of parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's overall purpose, key usage constraints, and references pagination fields like pagination.total. With the provided schema covering all parameters and context indicating an output schema exists, the description is sufficiently complete. It could explicitly state the output shape (e.g., goal name and visitor count fields), but this is partially covered by the tool name and 'how many visitors completed it' phrasing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 27 parameters have descriptions, achieving 100% schema coverage. Many descriptions go beyond the parameter name by providing source endpoints (e.g., 'as returned by get_browsers'), concrete examples (e.g., 'Chrome', 'United States'), and default values. The shared filter-operator explanation is embedded in filter_country, which is slightly awkward but still informative. The descriptions clearly exceed the baseline for covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool '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', naming the specific resource and action. It also explicitly distinguishes the tool from get_overview, get_breakdown, and get_visitor, giving an agent unambiguous selection guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage guidance: when to use this tool ('Use this to compare conversions across goals'), when to use alternatives, the default date range, how filter_* parameters work, pagination via limit/offset, and the requirement for websiteId or domain with a workspace token. This leaves little ambiguity for invocation.
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 HostnameARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (hostname rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral details: response rows contain 'value, visitors, revenue, and percentage with pagination.total,' defaults for limit (100, max 1000) and dates (last 30 days), that 'all filter_* arguments apply,' and the authentication requirement (websiteId or domain with workspace token). This goes well beyond the annotations and helps the agent anticipate response structure and prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact paragraph that front-loads the core purpose and ranking, then quickly covers usage differentiation, response contents, defaults, and auth. Every sentence adds information; there is no fluff or repetition. It's appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 27 parameters, an output schema exists, and annotations are present, the description is remarkably complete. It covers the core function, when to use vs alternatives, response shape, pagination, defaults, filter applicability, and authentication requirements. An agent can confidently invoke this tool correctly based on the description alone, with the schema handling parameter-level details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds some value beyond the schema: it clarifies that all filter_* arguments apply (relevant given the large filter set), reiterates the auth context for websiteId/domain, and mentions defaults that are also in the schema. It doesn't introduce new parameter semantics not in the schema, but the 'all filter_* arguments apply' note is a useful consolidation. The extra context about authentication requirements and the response fields elevates it slightly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Get visitors grouped by hostname, ranked by visitors descending, for a date range.' It names the resource and the ranking, and explicitly contrasts with sibling get_pages ('Use get_pages for paths within a host'), making it easy to distinguish from other get_* tools without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Useful when one website tracks several domains or subdomains; a single-domain site returns one row.' It names the alternative tool (get_pages) and explains how to pass filter_hostname to other tools to scope by hostname, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issueGet Issue DetailARead-only
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, issues beyond the first 10 fail with 'Upgrade to view this issue'. Session detail names pages, referrers, and geography, so surface only what answers the question. Requires websiteId or domain with a workspace token.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| issueId | Yes | Issue ID from list_issues | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status and data: the issue with its occurrences, affected sessions, steps to replicate, comments, and external ticket link if any. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't repeat that. Instead it adds valuable behavioral details: exact error messages for unknown/trial cases, the fact that session detail includes pages/referrers/geography, and the note to surface only what answers the question. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While the description is moderately long, every sentence earns its place. It front-loads the core purpose, then packs in retrieval source, usage scope, failure modes, and auth requirements without fluff. The structure is logical and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists (so return format is covered), the description still adds essential context: error handling, trial limits, the auth token requirement, and a tip on filtering session details. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds useful context beyond the schema: where to get issueId, that websiteId/domain are alternatives, and that websiteId is ignored with a website key. This clarifies the auth model beyond the property descriptions, so a 4 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('one AI-detected issue'), and enumerates the exact details returned: occurrences, timestamps, sessions, steps, comments, and linked tickets. This clearly distinguishes it from list_issues (which lists issues) and update_issue_status (which mutates).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to obtain issueId from list_issues and limits usage to 'only when you need the evidence behind one issue'. Also gives failure conditions for unknown IDs, cross-website IDs, and free-trial limits, plus the authentication requirement for websiteId/domain. This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metadataGet Website SettingsARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reinforces the read-only nature and adds meaningful behavioral details beyond annotations, such as the fallback to returning the website list when no selector is given and the workspace-token versus website-key distinction. It does not cover error conditions or rate limits, but the core side-effect profile is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds distinct value: what is returned, read-only status, when to call it, how to pass parameters, and fallback behavior. It remains focused and free of fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and parameters are fully described, the explanation is complete for an agent to decide when and how to invoke this tool. It covers caller context, selector semantics, and relationship to sibling tools, leaving no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers both parameters with descriptions, and the tool description adds crucial semantics: websiteId is required with a workspace token unless domain is given, while it is ignored with a website key. This goes well beyond the schema and clarifies selector logic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves settings for one website, enumerates the specific fields (domain, timezone, currency, KPI goal name, logo, color scheme), and explicitly contrasts it with list_websites for discovery. This distinguishes it well from sibling report and management tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: call after list_websites to obtain timezone/currency before running date-range reports and pass that timezone to report tools. It also explains selector behavior for workspace tokens versus website keys and advises preferring list_websites when no selector is provided.
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 SystemARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (operating system rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and non-destructive annotations already cover safety, and the description adds useful behavioral details: grouping, sorting, response fields, pagination total, default limits, date defaults, and auth requirement. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: purpose first, then differentiation from siblings, filter guidance, output/format details, defaults, and auth. Each clause adds value, and the text remains readable despite covering many behavioral aspects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and annotations are present, the description is complete: it specifies what is returned, how results are ordered, default behavior, pagination, auth, and how it relates to 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds cross-cutting semantics that help interpret parameters: output rows include value/visitors/revenue/percentage, defaults for limit and dates, all filter_* arguments apply, and filter values should come from the relevant get_* tools. This goes beyond merely repeating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns visitors grouped by operating system, with explicit grouping, sorting, date range, and output fields. It distinguishes this tool from related sibling tools by specifying that get_browsers and get_devices handle browser/device splits and get_breakdown handles os_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool ('names only'), when to use alternatives ('use get_breakdown with dimension os_version', 'get_browsers', 'get_devices'), and how to filter across the suite ('Pass filter_os to other tools'). It also mentions auth requirements, defaults, and that all filter_* arguments apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_overviewGet Traffic OverviewARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| fields | No | Comma-separated metrics to include: visitors, sessions, bounce_rate, avg_session_duration, currency, revenue, revenue_per_visitor, conversion_rate. Omit for all. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value beyond that by disclosing defaults (date range, timezone), the AND-combination of filters, the 'single row' result shape, and the requirement for websiteId/domain with a workspace token. No contradiction with annotations; a small gap is that pagination behavior is only implied via schema, not described here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with purpose, then covers usage alternatives and a key example in two sentences. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 28 parameters and an output schema, the description covers the core purpose, defaults, filter semantics, alternatives, and auth requirement. It doesn't explicitly discuss pagination or response structure, but those are covered by the output schema and parameter descriptions. Overall, an agent has enough to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 28 parameters have individual descriptions in the schema. The description adds some interpretive value (filters narrow the whole result, default date/timezone) but largely reiterates what the schema already states. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get headline totals') and resource ('one website over a date range'), lists the exact metrics returned, and explicitly names alternatives (get_timeseries, get_* breakdown tools) to distinguish itself. An agent can immediately tell what it does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Use get_timeseries for the trend over time and a get_* breakdown tool for the split by page, source, or geography.' It also illustrates a filter combination example and notes the auth requirement, leaving no ambiguity about when to pick this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pagesGet Top PagesARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds substantial behavioral context: output fields (value, visitors, revenue, percentage), pagination.total, default limit (100, max 1000), default date range (last 30 days), and auth requirement (websiteId or domain with workspace token). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: purpose first, then alternatives, filter guidance, output/defaults, and auth. Each sentence adds value without redundancy, and it is front-loaded with the core purpose. It is appropriately concise given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 27-parameter complexity and presence of an output schema, the description covers purpose, usage alternatives, defaults, auth, and output fields. It mentions pagination.total for offset handling. Nothing critical for an agent to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 27 parameters are individually described. The description adds only general references to filter_* arguments and the websiteId/domain auth requirement, which is already in the schema. It does not materially enhance parameter understanding beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns page paths ranked by visitors in descending order for a date range, explicitly framing it as 'which pages get the most traffic.' It also names sibling tools (get_breakdown, get_hostnames) to distinguish scope, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs when to use alternatives: '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.' It also gives filter suggestions for source-specific traffic, leaving no ambiguity about selection criteria.
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 CountARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status and data: data[0].visitors is the count of visitors active in the last 5 minutes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds valuable behavioral context: it is point-in-time, takes no date/filter/pagination, returns data[0].visitors, and has a polling rate limit. These details go beyond the annotations and help the agent understand operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a model of efficiency: a single sentence stating the core purpose, a quick disambiguation of scope, explicit alternative routing, return format, a polling constraint, and an auth note. Every sentence earns its place, and the most important information (point-in-time nature) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 2 parameters and an output schema, the description covers all necessary operational details: what it does, what it does not do (no history/filters/pagination), when to use alternatives, the return shape, rate limiting, and authentication. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, so baseline is 3. The description adds meaningful context: it explains that domain and websiteId are alternatives, that websiteId is required with a workspace token unless domain is given, and that websiteId is ignored with a website key (though the schema already covers the latter). This clarification helps the agent choose correctly, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Count' and the resource 'visitors active on the site within the last 5 minutes', and immediately distinguishes it from siblings by noting it is point-in-time with no history. It names get_timeseries and get_realtime_map as alternatives, making the tool's unique purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use alternatives: 'Use get_timeseries with interval hour for recent trends and get_realtime_map when you need where those visitors are.' Also gives a polling limit ('Poll no more than once every 5 seconds') and states the authentication requirement ('Requires websiteId or domain with a workspace token'). This leaves no ambiguity about when or how to invoke the tool.
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 MapARead-only
Get the visitors active on the site in the last 5 minutes with their geographic location, for a live map view. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds critical behavioral context: real-time window (last 5 minutes), absence of filters/pagination, polling rate limit (5 seconds), and the requirement for a workspace token. This goes well beyond the annotations and helps the agent avoid misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences. The core purpose is front-loaded, followed by usage differentiation and constraints. Every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values are documented. The description covers scope, usage alternatives, operational constraints, and auth requirements. For a tool with only two optional parameters and a clear read-only profile, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage with descriptions for both parameters, so the baseline is 3. The description adds value by clarifying that these are the only parameters ('Takes only the website selector') and by restating the mutual exclusivity/requirements ('Requires websiteId or domain with a workspace token'), which is slightly redundant but reinforces the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Get') and a specific resource ('visitors active on the site in the last 5 minutes with their geographic location'), and explicitly distinguishes it from siblings like get_realtime and get_countries/get_cities, making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool versus alternatives ('Use get_realtime when only the count matters, and get_countries or get_cities for geography over a historical date range'), and provides operational constraints (no dates/filters/pagination, polling rate, auth requirements). This leaves no ambiguity about selection and invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_referrersGet Top ReferrersARead-only
Get referring domains ranked by visitors, descending: which external sites sent traffic in the date range. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (referrer domain rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. Description adds meaningful behavior beyond that: row contents ('value, visitors, revenue, and percentage'), pagination via 'pagination.total', default limit (100) and max (1000), default date window (last 30 days), and that all filter_* arguments apply. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (4 sentences), front-loaded with the main purpose, then alternatives, then behavior details. Each sentence serves a distinct function with no redundancy or filler. It fits within the typical length for a tool with this many parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 27 parameters and an output schema, the description covers all essential operational details: auth requirement, defaults (limit, date window), row content, pagination mechanism, and filter applicability. Since an output schema exists, return-value details are already structured, so the description fills the remaining gaps (auth, defaults, pagination) completely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the input schema. The description only notes that 'all filter_* arguments apply,' which is implied by the schema's filter_* parameters. It adds no extra parameter semantics beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: 'Get referring domains ranked by visitors, descending' and clarifies scope ('which external sites sent traffic in the date range'). It explicitly names sibling alternatives (get_channels, get_campaigns, get_breakdown) and the conditions that distinguish them, so an agent can select it correctly without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use vs when-not guidance: 'Use get_channels when you want traffic grouped into GA4-style channels... and get_campaigns or get_breakdown with dimension utm_source for traffic identified by UTM tags rather than referrer.' Also states the auth prerequisite ('Requires websiteId or domain with a workspace token').
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 RegionARead-only
Get visitors grouped by region or state (ISO 3166-2 code such as US-CA), 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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status, data (region rows with value, visitors, revenue, percentage, ordered by visitors descending), and pagination {limit, offset, total}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds value by disclosing behavioral traits beyond annotations: it mentions that rows carry value, visitors, revenue, and percentage with pagination.total, that limit defaults to 100 (max 1000), and that all filter_* arguments apply with dates defaulting to the last 30 days. This enriches the agent's understanding of the tool's output and behavior without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense yet efficient, with every sentence contributing meaning. It front-loads the core purpose, then moves to relational context, output characteristics, defaults, and authentication—all in a logical order. No redundant phrases or filler. The structure is ideal for an agent scanning quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (27 parameters, no required fields), the description is remarkably complete. It covers the output shape (rows with value, visitors, revenue, percentage, pagination.total), default behavior (limit 100, last 30 days), filtering semantics (all filter_* apply), and authentication requirements. An output schema exists, so return details are not needed, and the description adds what the schema does not, such as how to relate to sibling tools and the default pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 27 parameters, including their types and descriptions. The description adds minimal extra meaning beyond the schema—it mentions filter_region usage and that all filter_* arguments apply, but these are also present in the schema (e.g., filter_region is described as 'Filter by region code as returned by get_regions'). With full schema coverage, the baseline of 3 is appropriate, and the description does not significantly enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get visitors grouped by region or state (ISO 3166-2 code such as US-CA), ranked by visitors descending, for a date range.' It also explicitly distinguishes itself from siblings by noting it sits between get_countries (coarser) and get_cities (finer), and explains how it can be combined with filter_country and used to scope other tools via filter_region. This provides a precise, resource-specific purpose that an agent can immediately act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives: '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.' It also notes the authentication requirement (requires websiteId or domain with a workspace token) and defaults, making the decision process clear.
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 SeriesARead-only
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 a timestamp, the requested fields, and revenue split into new, renewal, and refund. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | No | ISO 8601 end of the reporting window (e.g. "2026-01-31"). Defaults to now. | |
| limit | No | Max rows to return (1-1000, default 100). | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| fields | No | Comma-separated metrics: visitors, sessions, revenue, conversion_rate, name | |
| offset | No | Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response. | |
| startAt | No | 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. | |
| interval | No | Bucket size: hour, day, week, or month (default: day). Pick hour only for ranges of a few days. | |
| timezone | No | IANA timezone used to bound and bucket the window (e.g. "America/New_York"). Defaults to the website timezone from get_metadata. | |
| filter_os | No | Filter by operating system name as returned by get_operating_systems (e.g. "iOS") | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| filter_ref | No | Filter by ref URL parameter | |
| filter_via | No | Filter by via URL parameter | |
| filter_city | No | Filter by city name as returned by get_cities | |
| filter_goal | No | Filter to visitors who completed this goal name (as returned by get_goals) | |
| filter_page | No | Filter by page path as returned by get_pages (e.g. "/pricing") | |
| filter_device | No | Filter by device type: desktop, mobile, tablet | |
| filter_region | No | Filter by region code as returned by get_regions (e.g. US-CA) | |
| filter_source | No | Filter by source URL parameter | |
| filter_browser | No | Filter by browser name as returned by get_browsers (e.g. "Chrome") | |
| filter_channel | No | Filter by marketing channel as returned by get_channels (e.g. "Organic Search") | |
| filter_country | No | 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. | |
| filter_hostname | No | Filter by hostname as returned by get_hostnames (e.g. "app.example.com") | |
| filter_referrer | No | Filter by referrer domain as returned by get_referrers (e.g. "google.com") | |
| filter_utm_term | No | Filter by UTM term | |
| filter_entry_page | No | Filter by entry/landing page | |
| filter_utm_medium | No | Filter by UTM medium | |
| filter_utm_source | No | Filter by UTM source | |
| filter_utm_content | No | Filter by UTM content | |
| filter_utm_campaign | No | Filter by UTM campaign |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the response shape (one point per bucket, timestamp, requested fields, revenue split) and the default 30-day/day interval behavior. However, since annotations already mark it read-only, the added behavior is moderate and does not cover details such as pagination mechanics despite the offset/limit parameters being documented in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences that front-load the core difference (bucketed metrics), then add usage guidance, defaults, and required-context notes. No unnecessary repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, its relationship to sibling tools, output shape, defaults, and a key practical warning (hourly buckets over long ranges returns too many points). It does not enumerate all 29 parameters, but the schema already fully documents them with 100% coverage, so this is complete enough for selection and basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description references some parameters (interval, timezone, startAt/endAt defaults, domain vs websiteId). Most parameter details are already in the schema, so the description only adds selective context — for example that 'hour' buckets are for short ranges and that timezone defaults to the website timezone — rather than full parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns the same metrics as get_overview but bucketed by time intervals, and explicitly differentiates from get_overview (one total) and get_* breakdown tools (dimension split).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tools explicitly and provides decision criteria: use get_timeseries for trends/charts, get_overview for a single total, and get_* breakdown for dimension splits. Also gives practical notes on interval-to-range matching and timezone 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 ProfileARead-only
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 comes from the _fs_vid cookie or the dashboard; an unknown id, or one from another website, fails with 'Visitor not found'. Requires websiteId or domain with a workspace token.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| visitorId | Yes | Visitor ID, the _fs_vid cookie value set by the tracking script (also shown in the dashboard visitor view) | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status and data: visitorId, identity, source, sourceIconUrl, activity, revenue, profile (null when anonymous), and activityTimeline sorted newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and non-destructive behavior; the description adds meaningful context about personal data handling, privacy minimization, and the error case for invalid IDs. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical but every sentence carries useful information: profile contents, privacy caveat, list limits, aggregate-tool guidance, visitorId origin, and parameter requirements. It remains structured and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides complete operational context: what the profile contains, personal-data sensitivity, list caps, null behavior for anonymous visitors, error behavior for unknown IDs, and parameter resolution rules. No important usage context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters with descriptions. The tool description adds helpful relationships and precedence rules, such as websiteId vs domain with workspace token and the ignored-with-website-key behavior, which goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the exact resource and action: retrieve one visitor's full profile. It distinguishes itself from the many aggregate get_* tools by emphasizing 'one visitor' and the singular profile scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use this tool versus alternatives: use it only for a specific visitor, and use aggregate get_* tools for many visitors. Also documents failure conditions such as unknown visitorId or cross-website access.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_issuesList Detected IssuesARead-only
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. Limit defaults to 100 (max 1000). Requires websiteId or domain with a workspace token.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Order by severity (default) or recency (last seen) | |
| limit | No | Max issues to return (1-1000, default 100) | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| offset | No | Issues to skip for pagination (default 0) | |
| search | No | Match against issue title and description | |
| status | No | Filter by status. Omit for open, in_progress, and resolved together; suspended issues only appear with status=suspended | |
| severity | No | Filter by severity | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | 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}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds substantial behavioral context beyond this, including pagination behavior, default limits, the hiding of suspended issues unless explicitly filtered, and authentication requirements. It does not explicitly state it is read-only, but the annotations cover that, and the added context exceeds the minimal bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive yet tightly organized, flowing from what the tool does, to what it returns, to usage guidance, to special cases and requirements. Every sentence conveys necessary information without redundancy, making it efficient and easy to scan for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It describes the output shape (rows with title, severity, status, sessions affected, first/last seen, plus aggregate counts and pagination.total) and explains when to use this tool vs. get_issue, covering the essential context an agent needs to invoke it correctly. The authentication requirement and suspended-issue behavior are also included, making it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of parameters with descriptions. The tool description supplements this by clarifying the relationship between websiteId and domain ('Requires websiteId or domain with a workspace token') and reiterating the limit default, adding meaning beyond what the schema alone provides for the critical authentication parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists issues found by AI analysis, enumerates the types (bugs, broken flows, UX problems), and distinguishes it from get_issue which retrieves details by ID. The intended resource (issue list) and action (list) are explicit, leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance on when to use this tool ('Start here for what is broken') and when to follow up with get_issue, while also noting the requirement for websiteId or domain with a workspace token. It explains the special handling of suspended issues and default limit behavior, giving clear direction on prerequisites and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_websitesList WebsitesARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and non-destructive. The description adds valuable context about token-scope behavior (workspace vs website key) and the error condition when neither websiteId nor domain is provided, going beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet comprehensive, with no wasted words. It is well-structured, presenting purpose, usage, and error behavior in a logical flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides all necessary context: what it lists, token scope implications, how it fits into the workflow, and the alternative tool. The error message is also specified, making the tool's behavior fully predictable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters and the schema is empty, so there is nothing to explain. The baseline of 3 applies as the description cannot add parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'List' and resource 'websites the current API token can read'. Also distinguishes from the sibling tool get_metadata, making it easy to select the right tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call this first with a workspace token, and states that other tools require websiteId or domain from this list. Also provides an alternative: use get_metadata when the website is already known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_goalTrack Goal EventA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Goal name: lowercase letters, numbers, underscores, hyphens only (max 64 chars). E.g. "newsletter_signup", "add-to-cart" | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| metadata | No | Up to 10 custom key-value pairs. Keys: lowercase, max 64 chars. Values: max 255 chars. | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| visitorUid | No | Visitor UID from the _fs_vid browser cookie of a visitor the tracking script has seen. Omit to record an anonymous completion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status and data: a confirmation message. The completion itself is written asynchronously and appears in get_goals shortly after. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-readonly, but the description adds critical behavior: the goal is created on first use, each call appends a completion (so repeats count twice), visitorUid attaches completions to sessions/source, and omitting it records anonymously. It also notes the undo path, going well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries essential information: purpose, naming, visitor handling, repetition semantics, alternatives, undo, and auth. It is front-loaded with the core action and logically organized, with no wasted words, though it is slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating goal-tracking tool with 5 params and an output schema, the description covers naming constraints, visitor attribution, idempotency (repeat behavior), alternatives, undo, and auth requirements. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% parameter descriptions with clear examples and constraints, so the description adds limited extra meaning. It does reinforce visitorUid's origin and omit-for-anonymous behavior, but this largely duplicates the schema. Baseline 3 applies because the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool records a completion of a custom goal, explains the goal is auto-created on first use, and distinguishes it from track_payment and delete_goals. This gives a specific verb, resource, and scope, making it unambiguous among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use track_payment for revenue instead, mentions undo via delete_goals, and clarifies the authentication requirement (websiteId or domain with a workspace token). It leaves no ambiguity about when to choose this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_paymentTrack PaymentA
Record a payment so 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 marks that payment refunded by amount 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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Customer name | |
| No | Customer email | ||
| amount | Yes | 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. | |
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| currency | Yes | Currency code (e.g. "USD", "EUR") | |
| isRefund | No | True to record a refund. With an existing transactionId, marks that payment refunded by amount instead of creating a new record. | |
| isRenewal | No | True for recurring/renewal charges. Renewals are counted in revenue but do not record the automatic payment goal. | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. | |
| customerId | No | Customer ID from the payment provider. Also used to find the visitor when visitorUid is absent. | |
| sessionUid | No | Session ID for the current visitor session | |
| visitorUid | No | Visitor UID from the _fs_vid cookie. Strongly recommended: without it (or customerId/email matching a known visitor) the payment is attributed to Unknown | |
| transactionId | Yes | Unique transaction ID from your payment provider. Must not repeat across payments; reuse it only with isRefund to mark that payment refunded. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status and data: a confirmation message once the payment is stored. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate it's not read-only and not destructive. The description goes far beyond: it discloses that repeated transactionId is rejected (not deduplicated), that a new payment records a goal completion, that isRenewal skips that, that isRefund marks a refund instead of adding a row, and how attribution works when no visitor matches. All these behaviors are critical for correct invocation and are not in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place. The description front-loads the core purpose, then covers exclusions and behavioral nuances in a logical flow. It is comprehensive but not redundant, and the structure guides the agent from general use to specific edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, side effects (goal recording, refunds), uniqueness constraints, and attribution logic, the description covers all essential aspects an agent needs to invoke correctly. It even notes the requirement for websiteId/domain with a workspace token. With an output schema present, it doesn't need to describe return values, and it doesn't.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning beyond field names: it explains that amount=0 records a free_trial goal, that amount with isRefund represents the refund amount, that transactionId must be unique, that isRefund requires an existing transactionId, that visitorUid is strongly recommended, and how customerId/email are used for attribution. This significantly enriches parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Record a payment'. It immediately states the effect (revenue appears in get_overview, get_timeseries, visitor profile) and explicitly contrasts with track_goal ('use track_goal for conversions without revenue') and with automatic provider tracking ('Skip it when the site's provider... is tracked automatically'). This clearly differentiates from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit conditions for use and non-use: when to skip (provider tracked automatically), when to use track_goal instead, and how to handle refunds via isRefund. It also specifies when a transactionId can be reused (only with isRefund). This is the highest level of guidance, 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.
update_issue_statusUpdate Issue StatusA
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'. Requires websiteId or domain with a workspace token.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Website domain from list_websites (e.g. "example.com"). Alternative to websiteId with a workspace token. | |
| status | Yes | New status. resolved asserts the bug is fixed; suspended hides a known non-problem from default listings; open and in_progress keep it visible | |
| issueId | Yes | Issue ID from list_issues | |
| websiteId | No | Website ID from list_websites. Required with a workspace token unless domain is given; ignored with a website key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | Object with status and data: the full issue detail after the change, with the new status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that only the status changes, that the operation is reversible ('any status can be set again later'), and that it is not a delete. It also reveals error behavior ('unknown id fails with 'Issue not found'') and authentication requirements ('Requires websiteId or domain with a workspace token'). These details go well beyond the annotations (which only indicate non-read-only and non-destructive) and provide critical context for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence adds essential information: the core action, the reversible nature, the status semantics, the exclusion from deletion, the source of issueId, error behavior, and authentication. It is front-loaded with the primary purpose and flows logically. No fluff or repetition, though it could be slightly tightened without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters (2 required) and an output schema, the description covers everything an agent needs: what it does, how to obtain issueId, what happens on failure, authentication requirements, reversibility, and semantic guidance for status choices. The presence of an output schema means the description doesn't need to explain return values. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes each parameter. The description adds value by explaining the semantic differences between status values (e.g., 'resolved asserts the bug is fixed; suspended hides a known non-problem') and clarifies the relationship between websiteId and domain ('Alternative to websiteId with a workspace token'). This contextualizes the parameters beyond their basic type and required-ness, though the schema already provides baseline descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb and resource: 'Set an issue's status' with an explicit enumeration of allowed values (open, in_progress, resolved, suspended). It also differentiates itself from siblings by stating 'Not a delete: issues cannot be removed through this server,' which distinguishes it from delete_goals and delete_payments. This makes the purpose unambiguous and distinguishes it from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool and how to select the right status: '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.' It also instructs to get issueId from list_issues and warns about unknown ids. The 'Not a delete' statement clarifies when NOT to use it. It covers both when and how to use the tool, and names the source for the required parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
27 tool updates
v0.1.1- Changed
delete_goals7 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / name / descriptionPrevious value: -"Delete goals matching this event name"New value: +"Delete completions of this goal name (as listed by get_goals)" - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / visitorId / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious value: -"Confirmation of the goal event deletion."New value: +"Object with status and data: deleted (number of completions removed) and a confirmation message."
- Changed
delete_payments7 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / transactionId / descriptionPrevious 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." - changed
Input schema / properties / visitorId / descriptionPrevious value: -"Delete all payments for this visitor"New value: +"Delete all payments of this visitor (the id get_visitor takes)" - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious value: -"Confirmation of the payment record deletion."New value: +"Object with status and data: deleted (number of payment records removed) and a confirmation message."
- Changed
get_breakdown19 fields changed- changed
Input schema / properties / dimension / descriptionPrevious 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." - changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_browsers18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_campaigns18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_channels18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_cities18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_countries18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_devices18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
get_goals18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
get_hostnames18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_issue3 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
get_metadata3 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
get_operating_systems18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_overview18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
get_pages18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_realtime3 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
get_realtime_map3 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
get_referrers18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_regions18 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
get_timeseries19 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / endAt / descriptionPrevious 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." - changed
Input schema / properties / filter_browser / descriptionPrevious value: -"Filter by browser name"New value: +"Filter by browser name as returned by get_browsers (e.g. \"Chrome\")" - changed
Input schema / properties / filter_channel / descriptionPrevious value: -"Filter by marketing channel"New value: +"Filter by marketing channel as returned by get_channels (e.g. \"Organic Search\")" - changed
Input schema / properties / filter_city / descriptionPrevious value: -"Filter by city"New value: +"Filter by city name as returned by get_cities" - changed
Input schema / properties / filter_country / descriptionPrevious 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." - changed
Input schema / properties / filter_goal / descriptionPrevious value: -"Filter by goal name"New value: +"Filter to visitors who completed this goal name (as returned by get_goals)" - changed
Input schema / properties / filter_hostname / descriptionPrevious value: -"Filter by hostname"New value: +"Filter by hostname as returned by get_hostnames (e.g. \"app.example.com\")" - changed
Input schema / properties / filter_os / descriptionPrevious value: -"Filter by operating system"New value: +"Filter by operating system name as returned by get_operating_systems (e.g. \"iOS\")" - changed
Input schema / properties / filter_page / descriptionPrevious value: -"Filter by page path"New value: +"Filter by page path as returned by get_pages (e.g. \"/pricing\")" - changed
Input schema / properties / filter_referrer / descriptionPrevious value: -"Filter by referrer domain"New value: +"Filter by referrer domain as returned by get_referrers (e.g. \"google.com\")" - changed
Input schema / properties / filter_region / descriptionPrevious value: -"Filter by region"New value: +"Filter by region code as returned by get_regions (e.g. US-CA)" - changed
Input schema / properties / interval / descriptionPrevious 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." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-1000, default: 100)"New value: +"Max rows to return (1-1000, default 100)." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset (default: 0)"New value: +"Rows to skip for pagination (default 0). Compare offset + limit against pagination.total in the response." - changed
Input schema / properties / startAt / descriptionPrevious 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." - changed
Input schema / properties / timezone / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
get_visitor4 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / visitorId / descriptionPrevious 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)" - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
list_issues6 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results"New value: +"Max issues to return (1-1000, default 100)" - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset"New value: +"Issues to skip for pagination (default 0)" - changed
Input schema / properties / status / descriptionPrevious 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" - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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}."
- Changed
list_websites1 field changed- changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
track_goal5 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / name / descriptionPrevious 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\"" - changed
Input schema / properties / visitorUid / descriptionPrevious 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." - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
- Changed
track_payment9 fields changed- changed
Input schema / properties / amount / descriptionPrevious 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." - changed
Input schema / properties / customerId / descriptionPrevious value: -"Customer ID from payment provider"New value: +"Customer ID from the payment provider. Also used to find the visitor when visitorUid is absent." - changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / isRefund / descriptionPrevious 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." - changed
Input schema / properties / isRenewal / descriptionPrevious 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." - changed
Input schema / properties / transactionId / descriptionPrevious 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." - changed
Input schema / properties / visitorUid / descriptionPrevious 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" - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious value: -"Confirmation of the recorded payment."New value: +"Object with status and data: a confirmation message once the payment is stored."
- Changed
update_issue_status4 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / status / descriptionPrevious 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" - changed
Input schema / properties / websiteId / descriptionPrevious 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." - changed
Output schema / properties / result / descriptionPrevious 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."
27 tool updates
v0.1.0- First observed
delete_goals - First observed
delete_payments - First observed
get_breakdown - First observed
get_browsers - First observed
get_campaigns - First observed
get_channels - First observed
get_cities - First observed
get_countries - First observed
get_devices - First observed
get_goals - First observed
get_hostnames - First observed
get_issue - First observed
get_metadata - First observed
get_operating_systems - First observed
get_overview - First observed
get_pages - First observed
get_realtime - First observed
get_realtime_map - First observed
get_referrers - First observed
get_regions - First observed
get_timeseries - First observed
get_visitor - First observed
list_issues - First observed
list_websites - First observed
track_goal - First observed
track_payment - First observed
update_issue_status
TDQS
Scored across 27 tools
Each tool has a clearly distinct purpose, from device breakdowns to geographic splits, campaigns, goals, issues, and payments. The generic get_breakdown explicitly notes which dimensions have dedicated tools, preventing confusion.
Most reads use get_* and mutations use track_*/delete_*/update_*, with list_websites and list_issues as consistent list variants. The get_realtime_map vs get_realtime pairing is slightly irregular but still follows the get_ prefix convention.
27 tools is substantial but appropriate for a full-featured analytics, goal, payment, and issue management server. The count reflects the breadth of functionality without being bloated or redundant.
The surface covers read, breakdown, filter, search, goal tracking, payment recording, and issue management. It includes both aggregate and individual visitor views, and both create and delete operations for goals and payments, making it a complete domain coverage.
Maintenance
Related MCP Connectors
Privacy-first web analytics for AI agents: visitors, revenue, funnels, visitor profiles.
Real-time web analytics for AI agents: query traffic, funnels, revenue, and manage your sites.
Analytics your AI agent can actually use. Track, experiment, and optimize via MCP.
Track agent ROI and enrich companies via MCP. Remote, OAuth 2.1, no install or keys.
Related MCP Servers
- AlicenseCqualityDmaintenanceFull-coverage MCP server for Umami Analytics API v2 — 66 tools for website analytics, stats, events, and team management66116 npm8MIT
- AlicenseAqualityDmaintenancePrivacy 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.2824 npm1MIT
- AlicenseAqualityCmaintenanceEnables AI agents to access website analytics, including visitor sessions, UX friction, conversion funnels, and anomaly alerts.665 PyPIMIT
- AlicenseAqualityAmaintenanceMCP server for Plausible Analytics that enables querying traffic, conversions, and comparing time periods from any AI tool supporting MCP.426 npm40MIT