rybbit-mcp
The rybbit-mcp server provides 32 tools to query and manage a Rybbit Analytics instance directly from MCP-compatible AI clients, covering real-time visitors, site management, user behavior, events, errors, performance, funnels, goals, and journeys.
Site Management: List/create/delete/update sites, look up site IDs by domain, update tracking config (IP tracking, session replay, error tracking, bot blocking, excluded IPs/countries, etc.), and verify SDK integration.
Real-Time & Overview: Get live active user counts, aggregated metrics (sessions, pageviews, unique users, bounce rate, session duration), time-series trends with configurable bucket granularity, and geographic session data for map visualization.
Metrics & Dimensions: Break down metrics by browser, OS, country, city, page, UTM parameters, referrer, device type, channel, entry/exit pages, app version, and more. Also supports page title analysis and user retention cohorts.
Sessions: List sessions with filters (IP, identified users, min duration, dimension), get full session details including page views, events, user traits, device info, and event timeline.
Users: List users with search/sort/filters, view detailed profiles (traits, session history, activity summary), query user trait keys/values, find users by trait, get per-user event breakdowns, and per-day session counts.
Events: List raw events, discover custom event names and counts, get property breakdowns for specific events, view event count trends as time series, and track outbound link clicks.
Error Tracking: Get error type summaries, individual error instances with stack traces, and error trends over time.
Performance (Web Vitals): Get Core Web Vitals (LCP, CLS, INP, FCP, TTFB) with p50/p75/p90/p99 percentiles, broken down by page, browser, or OS, with time-series trend support.
Funnels: List saved funnels, analyze ad-hoc funnels with custom steps (conversion rates & drop-off), get sessions that reached or dropped off at specific steps, and create/delete funnels.
Goals: List, create, update, and delete goals (path-based or event-based with property filters); get sessions that completed a specific goal.
User Journeys: Analyze common page navigation sequences across sessions with configurable step depth (2–10 steps).
Filtering & Time Ranges: Filter by 22+ dimensions with 8 comparison types. Use absolute dates (YYYY-MM-DD) or relative time (pastMinutesStart), with IANA timezone support. Built-in pagination for large datasets.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@rybbit-mcpShow me the top pages by bounce rate this week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@nks-hub/rybbit-mcp
MCP server for Rybbit Analytics. Claude Code and other MCP clients use it to query statistics, errors, users, sessions, funnels, goals and performance metrics.
Features
🧰 32 analytics tools - Overview, metrics, sessions, users, events, errors, performance, funnels, goals, journeys and site management
🔐 Authentication - API key (recommended) or email and password
🔍 Filtering - Filter by 22 dimensions (browser, country, UTM, page, device, etc.) with 8 comparison types
📅 Time ranges - Date ranges (
YYYY-MM-DD) or relative time (pastMinutesStart)📈 Time series - Bucket size from one minute to one year
📄 Pagination -
pageandlimitparameters for large result sets✂️ Response truncation - Cuts responses at 25k characters so they fit the model context
💡 Error messages - Tell the model what to try next, e.g. narrow the date range or call
rybbit_list_sitesfor valid IDs
Related MCP server: agentops-mcp
Requirements
Node.js: 18+
Rybbit Analytics: Self-hosted or cloud instance
Installation
npx (recommended)
Configure your MCP client to run the package via npx:
{
"mcpServers": {
"rybbit": {
"command": "npx",
"args": ["-y", "@nks-hub/rybbit-mcp"],
"env": {
"RYBBIT_URL": "https://your-rybbit-instance.com",
"RYBBIT_API_KEY": "your-api-key"
}
}
}
}Add this to your ~/.claude/settings.json or project .claude/settings.json.
CLI shorthand:
claude mcp add rybbit -e RYBBIT_URL=https://your-instance.com -e RYBBIT_API_KEY=your-key -- npx -y @nks-hub/rybbit-mcpFrom source
For development or contributing:
git clone https://github.com/nks-hub/rybbit-mcp.git
cd rybbit-mcp
npm install && npm run buildThen point your MCP config to the local build:
{
"mcpServers": {
"rybbit": {
"command": "node",
"args": ["path/to/rybbit-mcp/build/index.js"],
"env": {
"RYBBIT_URL": "https://your-rybbit-instance.com",
"RYBBIT_API_KEY": "your-api-key"
}
}
}
}Usage
Once the server is configured, Claude Code can answer questions such as:
"How many users visited the site today?"
"Show me the top pages by bounce rate this week"
"What errors occurred in the last hour?"
"Show user journey from homepage to checkout"
"Compare browser usage between mobile and desktop"
Authentication
Method | Environment Variables | Use Case |
API key |
| Recommended for production |
Email/password |
| Development/testing |
Both require RYBBIT_URL pointing to your Rybbit instance.
Tools (32)
Configuration and site management
Tool | Description |
| Get server version and configuration |
| List all sites and organizations |
| Create a new site (type: |
| Delete a site permanently |
| Look up site ID by domain name |
| Update site tracking config (IP, errors, replay, etc.) |
Real-time and overview
Tool | Description |
| Current active users count |
| Aggregated metrics (sessions, pageviews, users, bounce rate, duration) |
| Metrics as time-series with configurable buckets |
| Geographic session data with coordinates for map visualization |
Metrics and dimensions
Tool | Description |
| Breakdown by dimension (browser, OS, country, page, UTM, etc.) |
| User retention cohort analysis |
Sessions
Tool | Description |
| Session list with filtering by IP, identified users, min duration, and pagination |
| Full session detail with events and user traits |
Users
Tool | Description |
| Users with search, sort (first/last seen, pageviews, sessions, duration), and identified-only filter |
| User detail with traits and activity |
| Trait keys, values, or find users by trait |
| Per-user event count breakdown |
Events
Tool | Description |
| Raw event records with filtering |
| Custom event names and counts |
| Property breakdowns per event |
| Event count trends over time with configurable buckets |
| Outbound link clicks with URLs and counts |
Errors
Tool | Description |
| Error types/counts, individual instances, or timeseries for a specific error |
Performance (Web Vitals)
Tool | Description |
| Core Web Vitals (LCP, CLS, INP, FCP, TTFB) with percentiles |
| Web Vitals trends over time |
Funnels and goals
Tool | Description |
| Saved funnels with step definitions |
| Ad-hoc funnel analysis with custom steps |
| Sessions that reached or dropped off at a funnel step |
| Goals with conversion metrics |
| Sessions that completed a specific goal |
Journeys
Tool | Description |
| User navigation path analysis |
Common parameters
All analytics tools support these optional parameters:
Parameter | Type | Description |
| string | Site identifier (required) |
| string | Start date |
| string | End date |
| string | IANA timezone (e.g., |
| array | Filter array |
| number | Minutes ago (alternative to date range) |
Filter parameters
browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id
Filter types
equals, not_equals, contains, not_contains, regex, not_regex, greater_than, less_than
Time buckets
minute, five_minutes, ten_minutes, fifteen_minutes, hour, day, week, month, year
Related projects
@nks-hub/rybbit-ts: TypeScript tracking SDK
rybbit-flutter-sdk: Flutter/Dart tracking SDK
Development
# Install dependencies
npm install
# Build
npm run build
# Watch mode
npm run dev
# Type checking
npx tsc --noEmitContributing
Contributions are welcome! For major changes, please open an issue first.
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'feat: description')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
Support
📧 Email: dev@nks-hub.cz
🐛 Bug reports: GitHub Issues
📖 MCP Protocol: modelcontextprotocol.io
License
MIT License — see LICENSE for details.
Available Tools
43 toolsrybbit_analyze_funnelAnalyze FunnelBRead-onlyIdempotent
Analyze a custom funnel by defining steps (page visits or events). Returns visitor counts and drop-off rates at each step.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | Funnel steps to analyze (minimum 2) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date (YYYY-MM-DD) | |
| filters | No | Filters to apply | |
| timeZone | No | IANA timezone (default UTC) | |
| startDate | No | Start date (YYYY-MM-DD) | |
| pastMinutesEnd | No | Minutes ago end | |
| pastMinutesStart | No | Minutes ago start |
Output Schema
| Name | Required | Description |
|---|---|---|
| steps | No | Per-step counts and dropoffs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered. The description adds only the return shape (counts and drop-off rates), which the output schema already documents, so it contributes marginal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core action and its output are front-loaded and nothing is wasted.
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 explaining returns and annotations covering the safety profile, the description need not restate those. It is nearly complete; the only gap is the absence of usage guidance relative to sibling funnel tools.
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 parameters (steps, filters, dates, timezone) are already fully documented in the schema. The description mentions 'steps (page visits or events)' but adds no syntax or format detail beyond what the schema already states.
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 gives a specific verb ('Analyze') and resource ('custom funnel') and clarifies the tool defines steps inline (page visits or events) and returns per-step visitor counts and drop-off rates. This clearly separates it from create/delete/list funnel siblings even though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the tool is for an ad-hoc, inline-defined funnel rather than a stored one, but never states when to use it versus list_funnels or get_funnel_step_sessions, nor any prerequisites (e.g., a site must have data). No when-to-use or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_create_funnelCreate FunnelA
Save a new named funnel definition. Steps are evaluated in order. Pass an existing funnel report ID to overwrite that funnel instead of creating a new one.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Funnel display name | |
| steps | Yes | Funnel steps in order (minimum 2) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| reportId | No | Optional existing funnel report ID to overwrite (instead of creating a new one) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| steps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring a non-read-only, non-destructive, non-idempotent write, the description adds real behavioral context: steps are evaluated in order and supplying reportId silently overwrites an existing funnel rather than creating one. That overwrite disclosure is important behaviour an agent would not infer from the annotations alone. It stops short of 5 because it says nothing about validation failures or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and then the two behavioural caveats. 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?
An output schema exists, so return values need not be explained, and the annotations cover the safety profile. The description supplies the essential create-vs-overwrite and step-ordering context, leaving only minor gaps such as error behaviour.
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 name, steps, siteId and reportId. The description re-states the reportId overwrite and step ordering, adding little beyond the structured fields; 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?
States a specific verb and resource ('Save a new named funnel definition') and adds the evaluate-in-order and overwrite semantics, so an agent can distinguish it from rybbit_analyze_funnel or rybbit_create_goal. It does not explicitly name a sibling alternative, which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies two modes of use by describing the reportId branch ('overwrite that funnel instead of creating a new one'), giving useful conditional guidance. However, there is no explicit when-to-use/ when-not statement and no reference to sibling tools such as analyze_funnel or update paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_create_goalCreate GoalB
Create a new conversion goal for a site. Goal can be path-based (URL match) or event-based (custom event triggered).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional display name for the goal | |
| config | Yes | Goal configuration. Use pathPattern for path goals or eventName for event goals. | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| goalType | Yes | 'path' = URL pattern, 'event' = custom event |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| message | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a non-readOnly, non-idempotent, non-destructive, non-openWorld write operation, which is accurate. The description adds the meaningful distinction between path and event goals, but says nothing about auth requirements, whether goals can be duplicated, or what happens on conflict. It doesn't 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?
Two short sentences, front-loaded with the core action and resource, then the key branching distinction. No waste.
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 a nested config object, enum goalType, 100% schema coverage, and an output schema, the description covers the essential branching. However, for a create/mutation tool it omits when to use it vs siblings and any prerequisite or conflict behavior. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters (including the nested config object with its own descriptions and enum) are fully documented in the schema. The description mentions path vs event which maps to goalType, but adds no syntax or format details beyond what the schema already provides. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Create) and resource (conversion goal for a site), and distinguishes the two goal variants (path-based vs event-based). It doesn't explicitly differentiate from sibling tools like create_funnel or update_goal, but the resource is specific enough.
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?
No guidance on when to use this versus update_goal, create_funnel, or list_goals. The description mentions two goal types but doesn't explain when each is appropriate beyond a one-line parenthetical. No prerequisites (e.g., site must exist) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_create_siteCreate SiteA
Create a new site in Rybbit. Use type 'web' for websites (domain like 'example.com') or type 'mobile' for mobile apps (package name like 'com.example.app'). 'app' is accepted as a legacy alias for 'mobile'. Returns the created site with its siteId for tracking integration.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name for the site (defaults to domain) | |
| type | No | Site type: 'web' for websites (default), 'mobile' for mobile apps. 'app' is a legacy alias mapped to 'mobile'. | |
| domain | Yes | Domain of the site (e.g. 'example.com') or package name for mobile apps (e.g. 'com.example.app') | |
| organizationId | Yes | Organization ID to add the site to. Use rybbit_list_sites to find organization IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| domain | No | |
| siteId | No | |
| message | No | |
| organizationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the mutation profile is known. The description adds a return-value note, but with an output schema present that is largely redundant, and it omits what an agent would want to know about duplicate domains or failure behavior for a non-idempotent create.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the type semantics, then the return value. No filler and nothing misplaced.
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 annotations, a full-coverage schema and an output schema, the description covers everything the agent needs to invoke the tool correctly. Minor gaps remain around organizational prerequisites and duplicate-handling behavior for a non-idempotent create.
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%, including enum semantics for 'type' and the organizationId lookup hint, so the schema already carries parameter meaning. The description restates the web/mobile/app type mapping rather than adding anything new, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new site in Rybbit') and immediately clarifies the resource's two variants. The operation is inherently distinct from siblings like delete_site, update_site_config and list_sites, but the description never explicitly differentiates itself from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful guidance on how to choose the 'type' value (web for domains, mobile for package names), which is real usage help, but says nothing about when to create a site versus reusing an existing one or which organizational prerequisites apply. Usage is largely implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_delete_funnelDelete FunnelBDestructiveIdempotent
Permanently delete a saved funnel. This action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| funnelId | Yes | Funnel ID to delete (from rybbit_list_funnels) |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=true, so the safety profile is covered structurally. The description adds the meaningful detail that deletion is permanent and irreversible, but says nothing about permissions, cascading effects, or error behavior on a missing ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the destructive consequence front-loaded. Nothing is wasted and no reading is required past the first clause.
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?
An output schema exists so return values need not be described, and annotations carry the destructive/idempotent profile. However, for an irreversible mutation the description omits any note on required permissions or what happens if the funnel ID is invalid, leaving it minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both siteId and funnelId are documented in the schema, including a pointer to rybbit_list_funnels for obtaining the ID. The description adds no parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (delete) and resource (saved funnel) and states the effect is permanent. It is clearly distinguishable from siblings such as rybbit_delete_goal and rybbit_delete_site by resource, though it never explicitly contrasts them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives such as archive/update, and no preconditions (permissions, confirmation) are stated. The only usage cue is the implied irreversibility of 'cannot be undone'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_delete_goalDelete GoalBDestructiveIdempotent
Permanently delete a goal. This action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| goalId | Yes | Numeric goal ID to delete | |
| siteId | Yes | Site ID (numeric ID or domain identifier) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| message | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is carried structurally. The description reinforces this with 'Permanently delete' and 'cannot be undone', but adds nothing about authorization requirements, behavior on a nonexistent goalId, or cascading effects on related goal/session records.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the destructive warning front-loaded in the first clause. Nothing is padded and nothing competes for attention.
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 two-parameter destructive tool with rich annotations and an output schema, the description is adequate but thin: it omits error behavior for an invalid or already-deleted goalId and any scoping/permission context. It is minimum viable rather than 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 both parameters (goalId, siteId) carry their own descriptions, so the schema does the heavy lifting. The description mentions neither parameter and adds no format or constraint detail beyond the schema; 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 gives a specific verb and resource ('delete a goal'), which cleanly separates it from sibling mutators like rybbit_delete_site and rybbit_delete_funnel. It does not, however, explicitly contrast itself with those siblings or with rybbit_update_goal; it relies on the tool name for differentiation.
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?
There is a warning that the action is permanent, but no guidance on when to choose this over alternatives (e.g. rybbit_update_goal to modify rather than remove), no prerequisites, and no note about what happens to associated goal session data. The agent gets a warning but no routing logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_delete_siteDelete SiteADestructive
Delete a site from Rybbit. This permanently removes the site and its replay data. Use rybbit_list_sites or rybbit_get_site_id to find site IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is covered. The description adds genuinely non-redundant context beyond that: the deletion is permanent and cascades to replay data, telling the agent exactly what is destroyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and impact, with the ID-lookup pointer last. 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 destructive single-parameter tool with an output schema and full annotation coverage, the description supplies the one thing the structured fields do not: the permanence and data-loss scope. Only auth/confirmation requirements are left unstated.
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 single siteId parameter (numeric ID or domain identifier) is already fully documented. The description only points to sibling tools for finding the ID, which is useful routing but adds no format or constraint detail beyond the schema; 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?
"Delete a site from Rybbit" is a specific verb + resource, and the follow-up sentence sharpens the scope by naming what is removed (the site and its replay data). It is trivially distinguishable from sibling mutators like rybbit_delete_goal or rybbit_delete_funnel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear prerequisite/context: use rybbit_list_sites or rybbit_get_site_id to obtain the site ID before calling. There is no explicit when-not-to-use guidance or named alternative deletion path, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_describe_dimensionDescribe Filter DimensionARead-onlyIdempotent
Look up which tools accept a given filter dimension (e.g. 'event_name', 'pathname', 'country'), where it works natively, where it is silently stripped due to upstream bugs (with alternative tool suggestions), and example values. Use this before constructing a complex filters[] array.
| Name | Required | Description | Default |
|---|---|---|---|
| parameter | Yes | Dimension name to describe (e.g. 'event_name', 'user_id', 'pathname'). Case-sensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| examples | Yes | |
| parameter | Yes | |
| valueHint | Yes | |
| strippedIn | Yes | Tools that silently strip this filter due to upstream bugs. Use alternatives noted in reason. |
| description | Yes | |
| supportedIn | Yes | |
| knownDimensions | No | Returned only when parameter is unknown — lists all documented dimensions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely valuable behavioral context beyond that: it discloses that some dimensions are 'silently stripped due to upstream bugs' and that alternative tool suggestions are provided. It omits return format, but that is carried by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, and the payload of what is returned is front-loaded before the timing advice. Every clause 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?
An output schema exists so return values need no explanation, and the description still summarizes the returned content (native support, stripped dimensions with alternatives, example values). Nothing an agent needs in order 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?
With a single parameter at 100% schema description coverage, the schema already documents the dimension name, case-sensitivity, and examples. The description's examples ('event_name', 'pathname', 'country') largely restate the schema, adding marginal value, so the 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?
States a specific verb and resource ('look up which tools accept a given filter dimension') and enumerates the three things it returns: native support, silent stripping plus alternatives, and example values. No sibling tool performs this lookup, so it is unambiguous in context.
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 'Use this before constructing a complex filters[] array,' giving a clear trigger condition. It does not name exclusions or a fallback for simple, non-array filters, but the positive guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_configGet Rybbit ConfigARead-onlyIdempotent
Get Rybbit server version and configuration
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| version | No | Rybbit server version string |
| mapboxToken | No | Mapbox token (if configured) |
| disableSignup | No | Whether public signup is disabled |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered. The description adds nothing beyond that (no scope, no auth requirements, no caching notes), but the bar is low given complete annotations and an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; every word earns its place for a no-argument tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return shape need not be described, and annotations cover the safety semantics. For a zero-parameter read tool the description is sufficient, though one line on what 'configuration' entails would make it airtight.
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 takes zero parameters, so the baseline is 4. There is nothing for the description to document beyond the fact that the call is parameterless.
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 (Rybbit server version and configuration), which is clear and distinguishable from the analytics siblings like rybbit_get_overview. It does not explicitly differentiate itself from the similarly named rybbit_update_site_config, but the read vs. update verbs make the split inferable.
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?
No explicit when-to-use or when-not-to-use guidance, but usage is strongly implied for a no-argument diagnostic tool: call it to inspect server version/config. It offers no alternatives or preconditions, leaving the agent to infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_errorsError TrackingARead-onlyIdempotent
Get error tracking data. Workflow: (1) type='names' to see error types and counts, (2) type='events' with errorMessage to see individual instances with stack traces, (3) type='timeseries' with errorMessage to see trends over time.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-indexed (default: 1) | |
| type | No | 'names' for error type summary with counts, 'events' for individual error instances with stack traces, 'timeseries' for error count trends over time for a specific error. Default: names | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| bucket | No | Time bucket for timeseries type (default: day) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| errorMessage | No | Error message filter (required for type='events' and type='timeseries'). Use type='names' first to discover error messages. | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Error rows — shape depends on `type` input (names | events | timeseries) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the non-obvious prerequisite that errorMessage is only obtainable after calling type='names', a behavioral dependency beyond the annotations. It does not add much else (pagination, output shape), which is expected with a rich schema and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded purpose clause followed by a tight three-step workflow; every clause earns its place. It is dense rather than padded, though the workflow duplicates schema-level requirements.
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 12-parameter, 3-mode tool that has an output schema and 100% schema coverage, the description supplies the mode-selection logic the schema cannot express. Date-range, bucket, filter and pastMinutes semantics are left to the (well-documented) schema, so 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 description coverage is 100%, and the schema already documents the type enum and that errorMessage is required for events/timeseries and should be discovered via names. The description restates that dependency but adds no syntax or format detail beyond the schema, so the 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?
States a specific verb+resource ('Get error tracking data') and immediately breaks the resource into its three concrete query modes (names/events/timeseries), so an agent knows exactly what the tool returns and can tell it apart from the many event/performance/overview analytics 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 numbered workflow is explicit when-to-use guidance for each mode: names to discover error types, then events or timeseries with errorMessage. It also encodes the required ordering (discover names first), which is precisely the kind of routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_event_aggregateEvent AggregateARead-onlyIdempotent
Aggregate events by one or more dimensions (e.g. identified_user_id, traits.username, pathname, properties.room_id). Filters by event_name and optional property filters, then groups remaining events. Returns { groups: [{key, count, first_seen, last_seen, sessions, extras}], scanned, hitCount, hasMore }. When hasMore: true, the scan was capped — narrow the time window or raise maxScan for more accuracy.
| Name | Required | Description | Default |
|---|---|---|---|
| topN | No | Return only the top N groups by count (default 50). | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| groupBy | Yes | One or more group keys. Built-in: 'identified_user_id', 'user_id', 'pathname', 'hostname', 'country', 'browser', 'device_type', 'traits.username', 'traits.sex'. Use 'properties.<name>' to group by an event property (e.g. 'properties.room_id'). | |
| maxScan | No | Maximum events to scan from the backend (default 5000). | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| eventName | No | Optional exact event_name to filter for (e.g., 'pm_sent'). | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| propertyFilters | No | Filters applied to parsed event properties after fetch. | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| groups | Yes | Grouped event counts, sorted by count DESC by default |
| hasMore | Yes | True if scan was capped by maxScan and more data exists |
| scanned | Yes | Total events scanned across pagination |
| hitCount | Yes | Events matching eventName / property filters |
| windowEnd | No | |
| windowStart | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive). The description adds genuinely useful non-annotation behavior: the scan is capped and `hasMore: true` signals an incomplete result, with the remedy (narrow window or raise maxScan). That is exactly the kind of caveat an agent needs before trusting counts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the operation then the filtering/grouping order, then the output contract and its caveat. The embedded return-shape JSON is somewhat lengthy and partly redundant with the output schema, but it is compact and the hasMore caveat justifies its presence.
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 12-parameter analytics tool with a full output schema and read-only annotations, the description covers operation, filter order, and the result-truncation caveat. Since an output schema exists, restating the return shape is optional rather than required, so this is complete without being maximal.
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 a 3 is the baseline. The description earns above baseline by explaining the maxScan/hasMore interaction, which the per-parameter docs do not state, and by illustrating groupBy dimension syntax (properties.<name>) in context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (aggregate) plus resource (events) and the mechanism (groupBy dimensions, event_name filter), which is precise enough to distinguish it from get_metric or get_event_timeseries. It stops short of naming the sibling tools it should be chosen over, so it lands just below the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the grouping/filtering description and the hasMore guidance gives a corrective action, but there is no explicit statement of when to choose this over sibling aggregates like rybbit_get_metric, rybbit_get_event_timeseries, or rybbit_get_event_properties. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_event_namesEvent NamesARead-onlyIdempotent
Get all custom event names and their occurrence counts for a site. Useful for discovering what events are being tracked.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, read-only, idempotent, closed-world operation, so safety disclosure is covered. The description adds that results include occurrence counts, but says nothing about the time window behavior (defaults for startDate/pastMinutesStart), result limits, or pagination for what is effectively an enumeration endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, the core behavior front-loaded and no filler. The second sentence is a light restatement of the value of the occurrence counts, but it does add intent rather than pure padding.
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?
An output schema exists so return shape needn't be explained, all seven parameters are documented in the schema, and annotations cover the safety profile. What remains thin is positioning relative to the many event-related siblings, which is a usage-guideline gap rather than a completeness one.
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 description adds nothing param-specific, so the baseline applies; the phrase 'for a site' loosely signals siteId as the key input. The richer filter/date semantics live in the schema, which is adequate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get all custom event names and their occurrence counts for a site'), which is enough to distinguish it from the aggregate/property/timeseries siblings by content. It stops short of explicitly naming which sibling to prefer, but the resource is 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?
'Useful for discovering what events are being tracked' gives an implied discovery use case, but there is no when-to-use vs. when-not guidance and no reference to alternatives like rybbit_list_events, rybbit_get_event_properties, or rybbit_get_event_aggregate, which an agent would plausibly confuse this with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_event_propertiesEvent PropertiesBRead-onlyIdempotent
Get property breakdowns for a specific custom event. Returns the distinct property keys and values with counts.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| eventName | Yes | Event name to get properties for | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, non-destructive, closed-world operation, so the safety profile is covered. The description adds the output shape (distinct keys/values with counts), but says nothing about date-range defaults, filter scope, or pagination behavior for what is effectively an analytical read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and followed by the return format. No filler or redundant restatement of the title.
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 a full input schema, an output schema, and complete annotations, the agent has enough to invoke correctly; the description need not explain return values. It is slightly thin on scoping behavior (time window, filter effects), but 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?
Schema description coverage is 100%, including rich filter/enum documentation, so the schema does the heavy lifting and the baseline is 3. The description adds no parameter-level meaning (e.g., how filters constrain the property breakdown, or date vs pastMinutes precedence) beyond what the schema already spells out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get property breakdowns for a specific custom event') and clarifies the return contents ('distinct property keys and values with counts'). It is distinguishable in intent from siblings like get_event_aggregate or get_event_names, though it never explicitly names those 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?
No when-to-use or when-not-to-use guidance, and no routing to alternatives such as get_event_names (to discover events) or get_event_aggregate (for totals). Usage can only be inferred from the phrase 'for a specific custom event'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_event_timeseriesEvent Time SeriesBRead-onlyIdempotent
Get custom event counts as time-series data with configurable buckets. Useful for analyzing event trends over time.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket | No | Time bucket granularity (default: day). Use 'hour' for last 24h, 'week'/'month' for long ranges | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered externally. The description adds only that buckets are configurable and that this is for trend analysis, with no mention of default time windows, pagination, or data volume concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core capability front-loaded and zero filler. It is efficient, though it could have used the second sentence for routing information rather than a restatement of the obvious analytics use case.
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?
An output schema exists, so return values need not be explained, and the rich schema covers parameters. However, for a tool with 8 parameters, a filter system, and several near-identical timeseries siblings, the description omits the selection guidance an agent needs to pick 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 every one of the 8 parameters is already documented (enums, filter dimensions, pastMinutes alternatives). The description adds no parameter-level detail beyond that, which is the expected baseline when the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('get custom event counts as time-series data') along with a scope qualifier ('configurable buckets'). This distinguishes it reasonably from siblings like rybbit_get_event_aggregate and rybbit_get_overview_timeseries, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Only 'Useful for analyzing event trends over time' is offered as context. That is implied usage rather than explicit when-to-use guidance, and there is no indication of when to prefer this over rybbit_get_event_aggregate or rybbit_get_overview_timeseries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_event_user_leaderboardEvent User LeaderboardARead-onlyIdempotent
Returns the top users for a given event (e.g. who sent the most pm_sent, who clicked the most ad_click). Groups by identified_user_id + traits.username. Answers questions like 'kdo dnes poslal nejvíc vzkazů'.
| Name | Required | Description | Default |
|---|---|---|---|
| topN | No | Top N users (default 25). | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| maxScan | No | Maximum events to scan (default 5000). | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| eventName | Yes | Event name to rank users by (e.g. 'pm_sent', 'chat_v2_message_sent', 'ad_click'). | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| identifiedOnly | No | If true (default), exclude anonymous users without identified_user_id. | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| groups | Yes | Grouped event counts, sorted by count DESC by default |
| hasMore | Yes | True if scan was capped by maxScan and more data exists |
| scanned | Yes | Total events scanned across pagination |
| hitCount | Yes | Events matching eventName / property filters |
| windowEnd | No | |
| windowStart | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds useful behavioral detail about the grouping key (identified_user_id + traits.username), but says nothing about scan limits (maxScan) or how anonymous users are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, with purpose and grouping front-loaded. The closing Czech example question is slightly unusual but functions as a compact use-case anchor rather than 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?
An output schema exists, so return-format explanation is unnecessary, and parameter coverage is complete. Given that, the description is adequate, though it could mention defaults (topN=25, identifiedOnly=true) that affect the result.
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 all 11 parameters are already documented in the schema. The description only supplies example event names, adding little beyond the schema's own eventName description; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the top users for a given event') with concrete examples of the ranking (who sent the most pm_sent, who clicked the most ad_click). The grouping detail (identified_user_id + traits.username) helps separate it from aggregate-style siblings, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides example questions the tool answers ('kdo dnes poslal nejvíc vzkazů'), which implies usage, but offers no explicit when-to-use vs when-not guidance and does not point to alternatives like rybbit_get_event_aggregate or rybbit_get_user_event_breakdown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_funnel_step_sessionsFunnel Step SessionsARead-onlyIdempotent
Get the sessions that reached (or dropped off at) a specific funnel step. Useful for drilling into why users drop off at a particular funnel step.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | 'reached' = sessions that made it to this step, 'dropped' = sessions that dropped off at this step | |
| page | No | Page number, 1-indexed (default: 1) | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| steps | Yes | The funnel steps definition (same as used in rybbit_analyze_funnel) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date (YYYY-MM-DD) | |
| filters | No | Filters to apply | |
| timeZone | No | IANA timezone (default UTC) | |
| startDate | No | Start date (YYYY-MM-DD) | |
| stepNumber | Yes | The funnel step number to get sessions for (1-indexed) | |
| pastMinutesEnd | No | Minutes ago end | |
| pastMinutesStart | No | Minutes ago start |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Sessions for the step |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is fully covered. The description adds no further behavioral context such as pagination behavior, result size, or what a session record contains, leaving it at the minimum viable level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose front-loaded, zero filler. Nothing to trim.
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?
An output schema exists, so return values need not be described. But for a 12-parameter, 4-required analytics tool, the description omits any mention of the mode/steps requirements or how this relates to the funnel-analysis workflow, leaving the agent to rely entirely on the schema.
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%, including the crucial mode enum ('reached' vs 'dropped') and the steps array definition, so the baseline is 3. The description contributes nothing about parameters beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get the sessions that reached (or dropped off at) a specific funnel step,' which is concrete and distinguishable from list_sessions or analyze_funnel. It does not, however, explicitly contrast itself with the closest siblings (rybbit_analyze_funnel, rybbit_get_goal_sessions), so an agent must infer the boundary.
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?
'Useful for drilling into why users drop off at a particular funnel step' gives an implied usage context — post-funnel-analysis drill-down. But there is no explicit when-to-use/when-not framing and no named alternative; the only sibling linkage is the schema note that steps match rybbit_analyze_funnel.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_goal_sessionsGoal SessionsARead-onlyIdempotent
Get sessions that completed a specific goal. Useful for analyzing which users and sessions triggered goal conversions.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-indexed (default: 1) | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| goalId | Yes | Goal ID to get sessions for. Use rybbit_list_goals to find goal IDs. | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date (YYYY-MM-DD) | |
| filters | No | Filters to apply | |
| timeZone | No | IANA timezone (default UTC) | |
| startDate | No | Start date (YYYY-MM-DD) | |
| pastMinutesEnd | No | Minutes ago end | |
| pastMinutesStart | No | Minutes ago start |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Sessions that hit the goal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond annotations, such as pagination behavior, default ordering, or whether the goal must exist, leaving it at the minimum-viable level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose front-loaded, no wasted words. It is efficient but very sparse given the tool's parameter richness.
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?
An output schema exists, so return-value explanation is unnecessary, and the schema fully covers parameters. For a straightforward read-only analytics query, the description plus structured fields is sufficient, though it could say more about when this beats sibling session tools.
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 fully documents all 10 parameters, including goalId's pointer to rybbit_list_goals and the filter dimension list. The description adds no parameter meaning beyond this, so the 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?
States a specific verb and resource ('Get sessions') plus a scope qualifier ('that completed a specific goal'), which distinguishes it from rybbit_list_sessions. It does not explicitly name siblings, but the goal-scoping makes 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?
'Useful for analyzing which users and sessions triggered goal conversions' implies a use case but gives no when/when-not guidance or alternative routing (e.g., use rybbit_list_goals first, or use list_sessions for unfiltered data). Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_journeysUser JourneysBRead-onlyIdempotent
Get user journey (flow) analysis showing the most common navigation paths through the site. Shows sequences of pages users visit and how many sessions follow each path.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | Number of journey steps to analyze (default 3) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date (YYYY-MM-DD) | |
| filters | No | Filters to apply | |
| timeZone | No | IANA timezone (default UTC) | |
| startDate | No | Start date (YYYY-MM-DD) | |
| journeyLimit | No | Max number of journey paths to return (default 100) | |
| pastMinutesEnd | No | Minutes ago end | |
| pastMinutesStart | No | Minutes ago start |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Journey paths with session counts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds that output is sequences of pages plus session counts per path, which is useful framing, but says nothing about cost, result size caps, or how the steps/journeyLimit interact at runtime.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, no filler. The second sentence slightly restates the first (navigation paths vs sequences of pages) but does add the session-count dimension, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return-value explanation is not required, and annotations cover safety. What is missing is routing guidance against the many sibling analytics tools (funnels, retention, metrics), which matters for a 9-parameter tool whose selection is ambiguous.
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 parameter meaning is fully documented in the schema (steps default 3, journeyLimit default 100, full filter dimension list, date and pastMinutes fields). The description adds no syntax, default, or interaction detail beyond that, so the 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?
States a specific verb (Get) and resource (user journeys) and explains the analysis: navigation paths, page sequences, and session counts per path. This is clearly a flow/journey tool, though it never explicitly contrasts itself with the funnel siblings (analyze_funnel, get_funnel_step_sessions) that could also describe path-like data.
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?
No when-to-use statement, no prerequisites, and no alternatives named. The agent must infer from the sibling list whether journeys or funnels is the right tool when investigating drop-off or navigation behavior. Only the implicit framing as 'flow analysis' hints at usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_metricMetric BreakdownARead-onlyIdempotent
Get metric breakdown by dimension. Use parameter='pathname' for top pages, 'browser'/'operating_system'/'device_type' for tech stats, 'country'/'city' for geo, 'utm_source'/'utm_campaign' for marketing, 'referrer'/'channel' for traffic sources, 'entry_page'/'exit_page' for user flow. Returns sorted list with counts, percentages, bounce rate, and session duration.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-indexed (default: 1) | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| parameter | Yes | Metric dimension to break down by. device_model and app_version apply only to mobile-type sites (legacy: app) tracked via SDK. | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Metric breakdown rows |
| totalCount | No | Total rows across all pages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds the return shape (sorted list with counts, percentages, bounce rate, session duration), but that largely duplicates the existing output schema and omits pagination/limit behavior. Adequate, not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, followed by a dense but purposeful dimension map. No filler or restatement of the tool name; every clause carries routing 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?
With an output schema, rich annotations, and full schema coverage, the description needs only to establish purpose and dimension routing, which it does. Minor gap: no mention of pagination defaults or how filters interact with the breakdown, though those are schema-documented.
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 every parameter and the baseline would be 3. The description earns a notch above by adding semantic grouping of the `parameter` enum values into analytic categories, which gives the agent practical meaning beyond the raw enum list.
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+resource ('Get metric breakdown by dimension') and then enumerates the concrete dimension values grouped by analytic intent (pages, tech, geo, marketing, traffic, flow). An agent can tell this apart from siblings like rybbit_get_event_aggregate or rybbit_describe_dimension without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing logic: which parameter value to use for each analysis goal ('pathname' for top pages, 'country'/'city' for geo, etc.). This is genuine when-to-use guidance. It does not, however, state when NOT to use this tool or name a preferred alternative for overlapping cases (e.g., describe_dimension or event aggregates).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_outbound_linksOutbound LinksBRead-onlyIdempotent
Get outbound link clicks tracked on the site. Shows which external URLs users are clicking and how often.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-indexed (default: 1) | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a safe read-only, idempotent, non-destructive operation, so the safety burden is covered. The description adds a small amount of behavioral context (it is click-tracking data about external URLs), but discloses nothing about scoping, empty results, or aggregation behavior beyond what the annotations and output schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, front-loading the core action and then the interpretation of the result. Efficient and well-ordered, though the second sentence borders on restating the first.
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 100% schema coverage, full annotations, and an output schema, most of the callable surface is already documented. What remains missing is usage context (when to reach for this over sibling metrics), which keeps it at a minimally adequate level rather than 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%, so all nine parameters (siteId, date range, pagination, filters, timezone) are fully documented in the schema itself. The description adds no extra meaning about parameter usage, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get outbound link clicks tracked on the site') and adds clarifying scope ('which external URLs users are clicking and how often'). It is clear what the tool returns, but it never distinguishes itself from the many sibling analytics tools (e.g., rybbit_get_metric, rybbit_get_page_titles), so sibling differentiation is absent.
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?
There is no guidance on when to use this tool versus alternatives such as rybbit_get_metric or rybbit_get_page_titles, nor any prerequisites or exclusions. The description only says what it fetches, leaving tool selection entirely to inference from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_overviewSite OverviewBRead-onlyIdempotent
Get aggregated overview metrics for a site: sessions, pageviews, unique users, pages per session, bounce rate, and average session duration. Supports date range and filters.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| users | No | |
| sessions | No | |
| pageviews | No | |
| bounceRate | No | |
| pagesPerSession | No | |
| avgSessionDuration | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive operation, so the safety profile is covered. The description adds only that date ranges and filters are supported, which the schema also conveys, and offers no extra behavioral context such as aggregation granularity or default time window.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, metric list front-loaded after the purpose, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema description coverage, the description does not need to explain return values or parameters. It names the metrics returned and notes range/filter support, which is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including detailed filter dimension and operator docs, so the schema carries the parameter burden and baseline 3 applies. The description adds no format or syntax detail beyond 'date range and filters.'
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+resource ('Get aggregated overview metrics for a site') and enumerates the returned metrics, so the agent knows exactly what it produces. It does not, however, distinguish itself from close siblings like rybbit_get_overview_timeseries or rybbit_get_metric, leaving the boundary to inference.
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 only guidance is 'Supports date range and filters,' which describes capability rather than when to choose this tool over the many sibling analytics tools. There is no stated when-to-use, when-not-to-use, or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_overview_timeseriesOverview Time SeriesBRead-onlyIdempotent
Get overview metrics as time-series data with configurable time buckets (minute, hour, day, week, month). Returns arrays of data points for charting trends.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket | No | Time bucket granularity (default: day). Use 'hour' for last 24h, 'week'/'month' for long ranges | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Time-bucketed overview metrics |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world behavior. The description adds only that output is arrays of data points for charting, which is partly redundant with the output schema. No other behavioral traits such as auth, rate limits, or data retention are mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and resource, and no wasted words. The return-shape note is brief and 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?
Given the 100% schema coverage, rich parameter descriptions, and an output schema, the description covers the essential purpose and bucket configurability. It does not explain filter/date/past-minute usage, but the schema compensates. Minor gaps remain around sibling selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters in detail. The description mentions configurable buckets, but its list is incomplete compared to the schema enum, and it adds no meaning beyond what is already in the parameter 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 states a specific verb and resource: 'Get overview metrics as time-series data'. It distinguishes the time-series shape from a plain summary, but does not explicitly name sibling tools like rybbit_get_overview or rybbit_get_event_timeseries.
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?
No explicit when-to-use guidance or alternatives are provided. The phrase 'for charting trends' implies a use case but does not tell an agent when to choose this tool over rybbit_get_overview or rybbit_get_event_timeseries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_page_titlesGet Page TitlesARead-onlyIdempotent
Get the most-viewed page titles for a site, broken down by pageviews and unique sessions. Complements rybbit_get_metric with parameter='pathname' by giving the human-readable page title instead of just the path.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the description only needs to add analytical context. It does: the result is ranked by viewership and split into pageviews vs unique sessions, which tells the agent what the output means. It does not mention result limits or default time window, but with an output schema present that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core purpose front-loaded and the sibling comparison second. Every clause 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?
With a rich output schema, full parameter documentation, and read-only annotations, the description needs only to convey purpose and routing, which it does. It could note the default time window or result-count behavior, but nothing critical 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 description coverage is 100% across all 7 parameters, so the schema fully documents siteId, date ranges, filters, and timezone. The description adds no parameter-level detail, which is acceptable given the schema does the work, but it means baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the most-viewed page titles for a site') plus the breakdown dimensions (pageviews, unique sessions). It explicitly distinguishes itself from the sibling rybbit_get_metric, so an agent can select it correctly without opening either schema.
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 (rybbit_get_metric with parameter='pathname') and the condition that selects this tool: when a human-readable title is wanted instead of just the path. No explicit exclusions or prerequisites are given, but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_performanceWeb VitalsARead-onlyIdempotent
Get Core Web Vitals performance metrics (LCP, CLS, INP, FCP, TTFB) with p50, p75, p90, p99 percentiles. Optionally break down by page path, browser, or OS.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| dimension | No | Break down performance by dimension. Default: overview (aggregated) | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Per-dimension rows when dimension!=overview |
| cls_p50 | No | |
| cls_p75 | No | |
| cls_p90 | No | |
| cls_p99 | No | |
| fcp_p50 | No | |
| fcp_p75 | No | |
| fcp_p90 | No | |
| fcp_p99 | No | |
| inp_p50 | No | |
| inp_p75 | No | |
| inp_p90 | No | |
| inp_p99 | No | |
| lcp_p50 | No | |
| lcp_p75 | No | |
| lcp_p90 | No | |
| lcp_p99 | No | |
| ttfb_p50 | No | |
| ttfb_p75 | No | |
| ttfb_p90 | No | |
| ttfb_p99 | No | |
| totalCount | No | Total rows across all pages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, idempotent, read-only operation, so the safety profile is covered. The description adds useful behavioral context by naming the exact statistics computed (p50/p75/p90/p99) and the available groupings, but it says nothing about default time window behavior, permission requirements, or result volume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with zero filler; the metric set and percentiles are front-loaded, and the optional breakdown is stated last where it belongs. Every clause carries 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?
With an output schema present, the description need not explain return values, and the annotations cover the safety profile. It adequately conveys what is measured and how results can be segmented, though the absence of any time-range hint (despite startDate/endDate/pastMinutes params) is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 8 parameters are already documented in the schema, including the filter dimensions and timezone handling. The description's mention of breakdown dimensions only echoes the existing 'dimension' enum values, adding no new syntax or format detail, so the 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?
States a specific verb and resource ('Get Core Web Vitals performance metrics') and enumerates the exact metrics (LCP, CLS, INP, FCP, TTFB) plus the aggregation granularity (p50/p75/p90/p99). It does not, however, differentiate itself from the closely named sibling rybbit_get_performance_timeseries, so an agent must infer the distinction (snapshot percentiles vs. time series).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Optionally break down by page path, browser, or OS' implies when to use the dimension parameter, but there is no explicit guidance on when to choose this tool over rybbit_get_performance_timeseries, rybbit_get_metric, or rybbit_get_overview. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_performance_timeseriesWeb Vitals Time SeriesARead-onlyIdempotent
Get Core Web Vitals performance metrics as time-series data for trend analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket | No | Time bucket granularity (default: day). Use 'hour' for last 24h, 'week'/'month' for long ranges | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Time-bucketed performance metrics |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is fully covered structurally. The description adds the trend/time-series framing but says nothing about bucketing behavior, date-range defaults, or the pastMinutes* alternative to date parameters, so it adds only modest context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler, so nothing needs trimming. It is slightly thin for an 8-parameter tool, but there is no redundancy or waste to penalize.
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 and 100% schema coverage, the description does not need to explain return values or parameters, and its purpose statement is sufficient to call the tool. The main remaining gap is that it never positions itself against rybbit_get_performance in a large sibling set.
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 eight parameters, including bucket granularity, filters, timezone, and the pastMinutesStart/pastMinutesEnd date alternative. The description adds no parameter-level meaning beyond that, which is the baseline case.
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), a specific resource (Core Web Vitals performance metrics), and the output shape (time-series data for trend analysis). It implicitly distinguishes itself from the sibling rybbit_get_performance (aggregate vs. time series) but never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For trend analysis" implies the usage context, but there is no explicit when-to-use vs. when-not, no mention of the aggregate sibling rybbit_get_performance, and no guidance on choosing bucket granularity even though the schema enumerates nine options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_retentionUser RetentionBRead-onlyIdempotent
Get user retention cohort analysis showing how many users return over time periods.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Retention cohorts; periods are percentages per period, null = period not reached yet |
| mode | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful semantics (cohort retention over time) but says nothing about date-range requirements, granularity, or how start/end dates interact with the pastMinutes alternatives.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the core purpose and output meaning are stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and the schema documents all inputs. The only gap is guidance on the temporal scope and how date parameters are expected to be used for a cohort analysis, which is minor.
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 seven parameters (siteId, date range, timezone, filters, pastMinutes overrides) are already fully documented in the schema. The description adds no parameter-level meaning of its own, which is acceptable given the 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?
States a clear verb and resource ('Get user retention cohort analysis') plus the semantic content of the output ('how many users return over time periods'). It is distinguishable from analytics siblings like rybbit_get_overview or rybbit_analyze_funnel, but it never names or contrasts with those 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?
There is no when-to-use guidance, no prerequisites, and no mention of how this differs from funnel, session, or overview tools in the sibling list. The agent must infer the use case entirely from the phrase 'cohort analysis'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_sessionSession DetailARead-onlyIdempotent
Get detailed session information including all page views, events, user traits, device info, location, and full event timeline. Use rybbit_list_sessions first to find session IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| sessionId | Yes | Session ID to retrieve |
Output Schema
| Name | Required | Description |
|---|---|---|
| os | No | |
| city | No | |
| device | No | |
| events | No | |
| region | No | |
| traits | No | |
| userId | No | |
| browser | No | |
| country | No | |
| sessionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is fully covered. The description adds the prerequisite workflow (list first) but doesn't mention output shape or pagination, though an output schema exists and covers returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first lists contents, the second gives the ordering prerequisite. Front-loaded and 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 simple read tool with full annotation coverage, complete schema, and an output schema, the description plus structured fields suffice. The only minor gap is not mentioning rate limits or latency, but that's not expected here.
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 (siteId and sessionId) with clear descriptions. The description adds no parameter-level meaning beyond what the schema already documents, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (session information) with enumerated contents including page views, events, user traits, device, location, and timeline. Clearly distinguishable from siblings like rybbit_list_sessions or rybbit_get_session_locations, though the enumeration is somewhat listy.
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 directs the agent to use rybbit_list_sessions first to find session IDs, which is a concrete workflow prerequisite. No explicit exclusions or when-not-to-use guidance, but the prerequisite is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_session_locationsSession LocationsARead-onlyIdempotent
Get geographic session location data with coordinates. Returns latitude, longitude, city, country, and session count for map visualization and geographic analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-indexed (default: 1) | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Geographic session locations |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered by structured fields. The description adds the shape of the payload (lat, lon, city, country, session count) but nothing about scoping, grouping, or pagination behavior beyond what the schema carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero padding, with the core capability front-loaded before the return-value detail. Nothing in it is wasted.
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, annotated read-only behavior, and full schema coverage across 9 parameters, the description supplies everything needed to decide to call it and what to expect. Only the lack of sibling routing keeps it from a 5.
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 rich filters parameter documents its own dimensions and operators, so the schema does the heavy lifting. The description adds no parameter-level detail (e.g., how siteId or the pastMinutes range pairs are used), which is the expected baseline 3 when coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get geographic session location data with coordinates') and enumerates the returned fields, so the agent knows it is about geo-located session aggregation rather than raw session listing. It does not explicitly differentiate itself from siblings like rybbit_list_sessions or rybbit_get_metric, which slightly caps the score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for map visualization and geographic analysis' implies the intended use case but stops short of stating when to pick this over rybbit_get_metric or rybbit_list_sessions, and offers no exclusions or prerequisites. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_site_idGet Site ID by DomainARead-onlyIdempotent
Look up a site by domain name. Returns the numeric siteId used for analytics API queries. Note: for SDK tracking setup, use the hash siteId returned by rybbit_create_site instead.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to search for (e.g. 'example.com'). Partial match supported. |
Output Schema
| Name | Required | Description |
|---|---|---|
| matches | No | Matching sites |
| message | No | Diagnostic message when no match |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral value by disclosing the return type (numeric) and the important cross-tool nuance that SDK tracking uses a different, hash-form siteId from rybbit_create_site.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, return value second, caveat last. No filler, and the most decision-relevant routing note is retained rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only lookup with an output schema and full annotation coverage, nothing an agent needs in order to call it correctly is missing; return-format detail is legitimately delegated to the output schema.
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?
Only one parameter with 100% schema description coverage, including the partial-match behavior, so the schema does all the work. The description adds no syntax or matching detail beyond it, making the baseline 3 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?
States a specific verb and resource ('look up a site by domain name') and clarifies the return value ('numeric siteId'). The note explicitly distinguishes this tool's output from the hash siteId produced by rybbit_create_site, though it does not differentiate from rybbit_list_sites, which also surfaces sites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('used for analytics API queries') and an explicit when-not with the named alternative for hash-based SDK tracking setup. It stops short of stating when to prefer this over rybbit_list_sites or whether it must be called before other siteId-taking tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_userUser DetailBRead-onlyIdempotent
Get detailed information about a specific user including their traits, session history, and activity summary.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| userId | Yes | User ID (identified_user_id or internal user ID) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | User detail payload |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds the categories of data returned, but since an output schema exists this is marginal added value rather than deep behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficiently written sentence that front-loads the operation and the resource. Every clause earns its place by enumerating the returned content without padding.
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 two-parameter read tool with a rich output schema and full annotation coverage, the definition supplies enough to call it correctly. The only meaningful gap is routing guidance against overlapping user-detail siblings, which is minor given the low complexity.
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 both parameters (siteId, userId) are documented in the schema, including alternate identifier forms. The description adds no syntax or format detail beyond what the schema already provides, so 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?
States a specific verb and resource ('Get detailed information about a specific user') and names the content returned (traits, session history, activity summary). It implicitly distinguishes from list_users by requiring a specific user, but does not differentiate from siblings like rybbit_get_user_traits or rybbit_list_sessions that cover overlapping slices.
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?
There is no explicit when-to-use guidance, no prerequisites, and no mention of alternative tools such as get_user_traits or get_session. The name implies a detail lookup, but nothing routes the agent among the many user-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_user_event_breakdownUser Event BreakdownARead-onlyIdempotent
Get event count breakdown for a specific user. Shows how many times each event_name was triggered by this user. Accepts either the Rybbit user_id (device hash) or the identified_user_id (app-provided user ID). Useful for analyzing per-user behavior like ad_click, chat_message_sent, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| userId | Yes | User ID — either Rybbit device hash (user_id) or app-provided ID (identified_user_id). Both are checked. | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely useful behavioral context beyond them: the userId parameter resolves either a device hash or an app-provided identified_user_id, and both are checked. It does not discuss pagination or result limits, but no false claims are made.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and output shape, followed by the ID-resolution note and a usage hint. Efficient overall; the trailing 'etc.' example clause is slightly loose but still earns its place by illustrating the event_name dimension.
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?
An output schema exists, so return values need not be explained, and the annotations cover safety. The description supplies the essential per-user framing and ID semantics; the only gap is the absence of any routing guidance toward the many sibling event/user tools.
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 eight parameters including the dual meaning of userId. The description restates the userId resolution behavior, which reinforces but does not extend the schema, and says nothing about filters, date windows, or pastMinutes alternatives. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Get event count breakdown for a specific user' and clarifies the output shape ('how many times each event_name was triggered'). It is clear without opening the schema, though it never names the sibling tools it must be distinguished from (e.g. rybbit_get_event_aggregate, rybbit_get_event_user_leaderboard), so an agent must infer the boundary.
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?
'Useful for analyzing per-user behavior like ad_click, chat_message_sent, etc.' gives implied usage context and example events, but there is no explicit when-to-use/when-not and no mention of the sibling tools that also aggregate events. Usage is suggested rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_user_session_countUser Session CountARead-onlyIdempotent
Get the per-day session count for a single user across the requested time range. Useful for plotting user engagement intensity (calendar heatmap or sparkline).
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| userId | Yes | User ID — either identified_user_id or device hash user_id | |
| endDate | No | End date (YYYY-MM-DD) | |
| timeZone | No | IANA timezone (default UTC) | |
| startDate | No | Start date (YYYY-MM-DD) | |
| pastMinutesEnd | No | ||
| pastMinutesStart | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered without the description. The description adds the per-day aggregation grain, which is genuine behavioral context, but says nothing about pagination, empty-day behavior, or timezone effects. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core operation is front-loaded before the use-case example. Nothing is repeated from the title or schema.
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?
An output schema exists, so return-value shape need not be explained. However, for a 7-parameter tool with an uncovered pastMinutes pair and timezone semantics, the description does not say how relative-minute ranges interact with startDate/endDate. It is enough to call the tool correctly for the common case, not for the full parameter space.
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 71%, so most parameters (siteId, userId, dates, timezone) are documented in the schema itself. The description adds only an implied time-range constraint ('across the requested time range') and gives no clarification of the ambiguous pastMinutesStart/pastMinutesEnd pair, which are the only undocumented parameters. Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'per-day session count for a single user across the requested time range.' The per-day granularity and single-user scoping make the operation concrete. It stops short of naming the nearest siblings (get_user_event_breakdown, get_user_traits) that an agent would otherwise have to differentiate by schema alone.
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 clause 'Useful for plotting user engagement intensity (calendar heatmap or sparkline)' gives one intended context, so usage is implied rather than explicit. There is no guidance on when to prefer this over get_user_event_breakdown, list_sessions, or get_retention, which is a real gap given the crowded user/session sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_get_user_traitsUser TraitsARead-onlyIdempotent
Get user trait keys, values, or find users by trait. mode='keys' lists all trait keys. mode='values' (default when key is provided) returns distinct values for a trait key. mode='users' finds users matching a specific trait key+value pair (case-insensitive).
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Trait key (required for 'values' and 'users' modes) | |
| mode | No | 'keys' to list trait keys, 'values' to get values for a key, 'users' to find users by trait. Default: 'keys' if no key provided, 'values' if key is provided. | |
| limit | No | Max results to return | |
| value | No | Trait value (required for 'users' mode) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| keys | No | |
| values | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral detail beyond them: case-insensitive matching in users mode and the implicit mode-default logic. It doesn't mention pagination behavior despite the limit parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the overall purpose, then one clause per mode. No filler or repetition; every sentence carries distinct 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?
An output schema exists, so return-value detail is not required, and annotations cover safety. The description covers all modes and their triggers, leaving only sibling differentiation (vs. rybbit_get_user / rybbit_list_users) unaddressed.
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 schema already documents mode semantics, key/value requirements, and limit. The description restates the mode/key relationship, adding only the case-insensitivity note for value matching, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (user trait keys/values/users), then enumerates the three operating modes so an agent knows exactly what surface the tool covers. The functional scope is unambiguous even without naming a sibling.
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 explains when each mode applies and even documents the default resolution rule ('values' when key is provided, otherwise 'keys'). What's missing is routing against siblings like rybbit_get_user or rybbit_list_users, which could plausibly overlap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_list_eventsList EventsARead-onlyIdempotent
List raw events for a site with filtering and pagination. Returns individual event records with timestamps, types, pathnames, event names, and properties. When filtering by event_name, only matching events are returned (not entire sessions). Use beforeTimestamp from a previous response's cursor.oldestTimestamp to paginate backwards through history.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-indexed (default: 1) | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| eventName | No | Filter to only return events with this exact event_name (e.g., 'ad_click'). More precise than using the filters array which returns entire sessions. | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| afterTimestamp | No | Return events strictly newer than this timestamp (UTC). Mirrors beforeTimestamp for forward pagination. | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| beforeTimestamp | No | Return events strictly older than this timestamp (UTC 'YYYY-MM-DD HH:mm:ss'). Use cursor.oldestTimestamp from previous page. | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds genuine behavioral nuance: that event_name filtering narrows to matching events rather than whole sessions, which is not expressible via annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then filter caveat, then pagination recipe. No filler and each sentence carries actionable 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?
An output schema exists, so return values needn't be re-explained, and the description still summarizes them. For a 12-parameter filtered-list tool with full schema coverage, it is complete; only explicit sibling disambiguation is absent.
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 goes beyond by tying beforeTimestamp to the prior response's cursor.oldestTimestamp and spelling out the event_name-vs-filters distinction, adding cross-parameter semantics the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List raw events for a site') and enumerates the returned record shape. The word 'raw' implicitly distinguishes it from aggregate siblings like get_event_aggregate, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete mechanics — event_name filtering returns only matching events, and beforeTimestamp/cursor.oldestTimestamp drives backward pagination. However, it never says when to choose this over list_sessions or the event-aggregate tools, so sibling routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_list_funnelsList FunnelsARead-onlyIdempotent
List all saved funnels for a site with their step definitions.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Saved funnels |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety and determinism are covered. The description's only added behavioral note is that step definitions come back with each funnel, which is modest extra context; nothing about pagination, ordering, or empty-state behavior.
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?
One sentence, front-loaded with the verb and resource, with no filler. Every clause 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?
An output schema exists, so return-shape detail is not required, and with a single fully documented parameter this definition is nearly sufficient. The only gap is not routing the agent away from the similarly named analyze_funnel sibling.
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 siteId is fully documented in the schema as a numeric ID or domain identifier, so the baseline applies. The description adds no format, default, or filtering semantics beyond what the schema already states.
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 (List) and resource (saved funnels) plus scope (for a site) and return content (step definitions). It is readable against most siblings, though it doesn't explicitly distinguish itself from rybbit_analyze_funnel or rybbit_create_funnel, which an agent may conflate.
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?
"List all saved funnels" implies a discovery/configuration-reading context, but there is no explicit when-to-use guidance and no mention of alternatives such as analyze_funnel for metrics or create_funnel for adding one. Usage is only inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_list_goalsList GoalsBRead-onlyIdempotent
List all goals for a site with their current conversion metrics and configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date (YYYY-MM-DD) | |
| filters | No | Filters to apply | |
| timeZone | No | IANA timezone (default UTC) | |
| startDate | No | Start date (YYYY-MM-DD) | |
| pastMinutesEnd | No | Minutes ago end | |
| pastMinutesStart | No | Minutes ago start |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Goals with conversion metrics |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered without the description. The description adds only that conversion metrics and configuration are included in the result, which is thin given an output schema exists.
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?
One sentence, front-loaded with the verb and resource, and no filler. It could arguably be tightened further or expanded to mention filtering, but every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with a full output schema, complete input schema coverage, and clear annotations, the definition is sufficient to invoke correctly. The only omission is any mention of the filter capability, which the schema fully documents, so it is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the detailed filter dimension enumeration and date/timezone formats, so the schema carries the full parameter burden. The description adds nothing beyond a site scoping hint, making the baseline 3 correct.
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?
Clear verb (List) plus resource (goals), scoped to a site, and states the returned content ('current conversion metrics and configuration'). It does not explicitly differentiate itself from siblings like rybbit_get_goal_sessions or rybbit_list_funnels, but an agent can tell what it retrieves.
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?
No when-to-use guidance and no alternatives named. With create_goal/update_goal/delete_goal/get_goal_sessions as siblings, the description never says when listing is the right choice versus calling rybbit_get_goal_sessions for per-session data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_list_sessionsList SessionsARead-onlyIdempotent
List sessions for a site with filtering and pagination. Returns session ID, user info, device, location, pages visited, duration, bounce status, and IP address (if site has trackIp enabled). Supports client-side IP filtering.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | No | Filter sessions by IP address (exact or partial match, client-side). Requires site to have trackIp enabled. | |
| page | No | Page number, 1-indexed (default: 1) | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| minDuration | No | Minimum session duration in seconds. | |
| identifiedOnly | No | Only return sessions from identified users. Default: false. | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Sessions |
| filteredBy | No | Client-side filter applied (e.g. ip=...) |
| scannedPages | No | Pages scanned when filtering client-side |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the bar is lower. The description adds genuinely useful behavioral context: the enumerated return fields, the conditional presence of IP address gated on the site's trackIp setting, and the caveat that IP filtering happens client-side. These are traits an agent cannot infer from the annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and followed by the return-shape detail. Dense but every clause adds information; no filler or restated title.
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, the description needn't document return values in depth, yet it summarizes them usefully. All 12 parameters are covered by the schema at 100% coverage, and the description adds the one non-obvious behavioral constraint (trackIp-gated IP field, client-side filtering). 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 description coverage is 100%, so the schema already documents all 12 parameters thoroughly, including the filter enum values and parameter dimensions. The description's only additional param-related signal is the client-side nature of IP filtering and the trackIp prerequisite, which is marginal over the schema. Baseline 3 applies when the schema carries the 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?
States a specific verb and resource ('List sessions for a site') plus scope modifiers (filtering, pagination). An agent can distinguish it from the singular sibling rybbit_get_session by the plural session scope, though the description never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied ('for a site with filtering and pagination') but there is no explicit when-to-use vs. when-not guidance or reference to the alternative rybbit_get_session for a single session. It notes the client-side IP filtering capability, which hints at a use case but does not route the agent between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_list_sitesList SitesARead-onlyIdempotent
List all sites and organizations the authenticated user has access to
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Organizations with nested sites |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, non-destructiveHint and a closed world, so the safety profile is covered. The description adds one genuine piece of context the annotations do not: results are constrained to what the authenticated user can access. It says nothing about ordering, aggregation across organizations, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scope constraint is embedded rather than buried after preamble. Every clause 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?
With an output schema present, return values need not be described, and the annotations cover the safety profile, leaving little for the description to carry. The one remaining gap is the shape of the results (flat list vs. organizations nesting sites), which the agent would have to infer.
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 takes zero parameters, so there is no parameter semantics to document and the baseline for a parameterless tool applies. Nothing in the description misleads about inputs.
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 clear verb ('List') and resources ('sites and organizations') scoped to the authenticated user, so the agent knows exactly what comes back. It does not explicitly contrast itself with nearby siblings such as rybbit_list_users or rybbit_get_site_id, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus the many alternatives (rybbit_get_site_id, rybbit_create_site, rybbit_list_users), nor of any prerequisites. The usage is only implied by the name and the word 'List'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_list_usersList UsersARead-onlyIdempotent
List users for a site. Returns user IDs, session counts, first/last seen dates, and user traits. Supports filtering by most analytics dimensions. Use 'search' param to find users by username/email/name (case-insensitive partial match). IMPORTANT: event_name filter is silently STRIPPED here — upstream backend returns HTTP 500. To rank users by a specific event, use rybbit_get_event_user_leaderboard instead. Call rybbit_describe_dimension to see capability per filter dimension.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-indexed (default: 1) | |
| limit | No | Results per page (default: 20-50 depending on endpoint, max 200) | |
| search | No | Search users by trait value (e.g. username, email). Uses case-insensitive partial matching (ILIKE). | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| sortBy | No | Sort field (default: 'last_seen'). 'duration' sorts by total time spent (aggregated from sessions, requires date range). | |
| endDate | No | End date in ISO format (YYYY-MM-DD) | |
| filters | No | Array of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}] | |
| timeZone | No | IANA timezone (e.g., Europe/Prague). Default: UTC | |
| sortOrder | No | Sort direction (default: 'desc') | |
| startDate | No | Start date in ISO format (YYYY-MM-DD) | |
| searchField | No | Which field to search in (default: 'username'). Only used when 'search' is provided. | |
| identifiedOnly | No | Only return identified users (users with identified_user_id). Default: false. | |
| pastMinutesEnd | No | Alternative to dates: minutes ago end (default 0 = now) | |
| pastMinutesStart | No | Alternative to dates: minutes ago start (e.g., 60 = last hour) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | User rows |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/no-destructive, but the description adds genuinely non-obvious behavior beyond them: the event_name filter is silently STRIPPED because the backend returns HTTP 500, plus a description of the return payload. That surfaces a hidden failure mode the agent would otherwise hit blind.
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?
Front-loaded with purpose and returns, then the critical event_name gotcha and the routing pointer. It is dense with multiple directives but each sentence earns its place; only minor tightening would help.
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 14-parameter, read-only list tool with an output schema present, the description covers what it returns, how to search, how to filter, and the one dangerous filter pitfall. 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%, so the 3 baseline applies, but the description goes further by clarifying the search param uses case-insensitive partial matching, positioning searchField as its companion, and flagging the event_name filter behavior tied to a specific 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 states a specific verb and resource ('List users for a site') and enumerates the returned fields (user IDs, session counts, first/last seen, traits), letting an agent distinguish it from siblings like rybbit_get_event_user_leaderboard and rybbit_list_sessions without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: use 'search' to find users by username/email/name, use rybbit_get_event_user_leaderboard when ranking by a specific event, and call rybbit_describe_dimension to learn filter capabilities. It also states the case that breaks (event_name filter) with the alternative to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_live_usersLive User CountARead-onlyIdempotent
Get the current number of live/active users on a site in real-time
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) |
Output Schema
| Name | Required | Description |
|---|---|---|
| liveUsers | Yes | Current live/active user count (normalized from upstream {count} envelope) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the freshness semantics ('current', 'real-time'), which is genuine behavioral context beyond the annotations, but it says nothing about return shape or latency despite an output schema existing. Modest added value over structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the resource and its real-time nature front-loaded. No filler, no 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?
For a one-parameter, read-only metric tool with full schema coverage, an output schema, and annotations covering the safety profile, the description is sufficient to invoke correctly. A brief note on what the count represents (e.g., distinct users in a rolling window) would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (siteId) and the schema already documents it fully with 100% coverage, including the numeric-ID-or-domain nuance. The description adds no additional meaning about siteId, so the baseline 3 applies when the schema does all the work.
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 (current number of live/active users) with a real-time qualifier, which cleanly separates it from the sibling rybbit_list_users (which enumerates users rather than counting them). It does not name the sibling explicitly, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'in real-time' implies the tool is for live monitoring rather than historical analysis, which is a usable contextual cue. However, there is no explicit when-to-use/when-not guidance and no named alternative (e.g., rybbit_list_users or rybbit_get_overview), leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_site_has_dataSite Has DataARead-onlyIdempotent
Check whether a site has received any tracking events yet. Useful for verifying SDK integration before drilling into analytics.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | Yes | Site ID (numeric ID or domain identifier) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasData | Yes | Whether the site has received any tracking events |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, covering the safety profile. The description adds only the semantic scope of the check ('tracking events yet') and a use case; it does not disclose side effects, auth needs, or limits beyond what annotations provide. A 3 reflects modest added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core purpose and followed by a usage note. No redundant or filler content; appropriately sized.
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 single-parameter, read-only check with an output schema and rich annotations, the description covers what the tool does and when to use it. No critical information 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% with one required siteId parameter, so the schema fully documents the parameter. The description adds no syntax, format, or constraint details beyond what the schema provides, baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check') and resource ('whether a site has received any tracking events'), and the 'before drilling into analytics' phrasing implicitly distinguishes it from the many analytics-query siblings. It does not name a sibling explicitly, so a 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear when-to-use context ('verifying SDK integration before drilling into analytics'), but gives no when-not-to-use guidance or named alternatives. This is clear context without exclusions, matching a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_update_goalUpdate GoalCIdempotent
Update an existing goal's name, type, or configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| config | Yes | Goal configuration. Use pathPattern for path goals or eventName for event goals. | |
| goalId | Yes | Numeric goal ID to update | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| goalType | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| message | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare that this is a non-read-only, idempotent, and non-destructive write operation. The description adds no behavioral context beyond what the annotations provide, such as update semantics (full replace vs. merge), authorization requirements, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is appropriately sized for a minimal update tool, though its extreme brevity contributes to gaps in guidance and behavioral context.
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 (5 parameters including a required nested config object, 4 required fields), the description is too sparse. While annotations cover safety and an output schema exists, the description fails to explain update semantics, how config interacts with goalType, or whether omitted fields are preserved.
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 60%, and the description only restates the mutable fields ('name, type, or configuration') without adding format details, dependencies, or examples. The schema itself handles most parameter semantics, so this is baseline adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Update an existing goal') and names the mutable fields (name, type, configuration). It is clear what the tool does, though it does not explicitly distinguish itself from sibling tools like rybbit_create_goal or rybbit_delete_goal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'existing goal' implies use for modification, but there is no explicit guidance on when to use this versus rybbit_create_goal, nor any prerequisites or exclusions. The description gives minimal context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rybbit_update_site_configUpdate Site ConfigBIdempotent
Update configuration for an existing Rybbit site. Change site identity (name, domain, type), toggle tracking features (IP, session replay, errors, button clicks, etc.), manage exclusions (IPs, countries, paths, hostnames, user agents), and public embedding.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name for the site | |
| tags | No | Tags for grouping/filtering sites (max 20, each up to 50 chars) | |
| type | No | Site type: 'web' or 'mobile'. 'app' is a legacy alias mapped to 'mobile'. Switching to mobile forces sessionReplay and webVitals off. | |
| domain | No | Domain (web sites) or package name (mobile sites). Normalized server-side. | |
| public | No | Make site stats publicly accessible | |
| siteId | Yes | Site ID (numeric ID or domain identifier) | |
| trackIp | No | Track visitor IP addresses | |
| blockBots | No | Block known bots from tracking | |
| trackCopy | No | Track text copy events | |
| webVitals | No | Track Core Web Vitals metrics | |
| excludedIPs | No | IP addresses or CIDR ranges to exclude from tracking (max 100) | |
| saltUserIds | No | Salt user IDs for privacy | |
| trackErrors | No | Track JavaScript errors | |
| embedEnabled | No | Allow embedding public stats (e.g. via iframe) | |
| excludedPaths | No | URL path patterns to exclude from tracking (max 100) | |
| sessionReplay | No | Enable session replay recording | |
| trackOutbound | No | Track outbound link clicks | |
| trackUrlParams | No | Track URL parameters | |
| excludedCountries | No | ISO 3166-1 alpha-2 country codes to exclude from tracking (max 250) | |
| excludedHostnames | No | Hostnames to exclude from tracking (max 100) | |
| trackButtonClicks | No | Track button click events | |
| excludedUserAgents | No | User-agent substrings/patterns to exclude from tracking (max 100) | |
| trackSpaNavigation | No | Track SPA navigation events | |
| trackInitialPageView | No | Track initial page view automatically | |
| trackFormInteractions | No | Track form interaction events |
Output Schema
| Name | Required | Description |
|---|---|---|
| config | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=false), and the description's only added behavioral fact is that the target site must be existing. It does not disclose partial-update semantics (whether omitted fields are preserved or reset), required permissions, or the side effects noted in the schema (e.g. switching to mobile forcing sessionReplay/webVitals off).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence opens with the core action and then lists the configurable domains in parallel verb groups, so an agent can scan it quickly. It is slightly list-heavy but contains no filler or repetition.
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 25-parameter mutation tool with an output schema (so return values need no explanation) and annotations covering the safety profile, the description is adequate but leaves one important gap: whether the update is a partial patch or a full replace, which matters a great deal when most fields are optional. Auth/permission requirements are also unmentioned.
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 one of the 25 parameters is already documented in the schema, which sets the baseline at 3. The description groups fields into identity, tracking toggles, exclusions, and embedding, which is a mild navigational aid, but it adds no syntax, format, or interaction detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Update configuration for an existing Rybbit site') and enumerates the configuration domains touched, so an agent can immediately tell this is a mutation tool for an existing site rather than rybbit_create_site. It does not explicitly contrast itself with the sibling rybbit_get_config (read path) or rybbit_create_site, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for an existing Rybbit site' implies the precondition (the site must already exist) but the description never states when to reach for this tool over siblings like rybbit_create_site or rybbit_get_config, nor does it say when not to use it. Usage is implied rather than spelled out.
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.
43 tool updates
v0.8.1- Changed
rybbit_analyze_funnel2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "steps": { + "description": "Per-step counts and dropoffs", + "items": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "dropoff": { + "type": "number" + }, + "dropoffRate": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_create_funnel1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "string", + "number" + ] + }, + "name": { + "type": "string" + }, + "steps": { + "items": { + "additionalProperties": true, + "properties": { + "name": { + "type": "string" + }, + "type": { + "enum": [ + "page", + "event" + ], + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_create_goal1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "string", + "number" + ] + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
rybbit_create_site4 fields changed- changed
Input schema / properties / domain / descriptionPrevious value: -"Domain of the site (e.g. 'example.com') or package name for apps (e.g. 'com.example.app')"New value: +"Domain of the site (e.g. 'example.com') or package name for mobile apps (e.g. 'com.example.app')" - changed
Input schema / properties / type / descriptionPrevious value: -"Site type: 'web' for websites (default), 'app' for mobile apps"New value: +"Site type: 'web' for websites (default), 'mobile' for mobile apps. 'app' is a legacy alias mapped to 'mobile'." - changed
Input schema / properties / type / enumPrevious value: -[ - "web", - "app" -]New value: +[ + "web", + "mobile", + "app" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "domain": { + "type": "string" + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "organizationId": { + "type": [ + "string", + "number" + ] + }, + "siteId": { + "type": [ + "string", + "number" + ] + } + }, + "type": "object" +}
- Changed
rybbit_delete_funnel1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
rybbit_delete_goal1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "string", + "number" + ] + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
rybbit_delete_site1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "message": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "type": "object" +}
- Added
rybbit_describe_dimension - Changed
rybbit_get_config1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "disableSignup": { + "description": "Whether public signup is disabled", + "type": "boolean" + }, + "mapboxToken": { + "description": "Mapbox token (if configured)", + "type": "string" + }, + "version": { + "description": "Rybbit server version string", + "type": "string" + } + }, + "type": "object" +}
- Changed
rybbit_get_errors2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Error rows — shape depends on `type` input (names | events | timeseries)", + "items": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "stack": { + "type": "string" + }, + "time": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Added
rybbit_get_event_aggregate - Changed
rybbit_get_event_names2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "event_name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_event_properties2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "key": { + "type": "string" + }, + "value": { + "type": [ + "string", + "number", + "boolean" + ] + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_event_timeseries2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "time": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Added
rybbit_get_event_user_leaderboard - Changed
rybbit_get_funnel_step_sessions2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Sessions for the step", + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_goal_sessions2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Sessions that hit the goal", + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_journeys2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Journey paths with session counts", + "items": { + "additionalProperties": true, + "properties": { + "path": { + "items": { + "type": "string" + }, + "type": "array" + }, + "percentage": { + "type": "number" + }, + "sessions": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
rybbit_get_metric4 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Input schema / properties / parameter / descriptionPrevious value: -"Metric dimension to break down by. device_model and app_version apply only to app-type sites tracked via SDK."New value: +"Metric dimension to break down by. device_model and app_version apply only to mobile-type sites (legacy: app) tracked via SDK." - changed
Input schema / properties / parameter / enumPrevious value: -[ - "browser", - "browser_version", - "operating_system", - "operating_system_version", - "language", - "country", - "region", - "city", - "device_type", - "device_model", - "app_version", - "dimensions", - "referrer", - "hostname", - "pathname", - "page_title", - "querystring", - "event_name", - "channel", - "utm_source", - "utm_medium", - "utm_campaign", - "utm_term", - "utm_content", - "entry_page", - "exit_page", - "timezone", - "company", - "company_type", - "asn_org", - "asn_type" -]New value: +[ + "browser", + "browser_version", + "operating_system", + "operating_system_version", + "language", + "country", + "region", + "city", + "device_type", + "device_model", + "app_version", + "dimensions", + "referrer", + "hostname", + "pathname", + "page_title", + "querystring", + "event_name", + "channel", + "utm_source", + "utm_medium", + "utm_campaign", + "utm_term", + "utm_content", + "entry_page", + "exit_page", + "timezone" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Metric breakdown rows", + "items": { + "additionalProperties": true, + "properties": { + "bounceRate": { + "type": "number" + }, + "count": { + "type": "number" + }, + "percentage": { + "type": "number" + }, + "timeOnPage": { + "type": "number" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "totalCount": { + "description": "Total rows across all pages", + "type": "number" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
rybbit_get_outbound_links2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": true, + "properties": { + "clicks": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_overview2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "avgSessionDuration": { + "type": "number" + }, + "bounceRate": { + "type": "number" + }, + "pagesPerSession": { + "type": "number" + }, + "pageviews": { + "type": "number" + }, + "sessions": { + "type": "number" + }, + "users": { + "type": "number" + } + }, + "type": "object" +}
- Changed
rybbit_get_overview_timeseries2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Time-bucketed overview metrics", + "items": { + "additionalProperties": true, + "properties": { + "time": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
rybbit_get_page_titles2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": true, + "properties": { + "pageviews": { + "type": "number" + }, + "sessions": { + "type": "number" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_performance2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "cls_p50": { + "type": [ + "number", + "null" + ] + }, + "cls_p75": { + "type": [ + "number", + "null" + ] + }, + "cls_p90": { + "type": [ + "number", + "null" + ] + }, + "cls_p99": { + "type": [ + "number", + "null" + ] + }, + "data": { + "description": "Per-dimension rows when dimension!=overview", + "items": { + "additionalProperties": true, + "properties": { + "dimension": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "fcp_p50": { + "type": [ + "number", + "null" + ] + }, + "fcp_p75": { + "type": [ + "number", + "null" + ] + }, + "fcp_p90": { + "type": [ + "number", + "null" + ] + }, + "fcp_p99": { + "type": [ + "number", + "null" + ] + }, + "inp_p50": { + "type": [ + "number", + "null" + ] + }, + "inp_p75": { + "type": [ + "number", + "null" + ] + }, + "inp_p90": { + "type": [ + "number", + "null" + ] + }, + "inp_p99": { + "type": [ + "number", + "null" + ] + }, + "lcp_p50": { + "type": [ + "number", + "null" + ] + }, + "lcp_p75": { + "type": [ + "number", + "null" + ] + }, + "lcp_p90": { + "type": [ + "number", + "null" + ] + }, + "lcp_p99": { + "type": [ + "number", + "null" + ] + }, + "totalCount": { + "description": "Total rows across all pages", + "type": "number" + }, + "ttfb_p50": { + "type": [ + "number", + "null" + ] + }, + "ttfb_p75": { + "type": [ + "number", + "null" + ] + }, + "ttfb_p90": { + "type": [ + "number", + "null" + ] + }, + "ttfb_p99": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" +}
- Changed
rybbit_get_performance_timeseries2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Time-bucketed performance metrics", + "items": { + "additionalProperties": true, + "properties": { + "bucket": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
rybbit_get_retention2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Retention cohorts; periods are percentages per period, null = period not reached yet", + "items": { + "additionalProperties": true, + "properties": { + "cohort": { + "type": "string" + }, + "periods": { + "items": { + "type": [ + "number", + "null" + ] + }, + "type": "array" + }, + "size": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "mode": {} + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
rybbit_get_session1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "browser": { + "type": "string" + }, + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "device": { + "type": "string" + }, + "events": { + "items": {}, + "type": "array" + }, + "os": { + "type": "string" + }, + "region": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "traits": { + "additionalProperties": {}, + "type": "object" + }, + "userId": { + "type": "string" + } + }, + "type": "object" +}
- Changed
rybbit_get_session_locations2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Geographic session locations", + "items": { + "additionalProperties": true, + "properties": { + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "lat": { + "type": "number" + }, + "lon": { + "type": "number" + }, + "sessions": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_site_id1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "matches": { + "description": "Matching sites", + "items": { + "additionalProperties": false, + "properties": { + "domain": { + "type": "string" + }, + "name": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "siteId": { + "type": [ + "string", + "number" + ] + } + }, + "required": [ + "siteId", + "domain", + "name", + "organization" + ], + "type": "object" + }, + "type": "array" + }, + "message": { + "description": "Diagnostic message when no match", + "type": "string" + } + }, + "type": "object" +}
- Changed
rybbit_get_user1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "User detail payload" + } + }, + "type": "object" +}
- Changed
rybbit_get_user_event_breakdown2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "event_name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_user_session_count1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "items": { + "additionalProperties": true, + "properties": { + "date": { + "type": "string" + }, + "sessions": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_get_user_traits1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": {}, + "keys": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "key": { + "type": "string" + }, + "userCount": { + "type": "number" + } + }, + "type": "object" + } + ] + }, + "type": "array" + }, + "values": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_list_events4 fields changed- added
Input schema / properties / afterTimestampAdded value: +{ + "description": "Return events strictly newer than this timestamp (UTC). Mirrors beforeTimestamp for forward pagination.", + "type": "string" +} - added
Input schema / properties / beforeTimestampAdded value: +{ + "description": "Return events strictly older than this timestamp (UTC 'YYYY-MM-DD HH:mm:ss'). Use cursor.oldestTimestamp from previous page.", + "type": "string" +} - changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "cursor": { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": "boolean" + }, + "oldestTimestamp": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "hasMore", + "oldestTimestamp" + ], + "type": "object" + }, + "data": { + "items": { + "additionalProperties": true, + "properties": { + "event_name": { + "type": "string" + }, + "properties": { + "description": "Raw JSON-encoded property bag", + "type": "string" + }, + "properties_parsed": { + "additionalProperties": {}, + "description": "Same as `properties`, parsed into an object (added by MCP wrapper)", + "type": "object" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_list_funnels1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Saved funnels", + "items": { + "additionalProperties": true, + "properties": { + "id": { + "type": [ + "string", + "number" + ] + }, + "name": { + "type": "string" + }, + "steps": { + "items": { + "additionalProperties": true, + "properties": { + "name": { + "type": "string" + }, + "type": { + "enum": [ + "page", + "event" + ], + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
rybbit_list_goals2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Goals with conversion metrics", + "items": { + "additionalProperties": true, + "properties": { + "conversionRate": { + "type": "number" + }, + "conversions": { + "type": "number" + }, + "id": { + "type": [ + "string", + "number" + ] + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
rybbit_list_sessions2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Sessions", + "items": { + "additionalProperties": true, + "properties": { + "bounced": { + "type": "boolean" + }, + "city": { + "type": "string" + }, + "country": { + "type": "string" + }, + "device": { + "type": "string" + }, + "duration": { + "type": "number" + }, + "pagesVisited": { + "type": "number" + }, + "sessionId": { + "type": "string" + }, + "userId": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "filteredBy": { + "description": "Client-side filter applied (e.g. ip=...)", + "type": "string" + }, + "scannedPages": { + "description": "Pages scanned when filtering client-side", + "type": "number" + } + }, + "type": "object" +}
- Changed
rybbit_list_sites1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "Organizations with nested sites", + "items": { + "additionalProperties": true, + "properties": { + "id": { + "type": [ + "string", + "number" + ] + }, + "name": { + "type": "string" + }, + "sites": { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "id": { + "type": [ + "string", + "number" + ] + }, + "name": { + "type": "string" + }, + "organizationId": { + "type": [ + "string", + "number" + ] + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
rybbit_list_users2 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for mobile-type sites (legacy: app) tracked via SDK." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "User rows", + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
rybbit_live_users1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "liveUsers": { + "description": "Current live/active user count (normalized from upstream {count} envelope)", + "type": "number" + } + }, + "required": [ + "liveUsers" + ], + "type": "object" +}
- Changed
rybbit_site_has_data1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasData": { + "description": "Whether the site has received any tracking events", + "type": "boolean" + } + }, + "required": [ + "hasData" + ], + "type": "object" +}
- Changed
rybbit_update_goal1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "type": [ + "string", + "number" + ] + }, + "message": { + "type": "string" + }, + "name": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
rybbit_update_site_config7 fields changed- changed
Input schema / properties / domain / descriptionPrevious value: -"Domain (web sites) or package name (app sites). Normalized server-side."New value: +"Domain (web sites) or package name (mobile sites). Normalized server-side." - added
Input schema / properties / embedEnabledAdded value: +{ + "description": "Allow embedding public stats (e.g. via iframe)", + "type": "boolean" +} - added
Input schema / properties / excludedHostnamesAdded value: +{ + "description": "Hostnames to exclude from tracking (max 100)", + "items": { + "maxLength": 253, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" +} - added
Input schema / properties / excludedPathsAdded value: +{ + "description": "URL path patterns to exclude from tracking (max 100)", + "items": { + "maxLength": 2048, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" +} - added
Input schema / properties / excludedUserAgentsAdded value: +{ + "description": "User-agent substrings/patterns to exclude from tracking (max 100)", + "items": { + "maxLength": 512, + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" +} - added
Input schema / properties / typeAdded value: +{ + "description": "Site type: 'web' or 'mobile'. 'app' is a legacy alias mapped to 'mobile'. Switching to mobile forces sessionReplay and webVitals off.", + "enum": [ + "web", + "mobile", + "app" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "type": "object" + }, + "success": { + "type": "boolean" + } + }, + "type": "object" +}
6 tool updates
v0.5.1- Added
rybbit_create_goal - Added
rybbit_delete_goal - Added
rybbit_get_goal_sessions - Added
rybbit_get_journeys - Added
rybbit_list_goals - Added
rybbit_update_goal
1 tool update
- Removed
rybbit_list_goals
5 tool updates
- Removed
rybbit_create_goal - Removed
rybbit_delete_goal - Removed
rybbit_get_goal_sessions - Removed
rybbit_get_journeys - Removed
rybbit_update_goal
1 tool update
v0.3.3- Added
rybbit_get_journeys
1 tool update
- Removed
rybbit_get_journeys
30 tool updates
v0.4.3- Changed
rybbit_analyze_funnel1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Added
rybbit_create_funnel - Added
rybbit_create_goal - Added
rybbit_delete_funnel - Added
rybbit_delete_goal - Changed
rybbit_get_errors1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_event_names1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_event_properties1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_event_timeseries1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_funnel_step_sessions1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_goal_sessions1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_journeys1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_metric3 fields changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK." - changed
Input schema / properties / parameter / descriptionPrevious value: -"Metric dimension to break down by"New value: +"Metric dimension to break down by. device_model and app_version apply only to app-type sites tracked via SDK." - changed
Input schema / properties / parameter / enumPrevious value: -[ - "browser", - "operating_system", - "language", - "country", - "region", - "city", - "device_type", - "referrer", - "hostname", - "pathname", - "page_title", - "querystring", - "event_name", - "channel", - "utm_source", - "utm_medium", - "utm_campaign", - "utm_term", - "utm_content", - "entry_page", - "exit_page" -]New value: +[ + "browser", + "browser_version", + "operating_system", + "operating_system_version", + "language", + "country", + "region", + "city", + "device_type", + "device_model", + "app_version", + "dimensions", + "referrer", + "hostname", + "pathname", + "page_title", + "querystring", + "event_name", + "channel", + "utm_source", + "utm_medium", + "utm_campaign", + "utm_term", + "utm_content", + "entry_page", + "exit_page", + "timezone", + "company", + "company_type", + "asn_org", + "asn_type" +]
- Changed
rybbit_get_outbound_links1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_overview1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_overview_timeseries1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Added
rybbit_get_page_titles - Changed
rybbit_get_performance1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_performance_timeseries1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_retention1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_session_locations1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_get_user_event_breakdown1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Added
rybbit_get_user_session_count - Changed
rybbit_list_events1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_list_goals1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_list_sessions1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Changed
rybbit_list_users1 field changed- changed
Input schema / properties / filters / items / properties / parameter / descriptionPrevious value: -"Filter dimension: browser, operating_system, language, country, region, city, device_type, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id. Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id)."New value: +"Filter dimension. One of: browser, browser_version, operating_system, operating_system_version, language, country, region, city, device_type, device_model, app_version, dimensions, referrer, hostname, pathname, page_title, querystring, event_name, channel, utm_source, utm_medium, utm_campaign, utm_term, utm_content, entry_page, exit_page, user_id, lat, lon, timezone, vpn, crawler, datacenter, company, company_type, company_domain, asn_org, asn_type, asn_domain, tag. Custom URL parameters use the prefix 'url_param:NAME' (e.g., 'url_param:campaign_id'). Note: user_id filter checks BOTH the device hash (user_id) and app-provided ID (identified_user_id). device_model and app_version are populated only for app-type sites tracked via SDK."
- Added
rybbit_site_has_data - Added
rybbit_update_goal - Changed
rybbit_update_site_config5 fields changed- added
Input schema / properties / domainAdded value: +{ + "description": "Domain (web sites) or package name (app sites). Normalized server-side.", + "maxLength": 253, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / excludedCountriesAdded value: +{ + "description": "ISO 3166-1 alpha-2 country codes to exclude from tracking (max 250)", + "items": { + "maxLength": 2, + "minLength": 2, + "pattern": "^[A-Z]{2}$", + "type": "string" + }, + "maxItems": 250, + "type": "array" +} - added
Input schema / properties / excludedIPsAdded value: +{ + "description": "IP addresses or CIDR ranges to exclude from tracking (max 100)", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "type": "array" +} - added
Input schema / properties / nameAdded value: +{ + "description": "Display name for the site", + "maxLength": 255, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / tagsAdded value: +{ + "description": "Tags for grouping/filtering sites (max 20, each up to 50 chars)", + "items": { + "maxLength": 50, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "type": "array" +}
32 tool updates
v0.5.2- First observed
rybbit_analyze_funnel - First observed
rybbit_create_site - First observed
rybbit_delete_site - First observed
rybbit_get_config - First observed
rybbit_get_errors - First observed
rybbit_get_event_names - First observed
rybbit_get_event_properties - First observed
rybbit_get_event_timeseries - First observed
rybbit_get_funnel_step_sessions - First observed
rybbit_get_goal_sessions - First observed
rybbit_get_journeys - First observed
rybbit_get_metric - First observed
rybbit_get_outbound_links - First observed
rybbit_get_overview - First observed
rybbit_get_overview_timeseries - First observed
rybbit_get_performance - First observed
rybbit_get_performance_timeseries - First observed
rybbit_get_retention - First observed
rybbit_get_session - First observed
rybbit_get_session_locations - First observed
rybbit_get_site_id - First observed
rybbit_get_user - First observed
rybbit_get_user_event_breakdown - First observed
rybbit_get_user_traits - First observed
rybbit_list_events - First observed
rybbit_list_funnels - First observed
rybbit_list_goals - First observed
rybbit_list_sessions - First observed
rybbit_list_sites - First observed
rybbit_list_users - First observed
rybbit_live_users - First observed
rybbit_update_site_config
TDQS
Scored across 43 tools
Most tools target a clearly distinct resource and action, and descriptions explicitly clarify overlaps like rybbit_get_metric vs rybbit_get_page_titles or rybbit_get_event_aggregate vs rybbit_get_event_user_leaderboard. A few event- and user-oriented tools could still be confused at a glance, but the set is generally well separated.
All tools use the rybbit_ prefix with snake_case naming, and most follow a clear verb_noun pattern such as rybbit_list_users, rybbit_get_event_properties, and rybbit_create_funnel. Minor deviations like rybbit_site_has_data and rybbit_live_users are descriptive but not strictly verb_noun.
With 43 tools, the server is far above the 15-tool comfortable range for an MCP tool set. While the analytics domain is broad, many separate query endpoints could likely be consolidated or grouped, making this feel heavy for routine agent use.
The surface covers core analytics workflows well: site management, sessions, users, events, goals, funnels, performance, errors, and configuration. Some peripheral capabilities like annotations, dashboards, alerting, or user administration are absent, but the primary analytics lifecycle is substantially covered.
Maintenance
Related MCP Connectors
Read-only analytics for Convex apps, queryable via MCP from Claude, Cursor, and other clients.
Query your Betterlytics web analytics from AI agents: traffic, funnels, journeys, errors, uptime.
Analytics for MCP servers. Query your tool calls, first-call success, retries and schema cost.
Real-time web analytics for AI agents: query traffic, funnels, revenue, and manage your sites.
Related MCP Servers
- AlicenseAqualityBmaintenanceConnects Google Analytics 4 data to Claude, Cursor and other MCP clients, enabling natural language queries of website traffic, user behavior, and analytics data with access to 200+ GA4 dimensions and metrics.101,637 PyPI242MIT
- AlicenseAqualityCmaintenanceExposes analytics from Claude Code transcripts as MCP tools, enabling cost, audit, safety, and efficiency queries through natural language.4MIT
- AlicenseAqualityBmaintenanceConnects MCP clients like Claude Desktop to Google Analytics 4 Data API, enabling natural language queries for reports, top pages, traffic sources, conversions, realtime users, and period comparisons.720 PyPIMIT
- AlicenseAqualityDmaintenanceExposes Rybbit Analytics as MCP tools for querying site traffic, page views, visitor sessions, and live visitor counts through natural language.9270 npmMIT