Skip to main content
Glama

The MCP server of Pyxis: lets Claude and other AI agents read your dashboard's numbers, only reading, through a connection or a token you can revoke at any time.

CI Coverage CodeQL OpenSSF Scorecard License: MIT TypeScript strict Conventional Commits npm npm provenance

Pyxis · Live demo · API reference

Status: on npm as pyxis-mcp, every release published from GitHub Actions with provenance, and served by the Pyxis API at https://api.pyxis-analytics.dev/mcp.

Ecosystem

Repository

Role

pyxis-api

Ingestion, sign-in, dashboard queries, accounts and billing, erasure, the MCP endpoint

pyxis-sdk

Browser tracker published to npm as pyxis-analytics

pyxis-web

The dashboard and the home page

pyxis-mcp (this one)

MCP server: Claude and other agents read the dashboard's numbers

Related MCP server: Google Analytics MCP Server

Why it exists

More and more questions about a product are asked to an agent instead of a dashboard: "how did last week compare", "where does the sign-up funnel lose people", "which route started failing". This server gives Claude Code, Claude Desktop, Cursor and other MCP clients the same numbers the Pyxis dashboard shows, and nothing more: it reads through a Claude connection the admin allows or an access token the admin creates, both read-only and revocable in the dashboard's Settings at any moment. Like the rest of Pyxis, there is no personal data to hand over: events carry no cookies, no addresses and no user agents.

Tools

Every tool only reads, and maps to one GET route of the Pyxis API. Dates are YYYY-MM-DD in the project's time zone; list_projects gives each project's today, so call it first. The server's instructions tell the agent what an empty account means: with no project, one is created in the dashboard; with a project that has received no event, the site does not run the tracker yet, and llms.txt explains how to install it.

Tool

What it answers

list_projects

The projects the token can read: id, name, time zone, today there, conversion event, first and last event

overview

Visits, identified users, conversions and failed writes against the previous period; top pages and events

devices

Visits and conversions by device type, browser, system, country, region and city; the reach of the range

acquisition

Visits per day and channel, and the sources and campaigns behind them

engagement

Entry and exit pages, single-page visits, visit length

time_of_day

Visits by weekday and local hour

features

The most used named events or screens, day by day

event_properties

How the property values of one named event break down

property_summary

The median and quartiles of a numeric property, split by another: how long people read each article

requests

Calls to the site's backend per route: failures, statuses, durations, latest errors

funnel

How many visits or people reached each step, and the time between steps

funnel_segments

The same funnel per device type or channel

funnel_subjects

The visits or people who reached, or dropped at, one step

visits

The visits of a range, filtered by pages, events, channel, device, place, campaign, failed requests

visit_timeline

Every event of one visit, or every visit of one identified person

project_settings

Time zone, conversion event, allowed origins, retention, whether the city is kept, live public keys

A result is JSON text, { "untrusted_visitor_text": "…", "report": … }: the report is the API's answer, and the first field reminds the agent that names, paths and values inside it were written by the site's visitors. Times come in the project's time zone, with the offset of each moment (2026-10-13T22:41:41.638-03:00), where the API answers in UTC, and in UTC (+00:00) when the Node running the server does not know that zone; the timeline's before takes any offset (ADR 0004). Problems come back as tool errors the agent can act on (a revoked token, an unknown project, the rate limit and when to retry). When the API refuses a request (any 4xx), the error carries the API's own code and reason, such as a suspended account; only a 5xx asks to try again later.

Connect from Claude

The hosted Pyxis serves these tools at https://api.pyxis-analytics.dev/mcp. Claude connects to it with no token and nothing to install: you sign in to Pyxis once and allow the connection.

Claude (on the web, the desktop app and the phone):

  1. In Claude, open Settings, then Connectors, and choose Add custom connector. In some versions the menu is Customize, then Connectors.

  2. Name it Pyxis and paste https://api.pyxis-analytics.dev/mcp. Leave the advanced OAuth fields empty.

  3. Choose Connect. A Pyxis page opens: sign in with the code sent to your e-mail, check the app, where its data goes and your projects, and choose Allow.

Claude Code:

claude mcp add --transport http pyxis https://api.pyxis-analytics.dev/mcp

Then run /mcp in Claude Code, pick pyxis and choose Authenticate: the same Pyxis page opens in the browser.

A connection only reads the numbers you see in the dashboard, from every project you can open. It renews itself while it is used (each access token lasts an hour) and ends when you revoke it in the dashboard, under Settings, Connected apps, or after 90 days without use; you keep up to ten. The data Claude asks for goes from the Pyxis API to Anthropic, which handles it under its own terms. Only Claude and Claude Code connect this way; other clients use an access token.

Connect from other clients

A client that sends a header reaches the same address with an access token instead of signing in. Create one in the dashboard (Settings, Access tokens), choose how long it lives, and revoke it there when it is no longer needed. It reads the same projects as its admin, and only reads.

Cursor (~/.cursor/mcp.json), with the token in the PYXIS_TOKEN environment variable:

{
  "mcpServers": {
    "pyxis": {
      "url": "https://api.pyxis-analytics.dev/mcp",
      "headers": { "Authorization": "Bearer ${env:PYXIS_TOKEN}" }
    }
  }
}

VS Code (mcp.json), which asks for the token once and keeps it out of the file:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "pyxis-token",
      "description": "Pyxis access token",
      "password": true
    }
  ],
  "servers": {
    "pyxis": {
      "type": "http",
      "url": "https://api.pyxis-analytics.dev/mcp",
      "headers": { "Authorization": "Bearer ${input:pyxis-token}" }
    }
  }
}

Claude Code, with a token instead of signing in:

claude mcp add --transport http pyxis https://api.pyxis-analytics.dev/mcp --header "Authorization: Bearer pyxis_at_…"

A client that only runs servers on the computer uses the package with the same token (see Run it on your computer). ChatGPT cannot connect yet: its connectors sign in only with OAuth and cannot send an access token, and the Pyxis OAuth server knows only Claude and Claude Code.

Configuration

Variable

Required

Meaning

PYXIS_TOKEN

yes

A read-only access token (pyxis_at_ and 32 letters and digits), created in the dashboard under Settings

PYXIS_API_URL

no

The Pyxis API to read, as an origin. Defaults to https://api.pyxis-analytics.dev; plain http only for localhost

A missing or malformed value stops the server with a sentence on standard error that names the variable and never repeats its value.

Run it on your computer

To run the tools on your own computer, or against a self-hosted Pyxis, create a token in the dashboard (Settings, Access tokens), then add the server to your client. It runs with npx, so there is nothing to install beforehand (Node 22 or later).

Claude Code:

claude mcp add pyxis -e PYXIS_TOKEN=pyxis_at_… -- npx -y pyxis-mcp

Claude Desktop (claude_desktop_config.json) and Cursor (.cursor/mcp.json):

{
  "mcpServers": {
    "pyxis": {
      "command": "npx",
      "args": ["-y", "pyxis-mcp"],
      "env": { "PYXIS_TOKEN": "pyxis_at_…" }
    }
  }
}

A self-hosted Pyxis adds PYXIS_API_URL. To run it from source instead, npm ci && npm run build in a clone and use node /path/to/pyxis-mcp/dist/cli.js as the command. Keep the token out of shared files and chats; revoke it in the dashboard the moment it leaks.

Use it as a library

Clients that only accept remote servers need the tools at a URL. The package exports them so a host can serve them from its own endpoint, over Streamable HTTP, with the token of whoever is calling. It is an ES module that a CommonJS host can also require() (Node 22.12 or later).

import { handleHttpRequest, PyxisApi } from 'pyxis-mcp';

export function answerMcp(request: Request, callerToken: string): Promise<Response> {
  const api = new PyxisApi({
    token: callerToken,
    apiUrl: 'https://api.pyxis-analytics.dev',
    problemTexts: {
      refusedToken: 'Pyxis refused this connection: connect Pyxis again in your MCP client.',
      unreachableAdvice: 'Try again in a moment.',
    },
  });
  return handleHttpRequest(request, api);
}

Export

What it does

handleHttpRequest(request, api, options?)

Answers one MCP exchange: a web Request in, a web Response out

createServer(api, options?)

The MCP server with the sixteen tools, for a transport of your choice

new PyxisApi(options)

The client the tools read through, one per caller

PyxisApi options: token and apiUrl (required); userAgent (default pyxis-mcp/<version>); fetch (default the global one; a host can pass one that answers inside its own process); timeoutMs (default 15 seconds); problemTexts, the two sentences that depend on where the server runs: refusedToken and unreachableAdvice (default: the local server's, which name PYXIS_TOKEN and PYXIS_API_URL). createServer takes version (default the package's) and now (the clock); handleHttpRequest takes those and allowedOrigins.

What the handler does: each request gets a server and a transport of its own, closed once it is answered, so there is no session id and no event stream, only JSON answers. It answers 405 with Allow: POST to any other method, 403 to a request with an Origin header unless that origin is in allowedOrigins (none by default: MCP clients do not call from web pages), and 413 to a body over 64 KiB. What it leaves to the host: authenticating the caller (and the 401 with WWW-Authenticate that starts a client's sign-in), rate limits and the host name (ADR 0003).

Architecture

flowchart LR
  Agent["MCP client<br>(Claude Code, Cursor…)"] -- "stdio, JSON-RPC" --> Server["pyxis-mcp<br>(on the user's machine)"]
  Server -- "HTTPS GET<br>Authorization: Bearer pyxis_at_…" --> API["Pyxis API"]
  Remote["Claude · Claude Code"] -- "Streamable HTTP POST<br>OAuth access token" --> Host["Pyxis API, /mcp<br>handleHttpRequest"]
  Host -- "GET in process, same token" --> API
  API --> DB[("Events")]

The local server opens no port and keeps no state. The API decides what the token may read, exactly as it does for a dashboard session (ADR 0002). A host runs the same tools for remote clients: it authenticates the caller, and the tools read with that caller's token, so the token never leaves the server that issued it (ADR 0003). The Pyxis API is that host: it signs Claude in with OAuth and runs the tools at /mcp.

Tech stack

TypeScript (strict) on Node 22 or later, ES modules. Vitest with V8 coverage, fast-check, ESLint (typescript-eslint strict, type-checked) and Prettier, Husky and commitlint, GitHub Actions with CodeQL, OpenSSF Scorecard, Dependabot and release-please.

Getting started

npm ci
npm run lint && npm run typecheck && npm run test:cov && npm run build

Testing

  • npm run test:cov runs the unit tests in Node and fails below 100% of statements, branches, functions and lines. The server is tested with a real MCP client over an in-memory transport and a fake fetch; the HTTP handler with web Request objects, from initialize to a tool call, and every refusal.

  • Property-based tests with fast-check (src/*.property.test.ts) check the rules over generated inputs: offsetOf reads back any offset a time zone can name; inTimeZone writes, for every time zone, a local time that names the same instant; localTimes rewrites exactly the UTC instants at the given paths, adds or drops no field and changes nothing more on a second pass; readConfig fails with nothing but a ConfigError for any environment and accepts a token exactly when it matches the pattern; todayIn is the date of the local times the reports write. Each property runs 200 times from a fixed seed (src/property-parameters.ts, left out of the build), so CI and the pre-commit hook see the same inputs, and a failure prints the counterexample with the seed to replay it.

  • One file is left out of the unit coverage: src/cli.ts, which only wires the modules to the standard input and output. npm run test:e2e covers it: after npm run build, a real MCP client starts dist/cli.js, lists the tools and calls them against a local fake of the API, checks that standard output carries nothing but the protocol, and that a bad configuration stops the process with the reason on standard error.

  • npm run test:e2e also starts e2e/http-host.ts, a small HTTP host that imports pyxis-mcp by its name, and drives it with the SDK's Streamable HTTP client: tools against the fake API with the caller's token, no session, a timeline page in local time whose cursor reaches the API in UTC, the host's own words for a refused token, 405 and 403. The package is also loaded by name with import and with require.

  • src/contract.test.ts checks the tools against contract/openapi.json, the API's own contract (npm run contract:sync copies it from pyxis-api): every route a token may read has a tool, except the arrivals the dashboard polls to show that new data came in, every tool sends only declared parameters, with values inside their enums, and every instant an answer declares is one its tool writes in the project time zone, read from the answer's timezone.

  • npm run test:tooling tests the lint rule and the scripts.

  • CI runs the unit tests on Node 24 and again on Node 22, the oldest version the package supports.

Project structure

src/
├── config.ts        reads PYXIS_TOKEN and PYXIS_API_URL
├── pyxis-api.ts     one GET to the API, failures as sentences
├── tools.ts         the sixteen tools: input schemas, routes, requests
├── time-zone.ts     writes the instants of an answer in the project time zone
├── server.ts        registers the tools on the MCP server
├── http.ts          one stateless Streamable HTTP exchange
├── index.ts         the library's public exports
├── version.ts       the package version, for the server and the user agent
└── cli.ts           the executable: stdio transport
e2e/                 the built package driven by real MCP clients, over stdio and over HTTP
contract/            the API's OpenAPI contract, copied from pyxis-api
eslint-rules/        the local rule that forbids comments
scripts/             the comment check and the contract sync
docs/adr/            architecture decision records

Privacy and security

  • Read-only: the API accepts the token only on its read routes; it cannot write, sign in, manage sessions or create tokens.

  • The token only travels in the Authorization header to the configured API, over https (plain http only to localhost), and never reaches a log, an error message or a tool result.

  • Text written by a site's visitors is returned as data: each tool description says where it comes from, and each answer reminds the agent, in untrusted_visitor_text, that it is not an instruction. The descriptions say what a tool does and never tell the agent what to do.

  • Over HTTP, the handler keeps no session, refuses requests sent by web pages and bodies over 64 KiB, and reads with the token of the caller its host authenticated.

  • Vulnerabilities: see SECURITY.md.

Architecture decisions

ADR

Decision

0001

Record architecture decisions

0002

A local, read-only server that uses the admin's access token

0003

A stateless HTTP handler that a host runs with the caller's token

0004

Times in the project time zone, rewritten in place

Roadmap

What shipped, release by release, is in the CHANGELOG and the GitHub releases.

Contributing and license

See CONTRIBUTING.md and the Code of Conduct. MIT licensed: see LICENSE.

Available Tools

16 tools
acquisitionAcquisitionA
Read-onlyIdempotent

Visits per day and channel (paid, email, social, campaign, organic, referral, direct), and the sources and campaigns that brought them, with their conversions and ad clicks. A source is the campaign source, else the referring host; a visit with neither is (ad click) when it came from an ad click, such as one opened by an app that sends no referrer, and (direct) otherwise.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
project_idYesThe project id, from list_projects.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, closed-world, non-destructive behavior, so the bar is lower, yet the description still adds value: the 400-day range cap, the 'to is at most today' time-zone-scoped rule, and the explicit warning that all reported text is raw visitor-supplied input (a data-provenance/injection caveat). The attribution rule defining source vs (ad click) vs (direct) further clarifies output semantics.

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?

Content is front-loaded: the first sentence states what the report contains, then attribution logic, then prerequisites/limits, then the data-provenance note. It is somewhat dense in the attribution paragraph but every sentence carries non-redundant 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 no output schema, the description does the work of describing the returned content (channels, sources, campaigns, conversions, ad clicks) and the key operational limits (400-day cap, today ceiling, time zone, list_projects dependency). It is close to complete, with only minor gaps around return shape/pagination.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3, but the description adds constraints the schema lacks: the range covers at most 400 days, dates are in the project time zone, and project_id/today must be sourced from list_projects. That meaningfully extends the three documented parameters.

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 names a specific verb-like resource (a per-day, per-channel acquisition report) and enumerates the channels it breaks out (paid, email, social, campaign, organic, referral, direct) plus the metrics it carries (visits, sources, campaigns, conversions, ad clicks). An agent can tell this is a traffic-attribution report, though it never explicitly contrasts itself with siblings like visits or overview.

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 states a real prerequisite — 'The project id and the project's today come from list_projects' — and constraints on the date range, which is useful workflow context. However, it never says when to pick acquisition over the other reporting siblings (visits, overview, funnel), so selection guidance is only implied.

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

devicesDevicesA
Read-onlyIdempotent

Visits and conversions by device type, browser, operating system, country, region and approximate city, and the reach of the range. regions lists the top 10 regions (ISO 3166-2 codes such as BR-SP, with their names), then "other", then a null value for the visits without a region. cities lists the top 20 cities, each with its region, then "other", then a null value for the visits without a city. The city is kept only for a project whose owner turned it on (city_enabled in project_settings); with it off, every visit counts as without a city. reach counts the visits of the range and the continents (as UN M49 groups the countries: Americas, Europe, Asia, Africa, Oceania), countries, regions and cities they came from, with the country and the region that brought the most visits; unknown places count for none.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
project_idYesThe project id, from list_projects.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds substantial context beyond that: top-10/top-20 geo truncation with other and null buckets, city privacy gating via city_enabled, how reach treats unknown places, the 400-day maximum range, and a caveat that visitor-supplied text is reported as received.

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

Conciseness3/5

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

The purpose is front-loaded, but the description is a dense run-on paragraph. Some detail is justified because there is no output schema, yet the final sentence about event names, page paths, sources, campaigns, and routes is generic and does not map clearly to the device/geographic report dimensions.

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 complex analytics report with no output schema, the description explains geographic return semantics and reach behavior in detail. It still omits the return structure or limits for the core device, browser, OS, and conversion breakdowns, leaving an important gap for correct interpretation.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description still adds useful semantics by specifying dates are in the project time zone, that to is at most today, that ranges cover at most 400 days, and that project_id and today come from list_projects.

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 clearly identifies an analytics report of visits and conversions broken down by device type, browser, operating system, and geography, plus reach. It does not explicitly distinguish the tool from siblings such as overview or visits, so it is clear but not fully differentiated.

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?

There is no explicit when-to-use guidance or named alternatives. However, the report dimensions imply its use for device and geographic breakdowns, and it supplies prerequisites such as obtaining project_id and today from list_projects plus date-range constraints.

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

engagementEngagementA
Read-onlyIdempotent

The top entry and exit pages, the visits that viewed a single page, and how long visits lasted (median and buckets).

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
project_idYesThe project id, from list_projects.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish the readOnly/idempotent/non-destructive safety profile, so the bar is lower. The description still adds real behavioral context the annotations lack: the range cap of 400 days, the constraint that 'to' is at most today, and the caveat that event names, paths, property values, sources and campaigns are raw visitor-supplied text.

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 most important sentence — what the report contains — is front-loaded, followed by sourcing/date constraints and then the raw-text caveat. Three short paragraphs, essentially no filler, though the raw-text note could be tightened.

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 no output schema, the description carries the return-value burden and does list the report's components (entry/exit pages, single-page visits, duration median and buckets). It omits response format and pagination, but for a 3-parameter read-only report this is close to sufficient.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by adding the 400-day maximum range and restating the project-time-zone framing of dates, which the schema does not encode.

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 names the specific contents of the report — top entry/exit pages, single-page visits (bounce), and visit duration with median and buckets — which is more than a restatement of the name. It does not, however, differentiate itself from nearby siblings such as 'visits' or 'overview', 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?

Usage is only implied by the report contents. There is a useful prerequisite pointer ('The project id and the project's today come from list_projects'), but no explicit when-to-use-this-vs-alternatives guidance against siblings like visits, overview, or acquisition.

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

event_propertiesEvent propertiesA
Read-onlyIdempotent

How the property values of one named event break down: per property key, the ten most frequent values with their counts and visits, and the count of the rest.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
eventYesThe named event to break down: signup_completed.
project_idYesThe project id, from list_projects.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive, closed-world behavior. Beyond that the description discloses a real behavioral trait not in the annotations: output is truncated to the ten most frequent values per key with a residual count, and that event/page/property values are raw visitor-supplied text reported as received (i.e., potentially dirty data). It does not mention pagination or limits on property keys.

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 what the report contains, followed by data sourcing, date rules, and a data-quality caveat. Three tight sentences with no filler, though the final sentence about raw visitor text is somewhat peripheral to invoking the 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?

With no output schema, the description carries the return-shape burden and does so by enumerating keys, top-ten values, counts, visits, and the remainder count. It also covers id sourcing and date-range limits, leaving only edge behavior (empty events, error cases) unstated for a simple four-parameter read tool.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (project_id, from, to, event) is already documented with format and constraints. The description restates the date bounds and the list_projects sourcing rather than adding syntax or semantics the schema lacks, 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 resource (property values of one named event) and exactly what it returns: per property key the ten most frequent values with counts and visits, plus the count of the rest. This is distinct from siblings like overview, features, or engagement, which an agent can tell apart without opening schemas.

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

Usage Guidelines3/5

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

Gives a workflow prerequisite ('the project id and the project's today come from list_projects') and a hard usage constraint (to at most today, range at most 400 days). However, it never says when to choose this tool over siblings such as overview or features, nor any when-not condition, so usage is only implied by the output description.

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

featuresFeaturesA
Read-onlyIdempotent

The most used named events or screens (page templates) of a range, with their daily counts.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
kindNoevents: named events; screens: page templates.events
project_idYesThe project id, from list_projects.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so safety is covered. The description adds genuinely new behavioral context: the 400-day maximum range, that 'to' cannot exceed the project's today (a failure condition), that results are daily-granularity counts, and that names/paths/sources are raw visitor-supplied text, which warns the agent about data quality.

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 report's identity, then constraints, then a data-quality caveat. The final sentence is long but carries non-obvious information about input text provenance 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?

With no output schema, the description usefully states the return shape ('daily counts' of ranked features), the hard range limits, and the time-zone convention. Missing only things like ordering guarantees, result-size caps, or rate limits, which are minor for a read-only report tool whose annotations already cover safety.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description goes beyond it: it anchors dates to the project time zone (not stated in the schema), restates the inclusive YYYY-MM-DD format with the 400-day constraint, and ties project_id's provenance to list_projects. The kind enum is already documented in the schema.

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 concrete resource and scope: 'the most used named events or screens (page templates) of a range, with their daily counts.' An agent can tell it produces a ranked feature report, distinct from siblings like event_properties or overview. It stops short of naming which sibling to use for adjacent questions, so no explicit 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?

Usage context is implied rather than stated: the agent learns the project_id and the project's today must come from list_projects, and that ranges are capped at 400 days ending at today. There is no explicit when-to-use/when-not guidance versus overview, events-related siblings, or event_properties.

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

funnelFunnelA
Read-onlyIdempotent

How many visits or people reached each step of a funnel, in order, with the median time from each step to the next and through the whole funnel.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
modeNovisit counts each visit on its own; user follows identified people across visits.visit
stepsYesThe steps of the funnel, in order: 2 to 8 pages or named events.
project_idYesThe project id, from list_projects.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare a safe read-only, idempotent, closed-world operation, so the bar is lower. The description adds real value beyond them: the hard 400-day range limit, the to<=today ceiling, the project time-zone convention for dates, and a data-quality caveat that event/page/property text is reported verbatim as visitors sent it.

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 what the report produces, then constraints, then the data caveat. Efficient overall, though the final paragraph about text fidelity is tangential to invoking the tool and could be trimmed.

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?

There is no output schema, so the description must convey returns, and it does: per-step counts plus median transition times and whole-funnel time. Combined with the date-range and time-zone rules, an agent has what it needs; the remaining gaps are the funnel_subjects/funnel_segments routing decision.

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 step object oneOf variants, mode semantics and the 2-8 step limit, so the baseline is 3. The description's only added detail is the verbatim-text caveat; its list of 'property values, sources, campaigns and routes' actually names dimensions this tool has no parameters for, which adds no usable per-parameter meaning.

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: counts of visits/people reaching each funnel step, ordered, with median time-to-next and through the whole funnel. An agent can tell this is an ordered multi-step funnel report. It does not, however, name or distinguish itself from the sibling tools funnel_subjects and funnel_segments, which likely report on the same funnel.

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 only implied: 'The project id and the project's today come from list_projects' plus the range constraints (at most 400 days, to at most today). There is no explicit statement of when to pick this over funnel_subjects or funnel_segments, so the agent must infer from the sibling names.

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

funnel_segmentsFunnel segmentsA
Read-onlyIdempotent

The same funnel per device type or per channel of the visit, counting visits; the segments add up to the whole funnel.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
byYesSplit by device type or by channel.
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
stepsYesThe steps of the funnel, in order: 2 to 8 pages or named events.
project_idYesThe project id, from list_projects.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely useful operational context: the project's today comes from list_projects, ranges cap at 400 days, `to` cannot exceed today, and the reported text is raw visitor-supplied data. The segments summing to the whole funnel is a real semantic guarantee not present in the schema.

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

Conciseness4/5

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

Three sentences, front-loaded with the tool's core semantics before the boilerplate date/privacy caveats. The date sentence duplicates schema constraints, but the 400-day cap and timezone framing are new information and earn their place.

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

Completeness5/5

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

For a read-only analytics query with no output schema, the definition supplies everything an agent needs before calling: how the funnel is segmented, where project_id and today come from, the date window limits, and a data-quality caveat about raw text values.

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 parameter is already documented, including `by`'s device/channel enum and the 2-8 step limits. The description largely restates the date and timezone rules already in the schema and adds no per-parameter meaning, 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 the resource (a funnel) and its distinguishing dimension (per device type or per channel of the visit), which implicitly separates it from the unsegmented `funnel` and from `funnel_subjects`. It does not name those siblings explicitly, so an agent must infer the contrast rather than read it.

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 — pick this when you want the funnel broken down by device or channel — but there is no explicit when-to-use statement, no when-not to use it, and no pointer to `funnel` or `funnel_subjects` as the alternative for a single whole-funnel figure.

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

funnel_subjectsFunnel subjectsA
Read-onlyIdempotent

The visits, or identified people, who reached one funnel step, or who reached the step before it and never this one; newest first, a page at a time. Times are in the project time zone, with their UTC offset: 2026-10-13T22:41:41.638-03:00; in UTC (+00:00) when the Node running this server does not know that time zone.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
modeNovisit counts each visit on its own; user follows identified people across visits.visit
stepYesThe step, 1 for the first; dropped needs 2 or more.
stepsYesThe steps of the funnel, in order: 2 to 8 pages or named events.
cursorNoThe next_cursor of the previous page.
outcomeYesreached the step, or dropped before it.
project_idYesThe project id, from list_projects.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds real value: ordering (newest first), pagination via cursor ('a page at a time'), timestamp format with UTC offsets and the fallback to +00:00, the 400-day range cap, and the caveat that reported values are raw text sent by visitors. Only the shape of returned records is left unstated.

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 purpose and ordering come first, followed by timezone/range rules and a data-provenance note; nearly every clause carries information. The opening sentence is an awkward run-on ('who reached one funnel step, or who reached the step before it and never this one'), costing a bit of clarity, but there is 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 an 8-parameter, read-only analysis tool with no output schema, the description covers ordering, pagination, timezone handling, date bounds, and data trustworthiness. The main remaining gap is that it never indicates what fields identify each returned subject, which an agent would need to know to use the response.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds constraints the schema does not state: dates are interpreted in the project time zone, to may not exceed the project's today, a range spans at most 400 days, and the project id's source is list_projects. These are substantive semantics beyond the field-level 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+resource: it returns the visits or identified people that reached a given funnel step, or dropped before it, newest first and paginated. That is far more than a restatement of the title. It does not, however, explicitly distinguish itself from sibling tools like funnel or funnel_segments, which likely return aggregated counts.

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 through the reached/dropped outcome and the 'one funnel step' framing, and it helpfully notes that project_id and the project's today come from list_projects. But there is no explicit statement of when to choose this over funnel/funnel_segments, nor any stated exclusions or prerequisites beyond that pointer.

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

list_projectsList projectsA
Read-onlyIdempotent

The Pyxis projects this token can read, each with its id, name, time zone, today's date in that time zone, conversion event, and when its first and latest events arrived. Every other tool takes a project id from here and dates no later than the project's today. Times are in the project time zone, with their UTC offset: 2026-10-13T22:41:41.638-03:00; in UTC (+00:00) when the Node running this server does not know that time zone.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed world), and the description adds real substance on top: results are auth-scoped to the token, timestamps carry the project's time-zone offset with a stated UTC fallback when the Node lacks the zone. That fallback is a behavioral quirk an agent could never infer from the schema.

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

Conciseness4/5

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

The core statement is front-loaded and the prerequisite rule follows logically. The closing ISO-8601 offset example is useful but verbose, making the third sentence heavier than it needs to be for what is essentially 'times are local with offset, or UTC if unknown'.

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 no output schema, the description carries the burden of describing the return shape and does so field by field, including timestamp format and the UTC fallback. It leaves minor gaps such as result ordering and magnitude, but nothing an agent needs in order to call it correctly.

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

Parameters4/5

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

The tool takes zero parameters, so the schema has nothing to explain and there is no parameter semantics to add. The baseline for a no-parameter tool 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 plus the scope restriction ('the Pyxis projects this token can read') and enumerates exactly what each entry contains. It also implicitly separates itself from the analytics siblings by declaring that 'every other tool takes a project id from here', so an agent knows this is the discovery root rather than another report.

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 an explicit call-order rule: take the project id from this list, and use dates no later than the project's today. That is strong prerequisite guidance, though it never states when this tool should not be used or what to do with zero visible projects.

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

overviewOverviewA
Read-onlyIdempotent

Visits, identified users, conversions and failed writes of a range against the previous period, the daily activity of both, and the top pages and events. A range that ends today is compared with the previous period up to the same time of day.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
project_idYesThe project id, from list_projects.

TDQS

A3.8/5.0
Behavior4/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 is covered. The description adds behavior the annotations cannot: the partial-day comparison rule for ranges ending today, a hard 400-day range cap, timezone semantics, and a data-fidelity caveat that event/page/property text is reported exactly as visitors submitted it (a real signal about unvalidated content).

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 what the report returns, then comparison semantics, then input sourcing and constraints. Four compact sentences with no filler. The closing note on visitor-supplied text is slightly tangential but is a legitimate data-quality warning rather than 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?

With no output schema, the description carries the burden of describing returns and does so at the metric level, plus it covers the range cap, timezone, and comparison window. It stops short of describing the response structure (field names, grouping, pagination), which is the main residual gap for a report tool.

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

Parameters4/5

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

Schema coverage is 100% and each parameter is documented, so the baseline is 3. The description goes further by supplying constraints absent from the schema — the 400-day maximum range length, the 'at most today' upper bound, and the project-time-zone interpretation of the dates — which meaningfully changes how an agent constructs the call.

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 names the concrete outputs (visits, identified users, conversions, failed writes, daily activity, top pages and events) and the period-over-period comparison, which is far beyond restating the title 'Overview'. It does not, however, name or distinguish itself from near-siblings such as visits, engagement or acquisition, so an agent still has to 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?

It gives one concrete routing hint — the project id and the project's 'today' come from list_projects — which is genuinely useful for chaining calls. But there is no statement of when to choose this report over visits, engagement or acquisition, and no exclusions; usage is implied rather than prescribed.

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

project_settingsProject settingsB
Read-onlyIdempotent

The settings of one project: time zone, conversion event, allowed origins, first and latest event, how many months events are kept, whether the visitor's approximate city is kept, the live public keys, and when each live secret key was created (never the secret key itself). Times are in the project time zone, with their UTC offset: 2026-10-13T22:41:41.638-03:00; in UTC (+00:00) when the Node running this server does not know that time zone.

NameRequiredDescriptionDefault
project_idYesThe project id, from list_projects.

TDQS

B3.4/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 description earns credit for what it adds: timestamps are rendered in the project's time zone with an explicit UTC offset and fall back to +00:00 when the Node lacks the zone, and secret keys are never returned (only their creation dates). That privacy and formatting detail is real behavioral context an agent cannot get from annotations.

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

Conciseness3/5

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

One long run-on sentence packs a field inventory plus a timezone caveat; the scoping statement is front-loaded, but the comma-spliced field list is hard to scan and the offset example (2026-10-13T22:41:41.638-03:00) is verbose relative to the point it makes.

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?

There is no output schema, so the description carries the burden of declaring what comes back, and it does so field by field, plus the time-zone rendering rule and the secret-key exclusion. Missing only an auth/failure note (e.g., behavior for an unknown project_id) to be 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?

With one parameter at 100% schema description coverage, the schema already explains project_id ('from list_projects'), and the description adds nothing about it. Baseline 3 for a fully documented single parameter.

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 identifies the resource ('the settings of one project') and enumerates exactly which settings are returned, which clearly separates it from the analytics siblings (visits, funnel, overview). It lacks an explicit verb, so the read intent is only implied, but the noun-plus-field-list makes the purpose unmistakable for an agent comparing siblings.

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 or when-not-to-use guidance; the description never says 'call this to discover configuration before calling analytics tools' or names any alternative. The only routing hint ('from list_projects') appears in the parameter schema, not in the description.

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

property_summaryProperty summaryA
Read-onlyIdempotent

The median, 25th and 75th percentiles of one numeric property of a named event, overall and split by another property of the same event. It answers questions such as how long people read each article: the median of seconds on article_read_100, split by post. Only events whose property is a JSON number count: overall.events says how many, and the figures are null when none does. With by, groups holds the 10 values of that property carried by the most events, and other_count counts the events of every other value; events without it count in overall only. The visit filters keep only the events of the visits that match all of them.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
byNoAnother property of the same event to split the figures by: post.
osNo
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
keyYesThe numeric property to sum up: seconds.
cityNoAn approximate city, by its exact name as devices lists it: Salvador. Needs region, since the same name exists in several regions.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
eventYesThe named event whose property to sum up: article_read_100.
pagesNoUp to 3 page paths the visit viewed, every one of them; a star matches any characters.
deviceNo
failedNotrue: only the visits with a failed request.
regionNoISO 3166-2 region code: BR-SP.
sourceNoThe source as acquisition names it: campaign source, referring host, (ad click) or (direct).
browserNo
channelNo
countryNoTwo-letter country code: BR.
campaignNoThe utm_campaign.
identityNo
project_idYesThe project id, from list_projects.
visit_eventNoOnly the visits that sent this named event.
visit_propertyNokey=value: visit_event carried this property value. Needs visit_event.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the read-only/idempotent annotations, it discloses important behavior: only events whose property is a JSON number count, figures are null when none qualify, 'by' returns the top 10 values plus other_count, and events lacking the property appear in overall only. It also states date bounds (to <= today, max 400 days) and warns that names/paths/values are visitor-supplied text.

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?

It is front-loaded with the core computation before filtering and date caveats, and each sentence carries information. The closing paragraph on visitor-supplied text is a bit of an aside but still earns its place as a data-provenance warning.

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 20-parameter aggregation tool with no output schema, the description explains the key result shape (overall.events, groups, other_count) and filtering semantics well. It stops short of describing the full output structure or parameter interactions for every visit filter, leaving some gaps.

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

Parameters5/5

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

Despite 75% schema coverage, the description adds semantics the schema lacks: 'by' produces top-10 groups with an aggregated other_count, visit filters are conjunctive ('keep only the events of the visits that match all of them'), and the date/time-zone rules are spelled out. This meaningfully extends the parameter documentation.

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 concrete computation (median, 25th and 75th percentiles of one numeric property of a named event) plus its scope (overall and split by another property), which lets an agent tell it apart from a plain counts tool. It never names a sibling, so differentiation is implicit rather than explicit.

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 frames the tool around concrete questions ('how long people read each article') and points to list_projects for the project id, which gives clear usage context. It offers no explicit when-not conditions or named alternatives among the many sibling report tools.

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

requestsRequestsA
Read-onlyIdempotent

The site's calls to its own backend, per route: failures, statuses, median and 95th percentile durations, the screens they came from and the latest failures with their error codes. writes covers every non-GET call; reads covers failed GET calls only. Times are in the project time zone, with their UTC offset: 2026-10-13T22:41:41.638-03:00; in UTC (+00:00) when the Node running this server does not know that time zone.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
kindNowrites (the default) or reads.
routeNoA route also answered day by day: POST /orders/:id.
screenNoOnly the calls made from this page path.
project_idYesThe project id, from list_projects.

TDQS

A4.7/5.0
Behavior4/5

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

While annotations cover safety, the description adds crucial behavioral context regarding timezone handling and the origin of the data. This informs the agent about the temporal constraints and data reliability of the tool.

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 highly dense and verbose, but every sentence provides highly valuable operational or constraint information. It sacrifices conciseness for maximum functional clarity, which is justified by the complexity of the tool.

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

Completeness5/5

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

Given the multi-faceted nature of the data (routes, screens, time zones, and call types), the description is exceptionally complete, leaving no ambiguity regarding the tool's scope or data origin.

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

Parameters5/5

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

Despite 100% schema coverage, the description provides significant added meaning, defining the operational semantics of the 'reads' and 'writes' parameters, and setting strict temporal limits on the date parameters.

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

Purpose5/5

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

The description clearly identifies the resource (site calls to the backend) and the granular data it returns (statuses, durations, error codes). It further differentiates the tool by detailing the specific metrics and scopes covered.

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 provides specific usage constraints, such as the date range limit (400 days) and the requirement that the project ID is derived from list_projects. It also defines the operational logic for the 'reads' vs 'writes' kind.

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

time_of_dayTime of dayA
Read-onlyIdempotent

The visits of the range by the weekday and the local hour they started.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
project_idYesThe project id, from list_projects.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive/closed-world, so the bar is low, and the description adds real context: the 400-day range cap, dates in the project time zone, and a provenance caveat that event names, paths, property values, etc. are raw visitor-supplied text 'reported as it arrived.' That provenance warning is genuinely useful beyond the structured fields.

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 purpose sentence is front-loaded and each paragraph carries distinct information (what it is, parameter sourcing/constraints, data provenance). Slight waste in the awkward phrasing 'The visits of the range by the weekday,' but overall it is tight and well-ordered.

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 report with full schema coverage and annotations, the description covers purpose, constraints, and data caveats. With no output schema, it conveys the grouping shape (weekday × hour) but does not describe the returned fields or metrics, a minor remaining 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 the baseline is 3. The description restates some schema facts (to at most today, project id from list_projects) but does add two details not in the schema: the project time zone and the 400-day maximum range. That is modest added meaning over the already-complete schema.

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 names a concrete resource and breakdown dimensions: 'The visits of the range by the weekday and the local hour they started.' An agent can infer this is a time-of-day visit report, not a raw list. However, it never distinguishes itself from siblings like visits, overview, or engagement, which also surface visit data.

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 only implied by the report's nature; there is no explicit 'use this when you want X, otherwise use visits/overview' routing. It does provide useful setup context (project id and today come from list_projects), but that is parameter sourcing rather than when-to-use guidance.

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

visitsVisitsA
Read-onlyIdempotent

The visits of a range, newest first, 50 a page, each with its entry page, page views, first named events, failed requests, source, campaign, country, region and approximate city (null unless the project keeps the city), plus the total of matching visits. A visit is one browser tab; nothing links two of them unless the site identified the person. Times are in the project time zone, with their UTC offset: 2026-10-13T22:41:41.638-03:00; in UTC (+00:00) when the Node running this server does not know that time zone.

The project id and the project's today come from list_projects. Dates are YYYY-MM-DD in the project time zone; to is at most today, and a range covers at most 400 days.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
toYesLast day of the range, inclusive (YYYY-MM-DD), at most the project's today.
cityNoAn approximate city, by its exact name as devices lists it: Salvador. Needs region, since the same name exists in several regions.
fromYesFirst day of the range, inclusive (YYYY-MM-DD).
eventNoA named event the visit sent.
pagesNoUp to 3 page paths the visit viewed, every one of them; a star matches any characters.
routeNoA request the visit made: POST /orders/:id.
cursorNoThe next_cursor of the previous page.
deviceNo
failedNotrue: the visit had a failed request; with route, on that route.
regionNoISO 3166-2 region code: BR-SP.
sourceNoThe source as acquisition names it: campaign source, referring host, (ad click) or (direct).
channelNo
countryNoTwo-letter country code: BR.
campaignNoThe utm_campaign.
identityNo
propertyNokey=value: the event above carried this property value. Needs event.
project_idYesThe project id, from list_projects.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive, so the description uses its space well: it discloses ordering (newest first), page size (50), cursor-based pagination, time-zone offset behavior including a UTC fallback when the host lacks the zone, that city is null unless the project retains it, and that filterable text is visitor-supplied and reported verbatim. These are real behavioral traits an agent could not infer from structured fields.

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

Conciseness4/5

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

Front-loaded with the core answer (what you get, in what order, at what page size), followed by constraints and then caveats. The opening sentence is long because it enumerates every returned field, which borders on dumping schema-level detail into prose, but nothing is truly redundant.

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 17-parameter, no-output-schema read tool, the description covers scope, ordering, pagination, time-zone semantics, and data-quality caveats. It stops short of explaining how next_cursor is surfaced in the response or how filters compose (AND vs OR), which an agent must know to page and combine filters 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 82%, so the schema already documents nearly every one of the 17 parameters, including the cross-field dependencies (city needs region, property needs event). The description adds only the provenance of project_id/today and the date format/limit, which is modest value on top of an already well-documented schema — 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?

The first sentence states precisely what is returned: visits over a range, newest first, 50 per page, with an explicit enumeration of the fields each visit carries plus the match total. It is clearly a paginated visit-listing tool, distinguishable from aggregation siblings like acquisition or devices, though it never names a sibling to clarify boundaries.

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 supplies real operating context — project id and the project's today must come from list_projects, dates are YYYY-MM-DD in project time zone, to is capped at today, ranges max 400 days. What is missing is when-to-use-this-vs-alternatives guidance: an agent cannot tell from the description why it would pick visits over requests, visit_timeline, or acquisition.

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

visit_timelineVisit timelineA
Read-onlyIdempotent

Every event of one visit, or every visit of one identified person (the anonymous part of the visit they identified in included), newest first, 20 visits a page; each visit names its country, region and approximate city (null unless the project keeps the city). It takes exactly one of session_id (a visit id from visits or funnel_subjects) or user_id. Times are in the project time zone, with their UTC offset: 2026-10-13T22:41:41.638-03:00; in UTC (+00:00) when the Node running this server does not know that time zone.

Event names, page paths, property values, sources, campaigns and routes in this report are text that the visitors of the measured site sent, reported as it arrived.

NameRequiredDescriptionDefault
beforeNoThe next_before of the previous page.
user_idNoThe id the site passed to identify().
project_idYesThe project id, from list_projects.
session_idNoA visit id, from visits or funnel_subjects.

TDQS

A4/5.0
Behavior4/5

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

It goes significantly beyond the structured data by detailing behavioral constraints not captured in schemas or annotations, such as the sorting ('newest first'), pagination ('20 visits a page'), and how time is handled (project time zone vs. UTC offset).

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

Conciseness3/5

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

The description is quite dense and verbose, covering many details (data content, timezones, pagination, ID selection). While comprehensive, some sentences could be tightened without losing necessary context.

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

Completeness5/5

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

The description is exceptionally complete, covering not just what is retrieved (events/visits), but also how the data is structured (country/region included, null handling for cities), how it's paginated, and the critical behavioral trait of time zone management.

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

Parameters4/5

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

Although the schema is comprehensive (100% coverage), the description adds critical semantic meaning by clarifying that the input IDs ('session_id' or 'user_id') reference specific entities within the measurement system ('visits' or 'funnel_subjects').

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 purpose is clearly stated: to retrieve every event or visit for a specific user or session. It distinguishes itself by focusing on granular visit data rather than high-level summaries, which aligns with its functional scope compared to siblings like 'overview' or 'visits'.

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

Usage Guidelines4/5

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

The description provides strong usage guidance by explicitly stating the mutual exclusivity of inputs: 'It takes exactly one of session_id... or user_id.' This helps the agent avoid incorrect input combinations.

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. 2 tool updatesv0.6.1
    • Changedproperty_summary1 field changed
      • addedInput schema / properties / city
        Added value: +{
        +  "description": "An approximate city, by its exact name as devices lists it: Salvador. Needs region, since the same name exists in several regions.",
        +  "maxLength": 100,
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changedvisits1 field changed
      • addedInput schema / properties / city
        Added value: +{
        +  "description": "An approximate city, by its exact name as devices lists it: Salvador. Needs region, since the same name exists in several regions.",
        +  "maxLength": 100,
        +  "minLength": 1,
        +  "type": "string"
        +}
  2. 1 tool updatev0.5.0
    • Addedproperty_summary
  3. 1 tool updatev0.4.3
    • Changedrequests1 field changed
      • changedInput schema / properties / route / description
        Previous value: -"Also answer this route day by day: POST /orders/:id."New value: +"A route also answered day by day: POST /orders/:id."
  4. 15 tool updatesv0.4.0
    • First observedacquisition
    • First observeddevices
    • First observedengagement
    • First observedevent_properties
    • First observedfeatures
    • First observedfunnel
    • First observedfunnel_segments
    • First observedfunnel_subjects
    • First observedlist_projects
    • First observedoverview
    • First observedproject_settings
    • First observedrequests
    • First observedtime_of_day
    • First observedvisit_timeline
    • First observedvisits

TDQS

A3.8/5.0

Scored across 16 tools

Disambiguation4/5

Most tools target clearly distinct analytics reports: acquisition, devices, engagement, requests, overview, time_of_day, and the funnel family are separable by purpose. The closest overlaps are among funnel, funnel_segments, funnel_subjects, and the property-related tools, but their descriptions make the boundaries readable. No two tools appear to do the same thing.

Naming Consistency4/5

Names are consistently snake_case and mostly use descriptive report nouns, which is appropriate for an analytics reporting server. list_projects is the main deviation as a verb_noun discovery tool, but it is still readable and predictable within the set.

Tool Count4/5

At 16 tools the server is slightly on the heavy side, but each tool maps to a meaningful analytics report rather than redundant variations. The count is reasonable for a broad web/product analytics surface, though it sits just above the ideal 3-15 range.

Completeness4/5

The surface covers discovery, settings, overview, traffic sources, engagement, devices, backend requests, event/property analysis, funnels, visits, and time-of-day reporting. Minor gaps remain around raw event querying or export-style workflows, but core analytics questions can be answered without dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Provides AI agents read-only analytical access to a SQLite database over stdio, with tools for listing tables, describing schemas, and running paginated SQL queries.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to query Google Analytics 4 data—traffic, acquisition, top pages, audiences, events, conversions, and realtime metrics—through natural language. Supports local stdio use for a single user and HTTP multi-tenant OAuth for teams.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to read identification verdicts, search history, summarize entities, explain risk scores, and verify webhook signatures through read-only tools over stdio or streamable HTTP.
    6
    15 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Connects AI agents to New Relic observability data through the NerdGraph GraphQL API, running locally over stdio with a standard User API key. Enables NRQL queries, entity and alert lookups, log and trace investigation, deployment correlation, and metric comparisons while staying read-only by default.
    14
    Apache 2.0