Skip to main content
Glama
nks-hub

rybbit-mcp

by nks-hub

@nks-hub/rybbit-mcp

Build Status npm version Node.js TypeScript MCP SDK License: MIT

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 - page and limit parameters 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_sites for valid IDs

Related MCP server: agentops-mcp

Requirements

  • Node.js: 18+

  • Rybbit Analytics: Self-hosted or cloud instance

Installation

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-mcp

From source

For development or contributing:

git clone https://github.com/nks-hub/rybbit-mcp.git
cd rybbit-mcp
npm install && npm run build

Then 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

RYBBIT_API_KEY

Recommended for production

Email/password

RYBBIT_EMAIL, RYBBIT_PASSWORD

Development/testing

Both require RYBBIT_URL pointing to your Rybbit instance.

Tools (32)

Configuration and site management

Tool

Description

rybbit_get_config

Get server version and configuration

rybbit_list_sites

List all sites and organizations

rybbit_create_site

Create a new site (type: web or mobile; legacy alias app maps to mobile; mobile sites have bot filtering turned off)

rybbit_delete_site

Delete a site permanently

rybbit_get_site_id

Look up site ID by domain name

rybbit_update_site_config

Update site tracking config (IP, errors, replay, etc.)

Real-time and overview

Tool

Description

rybbit_live_users

Current active users count

rybbit_get_overview

Aggregated metrics (sessions, pageviews, users, bounce rate, duration)

rybbit_get_overview_timeseries

Metrics as time-series with configurable buckets

rybbit_get_session_locations

Geographic session data with coordinates for map visualization

Metrics and dimensions

Tool

Description

rybbit_get_metric

Breakdown by dimension (browser, OS, country, page, UTM, etc.)

rybbit_get_retention

User retention cohort analysis

Sessions

Tool

Description

rybbit_list_sessions

Session list with filtering by IP, identified users, min duration, and pagination

rybbit_get_session

Full session detail with events and user traits

Users

Tool

Description

rybbit_list_users

Users with search, sort (first/last seen, pageviews, sessions, duration), and identified-only filter

rybbit_get_user

User detail with traits and activity

rybbit_get_user_traits

Trait keys, values, or find users by trait

rybbit_get_user_event_breakdown

Per-user event count breakdown

Events

Tool

Description

rybbit_list_events

Raw event records with filtering

rybbit_get_event_names

Custom event names and counts

rybbit_get_event_properties

Property breakdowns per event

rybbit_get_event_timeseries

Event count trends over time with configurable buckets

rybbit_get_outbound_links

Outbound link clicks with URLs and counts

Errors

Tool

Description

rybbit_get_errors

Error types/counts, individual instances, or timeseries for a specific error

Performance (Web Vitals)

Tool

Description

rybbit_get_performance

Core Web Vitals (LCP, CLS, INP, FCP, TTFB) with percentiles

rybbit_get_performance_timeseries

Web Vitals trends over time

Funnels and goals

Tool

Description

rybbit_list_funnels

Saved funnels with step definitions

rybbit_analyze_funnel

Ad-hoc funnel analysis with custom steps

rybbit_get_funnel_step_sessions

Sessions that reached or dropped off at a funnel step

rybbit_list_goals

Goals with conversion metrics

rybbit_get_goal_sessions

Sessions that completed a specific goal

Journeys

Tool

Description

rybbit_get_journeys

User navigation path analysis

Common parameters

All analytics tools support these optional parameters:

Parameter

Type

Description

siteId

string

Site identifier (required)

startDate

string

Start date YYYY-MM-DD

endDate

string

End date YYYY-MM-DD

timeZone

string

IANA timezone (e.g., Europe/Prague)

filters

array

Filter array [{parameter, type, value[]}]

pastMinutesStart

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

Development

# Install dependencies
npm install

# Build
npm run build

# Watch mode
npm run dev

# Type checking
npx tsc --noEmit

Contributing

Contributions are welcome! For major changes, please open an issue first.

  1. Fork the repository

  2. Create your feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'feat: description')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

Support

License

MIT License — see LICENSE for details.


Available Tools

43 tools
rybbit_analyze_funnelAnalyze FunnelB
Read-onlyIdempotent

Analyze a custom funnel by defining steps (page visits or events). Returns visitor counts and drop-off rates at each step.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsYesFunnel steps to analyze (minimum 2)
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date (YYYY-MM-DD)
filtersNoFilters to apply
timeZoneNoIANA timezone (default UTC)
startDateNoStart date (YYYY-MM-DD)
pastMinutesEndNoMinutes ago end
pastMinutesStartNoMinutes ago start

Output Schema

ParametersJSON Schema
NameRequiredDescription
stepsNoPer-step counts and dropoffs

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFunnel display name
stepsYesFunnel steps in order (minimum 2)
siteIdYesSite ID (numeric ID or domain identifier)
reportIdNoOptional existing funnel report ID to overwrite (instead of creating a new one)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
stepsNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return values need not be explained, 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose4/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional display name for the goal
configYesGoal configuration. Use pathPattern for path goals or eventName for event goals.
siteIdYesSite ID (numeric ID or domain identifier)
goalTypeYes'path' = URL pattern, 'event' = custom event

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
messageNo
successNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name for the site (defaults to domain)
typeNoSite type: 'web' for websites (default), 'mobile' for mobile apps. 'app' is a legacy alias mapped to 'mobile'.
domainYesDomain of the site (e.g. 'example.com') or package name for mobile apps (e.g. 'com.example.app')
organizationIdYesOrganization ID to add the site to. Use rybbit_list_sites to find organization IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
domainNo
siteIdNo
messageNo
organizationIdNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 FunnelB
DestructiveIdempotent

Permanently delete a saved funnel. This action cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
funnelIdYesFunnel ID to delete (from rybbit_list_funnels)

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageNo
successNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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

An output schema exists so return values need not be described, 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 GoalB
DestructiveIdempotent

Permanently delete a goal. This action cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalIdYesNumeric goal ID to delete
siteIdYesSite ID (numeric ID or domain identifier)

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
messageNo
successNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 SiteA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageNo
successNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DimensionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
parameterYesDimension name to describe (e.g. 'event_name', 'user_id', 'pathname'). Case-sensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
examplesYes
parameterYes
valueHintYes
strippedInYesTools that silently strip this filter due to upstream bugs. Use alternatives noted in reason.
descriptionYes
supportedInYes
knownDimensionsNoReturned only when parameter is unknown — lists all documented dimensions.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists so return values need 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ConfigA
Read-onlyIdempotent

Get Rybbit server version and configuration

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
versionNoRybbit server version string
mapboxTokenNoMapbox token (if configured)
disableSignupNoWhether public signup is disabled

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so 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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 TrackingA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, 1-indexed (default: 1)
typeNo'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
limitNoResults per page (default: 20-50 depending on endpoint, max 200)
bucketNoTime bucket for timeseries type (default: day)
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
errorMessageNoError message filter (required for type='events' and type='timeseries'). Use type='names' first to discover error messages.
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoError rows — shape depends on `type` input (names | events | timeseries)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AggregateA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNNoReturn only the top N groups by count (default 50).
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
groupByYesOne 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').
maxScanNoMaximum events to scan from the backend (default 5000).
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
eventNameNoOptional exact event_name to filter for (e.g., 'pm_sent').
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
propertyFiltersNoFilters applied to parsed event properties after fetch.
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
groupsYesGrouped event counts, sorted by count DESC by default
hasMoreYesTrue if scan was capped by maxScan and more data exists
scannedYesTotal events scanned across pagination
hitCountYesEvents matching eventName / property filters
windowEndNo
windowStartNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 NamesA
Read-onlyIdempotent

Get all custom event names and their occurrence counts for a site. Useful for discovering what events are being tracked.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

An output schema exists so return 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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 PropertiesB
Read-onlyIdempotent

Get property breakdowns for a specific custom event. Returns the distinct property keys and values with counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
eventNameYesEvent name to get properties for
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 SeriesB
Read-onlyIdempotent

Get custom event counts as time-series data with configurable buckets. Useful for analyzing event trends over time.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketNoTime bucket granularity (default: day). Use 'hour' for last 24h, 'week'/'month' for long ranges
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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

An output schema exists, so return values need not be explained, 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 LeaderboardA
Read-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ů'.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNNoTop N users (default 25).
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
maxScanNoMaximum events to scan (default 5000).
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
eventNameYesEvent name to rank users by (e.g. 'pm_sent', 'chat_v2_message_sent', 'ad_click').
startDateNoStart date in ISO format (YYYY-MM-DD)
identifiedOnlyNoIf true (default), exclude anonymous users without identified_user_id.
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
groupsYesGrouped event counts, sorted by count DESC by default
hasMoreYesTrue if scan was capped by maxScan and more data exists
scannedYesTotal events scanned across pagination
hitCountYesEvents matching eventName / property filters
windowEndNo
windowStartNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

An output schema exists, so return-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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 SessionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes'reached' = sessions that made it to this step, 'dropped' = sessions that dropped off at this step
pageNoPage number, 1-indexed (default: 1)
limitNoResults per page (default: 20-50 depending on endpoint, max 200)
stepsYesThe funnel steps definition (same as used in rybbit_analyze_funnel)
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date (YYYY-MM-DD)
filtersNoFilters to apply
timeZoneNoIANA timezone (default UTC)
startDateNoStart date (YYYY-MM-DD)
stepNumberYesThe funnel step number to get sessions for (1-indexed)
pastMinutesEndNoMinutes ago end
pastMinutesStartNoMinutes ago start

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoSessions for the step

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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

An output schema exists, so return values need not be described. 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 SessionsA
Read-onlyIdempotent

Get sessions that completed a specific goal. Useful for analyzing which users and sessions triggered goal conversions.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, 1-indexed (default: 1)
limitNoResults per page (default: 20-50 depending on endpoint, max 200)
goalIdYesGoal ID to get sessions for. Use rybbit_list_goals to find goal IDs.
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date (YYYY-MM-DD)
filtersNoFilters to apply
timeZoneNoIANA timezone (default UTC)
startDateNoStart date (YYYY-MM-DD)
pastMinutesEndNoMinutes ago end
pastMinutesStartNoMinutes ago start

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoSessions that hit the goal

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

An output schema exists, so return-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.

Parameters3/5

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

Schema description coverage is 100%, so the schema 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.

Purpose4/5

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.

Usage Guidelines3/5

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 JourneysB
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsNoNumber of journey steps to analyze (default 3)
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date (YYYY-MM-DD)
filtersNoFilters to apply
timeZoneNoIANA timezone (default UTC)
startDateNoStart date (YYYY-MM-DD)
journeyLimitNoMax number of journey paths to return (default 100)
pastMinutesEndNoMinutes ago end
pastMinutesStartNoMinutes ago start

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesJourney paths with session counts

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 BreakdownA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, 1-indexed (default: 1)
limitNoResults per page (default: 20-50 depending on endpoint, max 200)
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
parameterYesMetric dimension to break down by. device_model and app_version apply only to mobile-type sites (legacy: app) tracked via SDK.
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesMetric breakdown rows
totalCountNoTotal rows across all pages

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the schema already 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.

Purpose5/5

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.

Usage Guidelines4/5

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_overviewSite OverviewB
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
usersNo
sessionsNo
pageviewsNo
bounceRateNo
pagesPerSessionNo
avgSessionDurationNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

With an output schema present 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 SeriesB
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketNoTime bucket granularity (default: day). Use 'hour' for last 24h, 'week'/'month' for long ranges
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesTime-bucketed overview metrics

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose4/5

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

The description states a specific verb and resource: 'Get 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.

Usage Guidelines2/5

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 TitlesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource ('Get 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.

Usage Guidelines4/5

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 VitalsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
dimensionNoBreak down performance by dimension. Default: overview (aggregated)
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoPer-dimension rows when dimension!=overview
cls_p50No
cls_p75No
cls_p90No
cls_p99No
fcp_p50No
fcp_p75No
fcp_p90No
fcp_p99No
inp_p50No
inp_p75No
inp_p90No
inp_p99No
lcp_p50No
lcp_p75No
lcp_p90No
lcp_p99No
ttfb_p50No
ttfb_p75No
ttfb_p90No
ttfb_p99No
totalCountNoTotal rows across all pages

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

With an output schema present, the description need not explain return values, 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 SeriesA
Read-onlyIdempotent

Get Core Web Vitals performance metrics as time-series data for trend analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketNoTime bucket granularity (default: day). Use 'hour' for last 24h, 'week'/'month' for long ranges
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesTime-bucketed performance metrics

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose4/5

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.

Usage Guidelines3/5

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 RetentionB
Read-onlyIdempotent

Get user retention cohort analysis showing how many users return over time periods.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesRetention cohorts; periods are percentages per period, null = period not reached yet
modeNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return-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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 DetailA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
sessionIdYesSession ID to retrieve

Output Schema

ParametersJSON Schema
NameRequiredDescription
osNo
cityNo
deviceNo
eventsNo
regionNo
traitsNo
userIdNo
browserNo
countryNo
sessionIdNo

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 LocationsA
Read-onlyIdempotent

Get geographic session location data with coordinates. Returns latitude, longitude, city, country, and session count for map visualization and geographic analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, 1-indexed (default: 1)
limitNoResults per page (default: 20-50 depending on endpoint, max 200)
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoGeographic session locations

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

With an output schema present, 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 DomainA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesDomain to search for (e.g. 'example.com'). Partial match supported.

Output Schema

ParametersJSON Schema
NameRequiredDescription
matchesNoMatching sites
messageNoDiagnostic message when no match

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 DetailB
Read-onlyIdempotent

Get detailed information about a specific user including their traits, session history, and activity summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
userIdYesUser ID (identified_user_id or internal user ID)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoUser detail payload

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 BreakdownA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
userIdYesUser ID — either Rybbit device hash (user_id) or app-provided ID (identified_user_id). Both are checked.
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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

An output schema exists, so return values need not be explained, 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose4/5

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.

Usage Guidelines3/5

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 CountA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
userIdYesUser ID — either identified_user_id or device hash user_id
endDateNoEnd date (YYYY-MM-DD)
timeZoneNoIANA timezone (default UTC)
startDateNoStart date (YYYY-MM-DD)
pastMinutesEndNo
pastMinutesStartNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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

An output schema exists, so return-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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 TraitsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoTrait key (required for 'values' and 'users' modes)
modeNo'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.
limitNoMax results to return
valueNoTrait value (required for 'users' mode)
siteIdYesSite ID (numeric ID or domain identifier)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
keysNo
valuesNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return-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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 EventsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, 1-indexed (default: 1)
limitNoResults per page (default: 20-50 depending on endpoint, max 200)
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
eventNameNoFilter to only return events with this exact event_name (e.g., 'ad_click'). More precise than using the filters array which returns entire sessions.
startDateNoStart date in ISO format (YYYY-MM-DD)
afterTimestampNoReturn events strictly newer than this timestamp (UTC). Mirrors beforeTimestamp for forward pagination.
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
beforeTimestampNoReturn events strictly older than this timestamp (UTC 'YYYY-MM-DD HH:mm:ss'). Use cursor.oldestTimestamp from previous page.
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
cursorNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return values 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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description 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.

Purpose4/5

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.

Usage Guidelines3/5

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 FunnelsA
Read-onlyIdempotent

List all saved funnels for a site with their step definitions.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesSaved funnels

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

An output schema exists, so return-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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 GoalsB
Read-onlyIdempotent

List all goals for a site with their current conversion metrics and configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date (YYYY-MM-DD)
filtersNoFilters to apply
timeZoneNoIANA timezone (default UTC)
startDateNoStart date (YYYY-MM-DD)
pastMinutesEndNoMinutes ago end
pastMinutesStartNoMinutes ago start

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesGoals with conversion metrics

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 SessionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNoFilter sessions by IP address (exact or partial match, client-side). Requires site to have trackIp enabled.
pageNoPage number, 1-indexed (default: 1)
limitNoResults per page (default: 20-50 depending on endpoint, max 200)
siteIdYesSite ID (numeric ID or domain identifier)
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
startDateNoStart date in ISO format (YYYY-MM-DD)
minDurationNoMinimum session duration in seconds.
identifiedOnlyNoOnly return sessions from identified users. Default: false.
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoSessions
filteredByNoClient-side filter applied (e.g. ip=...)
scannedPagesNoPages scanned when filtering client-side

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema present, the description needn't document return values 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose4/5

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.

Usage Guidelines3/5

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 SitesA
Read-onlyIdempotent

List all sites and organizations the authenticated user has access to

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesOrganizations with nested sites

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

With an output schema present, 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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 UsersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, 1-indexed (default: 1)
limitNoResults per page (default: 20-50 depending on endpoint, max 200)
searchNoSearch users by trait value (e.g. username, email). Uses case-insensitive partial matching (ILIKE).
siteIdYesSite ID (numeric ID or domain identifier)
sortByNoSort field (default: 'last_seen'). 'duration' sorts by total time spent (aggregated from sessions, requires date range).
endDateNoEnd date in ISO format (YYYY-MM-DD)
filtersNoArray of filters. Example: [{parameter:'browser',type:'equals',value:['Chrome']},{parameter:'country',type:'equals',value:['US','DE']}]
timeZoneNoIANA timezone (e.g., Europe/Prague). Default: UTC
sortOrderNoSort direction (default: 'desc')
startDateNoStart date in ISO format (YYYY-MM-DD)
searchFieldNoWhich field to search in (default: 'username'). Only used when 'search' is provided.
identifiedOnlyNoOnly return identified users (users with identified_user_id). Default: false.
pastMinutesEndNoAlternative to dates: minutes ago end (default 0 = now)
pastMinutesStartNoAlternative to dates: minutes ago start (e.g., 60 = last hour)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNoUser rows

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description states a specific verb and resource ('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.

Usage Guidelines5/5

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 CountA
Read-onlyIdempotent

Get the current number of live/active users on a site in real-time

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)

Output Schema

ParametersJSON Schema
NameRequiredDescription
liveUsersYesCurrent live/active user count (normalized from upstream {count} envelope)

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 DataA
Read-onlyIdempotent

Check whether a site has received any tracking events yet. Useful for verifying SDK integration before drilling into analytics.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteIdYesSite ID (numeric ID or domain identifier)

Output Schema

ParametersJSON Schema
NameRequiredDescription
hasDataYesWhether the site has received any tracking events

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 GoalC
Idempotent

Update an existing goal's name, type, or configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
configYesGoal configuration. Use pathPattern for path goals or eventName for event goals.
goalIdYesNumeric goal ID to update
siteIdYesSite ID (numeric ID or domain identifier)
goalTypeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
messageNo
successNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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

The description states a specific verb and resource ('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.

Usage Guidelines2/5

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 ConfigB
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name for the site
tagsNoTags for grouping/filtering sites (max 20, each up to 50 chars)
typeNoSite type: 'web' or 'mobile'. 'app' is a legacy alias mapped to 'mobile'. Switching to mobile forces sessionReplay and webVitals off.
domainNoDomain (web sites) or package name (mobile sites). Normalized server-side.
publicNoMake site stats publicly accessible
siteIdYesSite ID (numeric ID or domain identifier)
trackIpNoTrack visitor IP addresses
blockBotsNoBlock known bots from tracking
trackCopyNoTrack text copy events
webVitalsNoTrack Core Web Vitals metrics
excludedIPsNoIP addresses or CIDR ranges to exclude from tracking (max 100)
saltUserIdsNoSalt user IDs for privacy
trackErrorsNoTrack JavaScript errors
embedEnabledNoAllow embedding public stats (e.g. via iframe)
excludedPathsNoURL path patterns to exclude from tracking (max 100)
sessionReplayNoEnable session replay recording
trackOutboundNoTrack outbound link clicks
trackUrlParamsNoTrack URL parameters
excludedCountriesNoISO 3166-1 alpha-2 country codes to exclude from tracking (max 250)
excludedHostnamesNoHostnames to exclude from tracking (max 100)
trackButtonClicksNoTrack button click events
excludedUserAgentsNoUser-agent substrings/patterns to exclude from tracking (max 100)
trackSpaNavigationNoTrack SPA navigation events
trackInitialPageViewNoTrack initial page view automatically
trackFormInteractionsNoTrack form interaction events

Output Schema

ParametersJSON Schema
NameRequiredDescription
configNo
successNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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

The description states a specific verb and resource ('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.

Usage Guidelines3/5

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.

  1. 43 tool updatesv0.8.1
    • Changedrybbit_analyze_funnel2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_create_funnel1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_create_goal1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_create_site4 fields changed
      • changedInput schema / properties / domain / description
        Previous 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')"
      • changedInput schema / properties / type / description
        Previous 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'."
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "web",
        -  "app"
        -]New value: +[
        +  "web",
        +  "mobile",
        +  "app"
        +]
      • changedOutput 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"
        +}
    • Changedrybbit_delete_funnel1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_delete_goal1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_delete_site1 field changed
      • changedOutput 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"
        +}
    • Addedrybbit_describe_dimension
    • Changedrybbit_get_config1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_get_errors2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Addedrybbit_get_event_aggregate
    • Changedrybbit_get_event_names2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_event_properties2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_event_timeseries2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Addedrybbit_get_event_user_leaderboard
    • Changedrybbit_get_funnel_step_sessions2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_goal_sessions2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_journeys2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_metric4 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedInput schema / properties / parameter / description
        Previous 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."
      • changedInput schema / properties / parameter / enum
        Previous 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"
        +]
      • changedOutput 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"
        +}
    • Changedrybbit_get_outbound_links2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_overview2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_overview_timeseries2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_page_titles2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_performance2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_performance_timeseries2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_retention2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_session1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_get_session_locations2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_site_id1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_get_user1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "description": "User detail payload"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedrybbit_get_user_event_breakdown2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_get_user_session_count1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_get_user_traits1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_list_events4 fields changed
      • addedInput schema / properties / afterTimestamp
        Added value: +{
        +  "description": "Return events strictly newer than this timestamp (UTC). Mirrors beforeTimestamp for forward pagination.",
        +  "type": "string"
        +}
      • addedInput schema / properties / beforeTimestamp
        Added value: +{
        +  "description": "Return events strictly older than this timestamp (UTC 'YYYY-MM-DD HH:mm:ss'). Use cursor.oldestTimestamp from previous page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_list_funnels1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_list_goals2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_list_sessions2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_list_sites1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_list_users2 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedrybbit_live_users1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_site_has_data1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_update_goal1 field changed
      • changedOutput 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"
        +}
    • Changedrybbit_update_site_config7 fields changed
      • changedInput schema / properties / domain / description
        Previous 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."
      • addedInput schema / properties / embedEnabled
        Added value: +{
        +  "description": "Allow embedding public stats (e.g. via iframe)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / excludedHostnames
        Added value: +{
        +  "description": "Hostnames to exclude from tracking (max 100)",
        +  "items": {
        +    "maxLength": 253,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
      • addedInput schema / properties / excludedPaths
        Added value: +{
        +  "description": "URL path patterns to exclude from tracking (max 100)",
        +  "items": {
        +    "maxLength": 2048,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
      • addedInput schema / properties / excludedUserAgents
        Added value: +{
        +  "description": "User-agent substrings/patterns to exclude from tracking (max 100)",
        +  "items": {
        +    "maxLength": 512,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
      • addedInput schema / properties / type
        Added 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"
        +}
      • changedOutput 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"
        +}
  2. 6 tool updatesv0.5.1
    • Addedrybbit_create_goal
    • Addedrybbit_delete_goal
    • Addedrybbit_get_goal_sessions
    • Addedrybbit_get_journeys
    • Addedrybbit_list_goals
    • Addedrybbit_update_goal
  3. 1 tool update
    • Removedrybbit_list_goals
  4. 5 tool updates
    • Removedrybbit_create_goal
    • Removedrybbit_delete_goal
    • Removedrybbit_get_goal_sessions
    • Removedrybbit_get_journeys
    • Removedrybbit_update_goal
  5. 1 tool updatev0.3.3
    • Addedrybbit_get_journeys
  6. 1 tool update
    • Removedrybbit_get_journeys
  7. 30 tool updatesv0.4.3
    • Changedrybbit_analyze_funnel1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Addedrybbit_create_funnel
    • Addedrybbit_create_goal
    • Addedrybbit_delete_funnel
    • Addedrybbit_delete_goal
    • Changedrybbit_get_errors1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_event_names1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_event_properties1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_event_timeseries1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_funnel_step_sessions1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_goal_sessions1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_journeys1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_metric3 fields changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
      • changedInput schema / properties / parameter / description
        Previous 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."
      • changedInput schema / properties / parameter / enum
        Previous 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"
        +]
    • Changedrybbit_get_outbound_links1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_overview1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_overview_timeseries1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Addedrybbit_get_page_titles
    • Changedrybbit_get_performance1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_performance_timeseries1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_retention1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_session_locations1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_get_user_event_breakdown1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Addedrybbit_get_user_session_count
    • Changedrybbit_list_events1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_list_goals1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_list_sessions1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Changedrybbit_list_users1 field changed
      • changedInput schema / properties / filters / items / properties / parameter / description
        Previous 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."
    • Addedrybbit_site_has_data
    • Addedrybbit_update_goal
    • Changedrybbit_update_site_config5 fields changed
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "Domain (web sites) or package name (app sites). Normalized server-side.",
        +  "maxLength": 253,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / excludedCountries
        Added 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"
        +}
      • addedInput schema / properties / excludedIPs
        Added value: +{
        +  "description": "IP addresses or CIDR ranges to exclude from tracking (max 100)",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Display name for the site",
        +  "maxLength": 255,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added 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"
        +}
  8. 32 tool updatesv0.5.2
    • First observedrybbit_analyze_funnel
    • First observedrybbit_create_site
    • First observedrybbit_delete_site
    • First observedrybbit_get_config
    • First observedrybbit_get_errors
    • First observedrybbit_get_event_names
    • First observedrybbit_get_event_properties
    • First observedrybbit_get_event_timeseries
    • First observedrybbit_get_funnel_step_sessions
    • First observedrybbit_get_goal_sessions
    • First observedrybbit_get_journeys
    • First observedrybbit_get_metric
    • First observedrybbit_get_outbound_links
    • First observedrybbit_get_overview
    • First observedrybbit_get_overview_timeseries
    • First observedrybbit_get_performance
    • First observedrybbit_get_performance_timeseries
    • First observedrybbit_get_retention
    • First observedrybbit_get_session
    • First observedrybbit_get_session_locations
    • First observedrybbit_get_site_id
    • First observedrybbit_get_user
    • First observedrybbit_get_user_event_breakdown
    • First observedrybbit_get_user_traits
    • First observedrybbit_list_events
    • First observedrybbit_list_funnels
    • First observedrybbit_list_goals
    • First observedrybbit_list_sessions
    • First observedrybbit_list_sites
    • First observedrybbit_list_users
    • First observedrybbit_live_users
    • First observedrybbit_update_site_config

TDQS

B3.4/5.0

Scored across 43 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Connects Google Analytics 4 data to Claude, Cursor and other MCP clients, enabling natural language queries of website traffic, user behavior, and analytics data with access to 200+ GA4 dimensions and metrics.
    10
    1,637 PyPI
    242
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Exposes analytics from Claude Code transcripts as MCP tools, enabling cost, audit, safety, and efficiency queries through natural language.
    4
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Connects 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.
    7
    20 PyPI
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Exposes Rybbit Analytics as MCP tools for querying site traffic, page views, visitor sessions, and live visitor counts through natural language.
    9
    270 npm
    MIT