Rius
Server Details
Query your AI agents' traces, errors, cost and alerts in Rius, the agent observability platform.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 29 tools
Each tool has a well-bounded read/action scope, and the descriptions explicitly cross-reference sibling tools (e.g. error_groups vs traces_summary, list_spans vs list_agent_traces vs get_agent_trace) to keep them apart. However, the set carries several superficially similar summary tools (agent_traces_summary, user_activity_summary, workspace_metrics_overview, agent_versions) that an agent could conflate before reading the fine print.
Names follow a steady snake_case verb_noun convention (list_*, get_*, create_*, update_*, delete_*, describe_*, compare_*, ack_alert) across the whole surface. Resources are addressed by stable nouns (alert_rule, alert_channel, agent_trace, span) so the pattern is predictable throughout.
29 tools is on the heavy side and leans past the comfortable range, but the domain genuinely spans traces, spans, agents, users, metrics, alerts, channels, rules, and API keys. It is heavy but not padded — nearly every tool maps to a distinct resource/action rather than a duplicate.
The surface covers the full observe-and-alert lifecycle: trace/span/agent/user discovery, per-scope summaries, version comparison, error grouping, lifecycle events, and complete CRUD for alert rules and channels with a preview/confirm delete flow. Catalog discovery tools (search/alert/metrics) close the 'don't guess a key' gap, leaving no obvious dead ends.
Available Tools
29 toolsack_alertAcknowledge AlertAIdempotentInspect
Acknowledge an alert: record that a human has seen it, so it stops notifying.
Acknowledging is NOT resolving. The alert stays open and keeps counting occurrences; only the detector resolves it, once the condition clears. Nothing in Rius can force an alert closed.
Only available on an interactive (OAuth) connection: the acknowledgement records which user saw the alert, and an API key is not a user.
alert_id: the alert's id, from list_alerts.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
I've seen that alert, stop pinging me about it.
{ "name": "ack_alert", "arguments": { "alert_id": "2f9c…" } }| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, idempotent=true, destructive=false), and the description adds substantial context beyond them: the alert stays open and keeps counting occurrences, nothing can force-close it, and the tool requires an interactive OAuth connection because an API key is not a user. That auth constraint is exactly the kind of behavior an agent must know before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then the ack-vs-resolve distinction, then the auth constraint, then parameter notes and a runnable example. Every sentence earns its place and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a low-complexity write tool with two parameters, the description covers purpose, the ack/resolve boundary, the auth requirement, and both parameters — nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: alert_id is 'the alert's id, from list_alerts' (source documented) and workspace accepts an id, name, or org-name/workspace-name form with a stated default. Both parameters are fully disambiguated beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Acknowledge an alert: record that a human has seen it') and immediately distinguishes the action from the sibling concept of resolving ('Acknowledging is NOT resolving'). An agent can tell this apart from get_alert/list_alerts without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (a human has seen the alert so it stops notifying) and an explicit when-not by ruling out resolution ('only the detector resolves it, once the condition clears'), plus an auth precondition. It does not name a concrete alternative tool, which keeps it just 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.
agent_error_groupsGroup Agent ErrorsARead-onlyInspect
Group a window's errored spans by failure class — exception type and a normalised message — so a page of failures reads as its handful of causes. One row per group with its count, distinct traces, last occurrence, the instances it hit and sample trace ids for get_agent_trace.
This is the same read the Rius console's Agent page draws its
Exceptions figure from. The unit is errored SPANS with this span's own
identity: count is not agent_traces_summary's failed_traces (runs whose
ROOT span errored) and the two are labelled, never reconciled or added.
The grouping reads span events, so the window is capped like any other
unindexed query; a window the server refuses comes back saying so.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of start/end
is not given.
start: optional absolute RFC3339 lower bound (e.g. "2026-08-01T00:00:00Z");
overrides the hours-derived value when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived value
when given.
agent: optional exact agent name — this SPAN's agent identity, the same value
agent= filters on for list_spans. Read a name off list_agents or off
root_agent on list_agent_traces rather than guessing one.
instance: optional exact instance id, narrowing to one running copy of agent.
limit: groups per page (default 20, server max 100). The reply says how many
errored spans the whole window holds, so a full page is visible as one.
Example:
What is failing for the planner agent today?
{ "name": "agent_error_groups", "arguments": { "agent": "planner" } }Group this week's failures across every agent.
{ "name": "agent_error_groups", "arguments": { "hours": 168, "limit": 50 } }Is one copy of planner producing the errors?
{
"name": "agent_error_groups",
"arguments": { "agent": "planner", "instance": "inst-planner-01" }
}| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| agent | No | ||
| hours | No | ||
| limit | No | ||
| start | No | ||
| instance | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), yet the description adds real behavioural context: grouping reads span events so the window is capped like an unindexed query, refusals surface in the reply, and pagination is interpretable because the response reports total errored spans for the window. It does not disclose rate limits or exact cap values, which keeps it at 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the semantic caveat, then parameter docs, then worked examples. Every section earns its place, though the console-attribution sentence and the dual restatement of the count/failed_traces distinction are slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still explains the row shape (count, distinct traces, last occurrence, instances, sample trace ids) and clarifies what the count does and does not mean. Combined with full parameter coverage and window-cap disclosure, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries full burden and does so for all seven parameters: workspace formats and default, hours default and interaction with start/end, absolute RFC3339 bounds with override behaviour, agent as this span's identity with guidance to read it from list_agents, instance narrowing, and limit default plus server max. It adds meaning well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource and grouping key ('Group a window's errored spans by failure class — exception type and a normalised message') and explicitly distinguishes itself from agent_traces_summary by contrasting `count` with `failed_traces`. An agent can tell this apart from the sibling summary tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The examples make concrete usage contexts explicit (per-agent failure triage, cross-agent weekly rollup, instance-level narrowing), and the text routes to get_agent_trace for sample ids and list_agents/list_agent_traces for name discovery. It clearly marks the boundary with agent_traces_summary, but never states an explicit when-not-to-use rule, 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.
agent_lifecycle_eventsList Agent Lifecycle EventsARead-onlyInspect
The lifecycle log of a workspace's agent instances — when each copy started, finished, was lost or recovered — newest first, timed when it happened rather than when a page was loaded.
This is the same read the Rius console's Agent page draws its timeline
from. The kinds are the server's: started (first heartbeat), finished
(clean-shutdown ping), lost (silent past the gone threshold, timed at the
sweep tick that noticed and carrying last_seen_at for the last ping before
the silence) and recovered (a ping after lost). stale is a read-time
status on list_agents, never an event. open_trace_count and
open_traces say what was in flight at a lost or recovered moment.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of start/end
is not given.
start: optional absolute RFC3339 lower bound (e.g. "2026-08-01T00:00:00Z");
overrides the hours-derived value when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived value
when given.
agent: optional exact agent name; omit for every agent in the workspace.
instance: optional exact instance id; composes with agent.
limit: max rows (default 50, server max 200).
cursor: opaque page token from a previous call's next-page hint, to fetch
the page after it.
Example:
When did the planner agent's copies die today?
{ "name": "agent_lifecycle_events", "arguments": { "agent": "planner" } }Everything that happened to inst-planner-01 this week.
{
"name": "agent_lifecycle_events",
"arguments": { "hours": 168, "instance": "inst-planner-01" }
}| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| agent | No | ||
| hours | No | ||
| limit | No | ||
| start | No | ||
| cursor | No | ||
| instance | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: ordering (newest first), event-time vs page-load-time semantics, the meaning of each kind, the timing rule for 'lost' (sweep tick that noticed) plus the last_seen_at caveat, and the provenance note that this is the same read the console timeline uses. It does not cover pagination behavior or row shape, but the annotations already establish the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then event semantics, then a per-parameter block, then worked examples — a sensible order. It is long, and the multi-line parenthetical for `lost` is dense, but nearly every sentence adds operational detail rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be detailed, yet the description still explains the key event payload fields (last_seen_at, open_trace_count, open_traces). For an 8-param read tool with zero schema descriptions, this is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does so for all 8 parameters: workspace id/name/org-qualified form with default, hours default and its interaction with start/end, RFC3339 format with example values and override precedence, agent exactness, agent+instance composition, limit default and server max (200), and the opaque cursor's origin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('lifecycle log of a workspace's agent instances') and enumerates the exact event kinds it returns (started/finished/lost/recovered). It also explicitly distinguishes itself from the sibling list_agents by noting 'stale' is a read-time status there, never an event here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent to alternatives with conditions: use list_workspaces to discover workspaces, list_agents for current status rather than history. Two concrete example queries ('when did planner's copies die today', 'everything that happened to inst-planner-01 this week') demonstrate when to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_traces_summarySummarize Agent TracesARead-onlyInspect
Summary KPIs for agent traces over a time window, for the whole workspace or
for ONE agent: trace count, LLM calls, error rate, failed vs errored traces,
sessions, total/average cost, token usage, and latency and TTFT percentiles.
With group_by="bucket" it also answers the same figures per time bucket,
the read behind the console's Drift figure, so "is this agent getting slower
or more expensive over the week" is one call.
Scope it with agent to get that agent's own numbers. This is the same
read, with the same arguments, that the Rius console's agent page makes,
so a number you report here and a number a human reads there are the same
number — not two measurements that happen to agree.
Read the Failed traces and Errored traces lines as the two different questions they are, and do not add them together or report one as "errors": a run whose ROOT span errored FAILED, while a run that errored somewhere and then recovered did not. The error rate is errored traces over traces.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of start/end is
not given.
start: optional absolute RFC3339 lower bound (e.g. "2026-08-01T00:00:00Z");
overrides the hours-derived value when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived value
when given.
service: optional service-name filter (traces that involve this service).
agent: optional exact agent-name filter, matched against the trace's root span
— the same value the root_agent column reports on list_agent_traces, so
read a name off a listing rather than guessing one. Agent identity is its
own field, not the service name: a run that declares no agent falls back
to its service name, so equal root_agent and service are that
fallback, not two facts.
instance: optional exact agent-instance filter, narrowing to one running copy
of agent.
filters: optional list of {"field": ..., "op": ..., "values": [...]} clauses,
ANDed together and composable with the named parameters above — the same
grammar and the same field registry as list_agent_traces, so a slice you
listed and the summary of that slice cannot disagree. Call
describe_search_catalog before guessing a key; a rejected clause comes
back naming itself.
group_by: optional; "bucket" adds one row per time bucket under the
whole-window figures, with the same definitions and composable with every
scope argument above. A trace counts once, whole, in the bucket its first
span opened in, so the rows sum to the whole-window figures. Rows are
sparse: a bucket no trace opened in has NO row, so never read an absent
bucket as zero traces, zero cost or a 0% error rate.
bucket: optional grain for group_by="bucket": "minute", "hour" or
"day". Omit it and the server picks from the window (minute up to 2h,
hour up to 48h, day beyond; day buckets open at UTC midnight, so the
first may be partial). A grain that cuts the window into more than 1000
buckets is refused with the count in the message.
Example:
How did my agents do over the last 24 hours?
{ "name": "agent_traces_summary", "arguments": { "hours": 24 } }How is the planner agent doing this week?
{
"name": "agent_traces_summary",
"arguments": { "hours": 168, "agent": "planner" }
}Is one copy of planner worse than the others?
{
"name": "agent_traces_summary",
"arguments": { "agent": "planner", "instance": "inst-planner-01" }
}Summarize the checkout-agent service this week.
{
"name": "agent_traces_summary",
"arguments": { "hours": 168, "service": "checkout-agent" }
}What do planner's gpt-4o runs cost?
{
"name": "agent_traces_summary",
"arguments": {
"agent": "planner",
"filters": [{ "field": "model", "op": "eq", "values": ["gpt-4o"] }]
}
}Is planner getting slower or more expensive over the week?
{
"name": "agent_traces_summary",
"arguments": { "hours": 168, "agent": "planner", "group_by": "bucket" }
}Summarize traces between two specific dates.
{
"name": "agent_traces_summary",
"arguments": { "start": "2026-08-01T00:00:00Z", "end": "2026-08-08T00:00:00Z" }
}| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| agent | No | ||
| hours | No | ||
| start | No | ||
| bucket | No | ||
| filters | No | ||
| service | No | ||
| group_by | No | ||
| instance | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, yet the description adds substantial semantics beyond them: failed vs errored traces are defined and must not be summed, error rate is defined as errored/traces, a trace counts whole in its first-span bucket, sparse buckets mean absent is not zero, and buckets over 1000 are refused. It also discloses that this is the identical read the Rius console performs, so figures reconcile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the KPI list and the core routing rule, then per-parameter documentation, then examples — a logical order with almost no filler. It is long, and seven examples plus two separate expository paragraphs on failed/errored semantics push it toward the verbose end, but for a ten-parameter tool with zero schema coverage that length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, yet the description goes further by naming which KPIs are returned and how derived figures are computed. Combined with complete parameter documentation and failure-mode notes (rejected filter clauses, refused grain), an agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: it documents all ten parameters including defaults (hours=24), override precedence (start/end over hours), the workspace org-name/workspace-name disambiguation form, the agent-vs-service fallback distinction, filters grammar and composition, bucket grain auto-selection thresholds, and the day-bucket UTC-midnight partial-first-bucket caveat.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (summary KPIs for agent traces) and enumerates exactly what is returned: trace count, LLM calls, error rate, sessions, cost, token usage, latency/TTFT percentiles. It also implicitly distinguishes itself from the sibling list_agent_traces by framing this as the aggregate read of the same population, and explicitly names the console Drift figure it backs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing conditions: use list_workspaces to discover workspace ids, call describe_search_catalog before guessing a filter key, and read an agent name off list_agent_traces rather than guessing. It also states when to reach for group_by="bucket" (trend questions) versus the flat window figures, plus seven worked scenario examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_versionsList Agent VersionsARead-onlyInspect
The versions ONE agent ran in a time window, on two dimensions that are
kept apart and must not be read as synonyms: agent is the agent
definition — prompt, tools, policy — as rius.main_agent.version stamps it,
and service is the build that ran it, as service.version stamps it. A
prompt edit ships without a deploy and a deploy without touching the agent,
so the two move independently. Each row carries its traces, failed traces,
failed rate and when it was first and last seen within the window.
This is the same read the Rius console's Agent page draws its Versions
figure from, and every row is ROOT-scoped like the registry fields, so a row's
numbers equal agent_traces_summary with
filters=[{"field": "agent_version" | "service_version", "op": "eq", "values": [version]}]. Use it to learn which two values to hand
compare_agent_versions, or to see when a version appeared. Rows are newest-seen
first within a dimension and capped at 50 per dimension; the totals count
past the cap.
agent: the exact agent name (required: versions are per agent). Read a name
off list_agents or off root_agent on list_agent_traces rather than
guessing one.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of start/end
is not given.
start: optional absolute RFC3339 lower bound (e.g. "2026-08-01T00:00:00Z");
overrides the hours-derived value when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived value
when given.
instance: optional exact instance id, narrowing to one running copy of agent.
Example:
Which versions of planner ran this week?
{ "name": "agent_versions", "arguments": { "agent": "planner", "hours": 168 } }When did planner's new prompt version first show up?
{ "name": "agent_versions", "arguments": { "agent": "planner", "hours": 720 } }| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| agent | Yes | ||
| hours | No | ||
| start | No | ||
| instance | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only/no-open-world, but the description adds substantive behavior: rows are ROOT-scoped like registry fields, ordered newest-seen first per dimension, capped at 50 per dimension with totals counting past the cap, and row contents (traces, failed traces, failed rate, first/last seen). These are the operational traits an agent needs and none are in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the two-dimension warning, followed by equivalence, then parameters, then two focused examples — a strong structure. It is verbose in places (the repeated workspace parenthetical), but nearly every sentence adds load-bearing detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be enumerated, yet the description still previews row fields. Combined with full parameter documentation, usage routing, cap/ordering semantics, and named siblings, an agent has everything required to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry all parameter meaning — and it does. Every one of the six parameters is documented with its default and semantics, including RFC3339 format for start/end with the 'overrides the hours-derived value' precedence rule, workspace name-vs-id-vs-org/workspace disambiguation, and instance as a narrowing filter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('The versions ONE agent ran in a time window') and then carefully disambiguates the two dimensions (agent definition vs. service build) that an agent could easily conflate. It names the sibling it feeds into (compare_agent_versions), so it is unmistakable against its neighbors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: 'Use it to learn which two values to hand compare_agent_versions, or to see when a version appeared.' It also gives the equivalent agent_traces_summary query with exact filter syntax, so an agent knows the overlap and when to pick one over the other.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_agent_versionsCompare Agent VersionsARead-onlyInspect
Two versions of ONE agent side by side over the same window — traces, failed rate, cost per trace, latency p50, TTFT p50 and tokens per trace — with the change between them, so "did v8 make it worse" is one call.
It is agent_traces_summary twice, each scoped through the registry filter for one version, and the same six rows and delta rules as the Rius console's compare tiles, so an agent and a human read one change. The change is in percentage points for the failed rate ("+1.0 pp", never "+50%") and a percent of the base otherwise; a dash means a side is unknown or the base is zero, never "no change". Below 20 traces on either side the reply says the differences can be noise; it never claims significance either way.
Refuses, rather than answering, where this deployment's filter registry does not advertise the version field: an older core would ignore the filter and return the whole agent's numbers on both sides, which would read as a confident "no change".
agent: the exact agent name (required). Read it off list_agents or off
root_agent on list_agent_traces.
dimension: which version identity to compare — agent (the agent
definition, rius.main_agent.version) or service (the build,
service.version; build is accepted as a synonym). The two are not
interchangeable: read the values off agent_versions, which labels each.
base: the older version's exact value, as agent_versions lists it.
head: the newer version's exact value; the change is head against base.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of start/end
is not given.
start: optional absolute RFC3339 lower bound (e.g. "2026-08-01T00:00:00Z");
overrides the hours-derived value when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived value
when given.
instance: optional exact instance id, narrowing both sides to one running copy
of agent.
Example:
Did planner's version 8 make things worse than 7 this week?
{
"name": "compare_agent_versions",
"arguments": {
"agent": "planner", "dimension": "agent", "base": "7", "head": "8",
"hours": 168
}
}Compare the last two builds of planner.
{
"name": "compare_agent_versions",
"arguments": {
"agent": "planner", "dimension": "service", "base": "2.3.1", "head": "2.4.0"
}
}| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| base | Yes | ||
| head | Yes | ||
| agent | Yes | ||
| hours | No | ||
| start | No | ||
| instance | No | ||
| dimension | Yes | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint, so the description carries real behavioral weight and does: delta units (percentage points for failed rate, percent of base otherwise), the dash-means-unknown convention, the sub-20-trace noise caveat, and the refusal-rather-than-misanswer policy. This is exactly the kind of edge-case disclosure annotations cannot provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the change semantics before the parameter block, and every paragraph earns its place. It is dense rather than bloated, though the prose runs long enough that a tighter version could lose nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter comparison tool with an output schema, everything an agent needs to call it correctly is present: sourcing of exact version strings, refusal boundaries, delta interpretation, and ambiguity resolution for workspace names. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully and does: every one of the nine parameters is explained, including where to source values (list_agents, agent_versions, list_workspaces), the base/head orientation rule, the dimension enum with a 'build' synonym, and the start/end-vs-hours override precedence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and scope: 'Two versions of ONE agent side by side over the same window', then enumerates exactly which six metrics are compared. It names the sibling relationship ('agent_traces_summary twice') so an agent can tell it apart from the single-version summary tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: this is agent_traces_summary applied to two versions, and it specifies the refusal condition (deployments whose filter registry lacks the version field). The two worked examples ('did v8 make it worse' vs 'compare the last two builds') show the dimension choice in context, and the dimension note warns the two identity axes are not interchangeable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_alert_channelCreate Alert ChannelAInspect
Create a place for alerts to be delivered: a webhook, an email list, or Slack.
This provisions a real outbound effect. Once a rule points at this channel, alert content leaves the platform to wherever you named — for a webhook, an HTTP POST to that URL. The payload carries the alert title (which is a span's error message, so it can contain model output), its labels, counts, and a sample of trace ids.
Needs the channels:manage capability.
name: a label for the channel, 1 to 120 characters.
channel_type: webhook, email, or slack.
url: for a webhook — the https URL to POST to.
recipients: for email — 1 to 20 addresses.
slack_channel_id: for Slack — a channel id from the connected Slack workspace.
Slack must be connected in the console first.
enabled: whether it starts receiving deliveries. Defaults to true.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
Send my alerts to this webhook.
{ "name": "create_alert_channel", "arguments": {
"name": "ops webhook", "channel_type": "webhook",
"url": "https://hooks.example.com/rius"
} }| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| name | Yes | ||
| enabled | No | ||
| workspace | No | ||
| recipients | No | ||
| channel_type | Yes | ||
| slack_channel_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavioral details: this provisions a real outbound effect, alert content leaves the platform via HTTP POST, and the payload can contain model output from span error messages. It also states the required `channels:manage` capability, giving the agent a clear safety and permission picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and outbound-effect details, then moves to capability requirements, parameter semantics, and a concrete example. Every sentence earns its place because the schema provides no parameter descriptions, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a multi-type creation tool with 0% schema description coverage, the description covers purpose, side effects, required capability, all parameter semantics, defaults, and an example. Since an output schema exists, return values need not be explained, so nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by documenting all seven parameters, including constraints (name 1-120 characters, recipients 1-20 addresses), type-specific semantics (`url` for webhook, `slack_channel_id` for Slack), the Slack-connection prerequisite, and workspace format details. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: create a delivery channel for alerts, naming the three supported types (webhook, email, Slack). It distinguishes itself from sibling create_alert_rule by explaining that this tool provisions the destination rather than the rule, so an agent can pick correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly gives context for when to use the tool: creating a place for alerts to be delivered, with each channel type explained. It does not explicitly name alternatives or exclusions, such as using update_alert_channel for edits, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_alert_ruleCreate Alert RuleAInspect
Create a custom alert rule. Call describe_alert_catalog first.
The rule fires when every threshold in rules holds at once, over the same
rolling window, for the traffic left after every filter in filters. There is
no OR: for alternatives, create a second rule.
Predefined rules cannot be created — they already exist per workspace. Use update_alert_rule to configure one.
name: what to call the rule, 1 to 120 characters.
rules: the thresholds, each {"metric":…, "aggregation":…, "operator":…, "value":…}. At least one, at most 10, and each (metric, aggregation) pair
only once. Operators: lt, lte, gt, gte, eq.
window_minutes: the rolling window every threshold is measured over, 5 to 1440.
filters: optional narrowing, each {"field":…, "operator":…, "values":[…]}.
ANDed. Omit to watch the whole workspace. eq and ne take exactly one
value; in and not_in take one or more. Which operators a field admits is
per field — describe_alert_catalog lists them. Values bind verbatim, so
pass them exactly as the data spells them: span_kind is the raw
OpenInference LLM, not llm, and a lowercased value creates a rule
that saves and then never fires.
channel_ids: where firings are delivered, from list_alert_channels. Supplying
this needs the channels:manage capability, because choosing a destination
is a destination decision. Omitting it leaves the rule on the region's
default webhook.
enabled: whether detection starts immediately. Defaults to true.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
Alert me when the checkout agent starts erroring.
{ "name": "create_alert_rule", "arguments": {
"name": "checkout errors",
"filters": [{"field": "service", "operator": "eq", "values": ["checkout"]}],
"rules": [{"metric": "errors", "aggregation": "count", "operator": "gte", "value": 5}]
} }Example:
Tell me if p95 cost per trace goes over two dollars.
{ "name": "create_alert_rule", "arguments": {
"name": "cost spike",
"window_minutes": 60,
"rules": [{"metric": "cost", "aggregation": "p95", "operator": "gt", "value": 2.0}]
} }| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| rules | Yes | ||
| enabled | No | ||
| filters | No | ||
| workspace | No | ||
| channel_ids | No | ||
| window_minutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false), and the description adds substantial context beyond them: rules are ANDed with no OR, filters are ANDed, values bind verbatim (the lowercase `llm` gotcha), channel_ids requires the `channels:manage` capability, omitting channel_ids falls back to the region default webhook, and enabled defaults to true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by per-parameter semantics and two worked examples; the structure is easy to scan. It is long, but nearly every line maps to an undocumented parameter or a non-obvious behavioral constraint, so little is wasted — the two examples are the only arguably expendable material.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 7-parameter mutation tool with 0% schema coverage is fully documented, and since an output schema exists the description is not obliged to explain return values. Nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: name length bounds, rules element shape with the lt/lte/gt/gte/eq operator set plus the 1–10 count and (metric, aggregation) uniqueness constraint, window_minutes range, filter shape with eq/ne/in/not_in arity rules, channel_ids source, and workspace id/name/`org/workspace` formats.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Create a custom alert rule") and immediately distinguishes this from predefined rules and from update_alert_rule. An agent can tell it apart from siblings like create_alert_channel or update_alert_rule without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites ("Call describe_alert_catalog first"), an explicit exclusion ("Predefined rules cannot be created"), and a named alternative ("Use update_alert_rule to configure one"). It also routes to list_alert_channels for channel_ids, so both the when and the where-next are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_api_keyCreate API KeyAInspect
Create a new API key in one of your workspaces. Requires admin access in that workspace. The plaintext key is shown exactly once in the response. It is never retrievable again after this call, so save it immediately.
Not available when this MCP connection is itself authenticated with an API key (headless mode): a leaked agent key must not be able to mint more keys. Mint keys from an interactive (OAuth) session or the console instead.
workspace: optional workspace id, workspace name, or org-name/workspace-name
when the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
name: a label for the key, shown in the workspace's key list later.
scopes: key capabilities: ["ingest"] (default) to send telemetry, add "read"
(["ingest", "read"] or ["read"]) for a key that can also be used as the
Authorization bearer for headless MCP connections.
The alert-management capabilities (alerts:manage, channels:manage) are
deliberately NOT mintable here — an admin issues those in the console,
because a key minted by an agent never expires by default and would be
an unbounded credential to leak.
Example:
Create an API key so this agent can send traces.
{ "name": "create_api_key", "arguments": { "name": "my-agent" } }Give it a key that can also read traces over MCP.
{ "name": "create_api_key", "arguments": { "scopes": ["ingest", "read"] } }| Name | Required | Description | Default |
|---|---|---|---|
| name | No | glassflow-connect-agent | |
| scopes | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write, non-idempotent profile, and the description adds material context beyond them: admin access is required, the plaintext key is shown exactly once and never retrievable again, headless-mode minting is blocked to prevent key amplification, and why certain scopes are withheld. These are exactly the operational facts an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then requirement, the one-shot key warning, the availability restriction, parameter docs, and examples. Every sentence carries information, though the two example blocks add length that a shorter inline illustration might have covered. Minor efficiency cost, no real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description instead covers the non-obvious return semantics (key shown once). Combined with prerequisites, mode restrictions, and full parameter docs for a 3-param, 0%-coverage schema, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: workspace documents accepted id/name/'org-name/workspace-name' forms and the default, name states it is a display label, and scopes enumerates the valid values and defaults ('ingest', optionally 'read') plus the exclusions. This fully compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Create a new API key in one of your workspaces.' It also distinguishes itself from the alert-channel/rule creation siblings by stating that alert-management scopes are deliberately not mintable here. An agent can identify the resource, scope, and boundary without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not: unavailable when the MCP connection is authenticated by an API key (headless mode), and the agent is told to mint from an interactive OAuth session or the console instead. It also routes the agent to list_workspaces for workspace discovery. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_alert_channelDelete Alert ChannelADestructiveInspect
Delete a notification channel. Irreversible.
Takes two calls, like delete_alert_rule: once to preview, once with the phrase.
Any rule still pointing at this channel loses that destination silently and falls back to the region's default webhook — it does not start failing loudly. Consider update_alert_channel with enabled false instead, which is reversible.
Needs the channels:manage capability.
channel_id: the channel's id, from list_alert_channels.
confirm: the phrase from the first call's output.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
Remove the old ops webhook.
{ "name": "delete_alert_channel", "arguments": { "channel_id": "8a1…" } }| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| workspace | No | ||
| channel_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation by disclosing the silent side effect on dependent rules ('loses that destination silently ... does not start failing loudly'), the required `channels:manage` capability, and the two-phase confirmation requirement. These are exactly the behavioral facts an agent cannot infer 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive verb and irreversibility, then consequence, then alternative, then auth, then params. Well ordered, but the trailing example block restates argument shape that the schema and the preceding param sentences already cover, adding some length without new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, capability-gated tool with an output schema, the description covers consequences, prerequisites, the confirm handshake, and parameter sourcing. Nothing needed to invoke it safely is missing, and return values are rightly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full load and does: channel_id is sourced from list_alert_channels, confirm is the phrase from the first call's output, and workspace accepts id/name or org-name/workspace-name with a default. All three parameters are disambiguated beyond their bare types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a notification channel') and immediately qualifies it with 'Irreversible.' It also names related siblings (delete_alert_rule, list_alert_channels, update_alert_channel), so an agent can place it precisely in the tool graph.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives a when-not-to-use path: 'Consider update_alert_channel with enabled false instead, which is reversible.' It also documents the two-call preview+confirm flow, which is non-obvious invocation guidance rather than mere context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_alert_ruleDelete Alert RuleADestructiveInspect
Delete a custom alert rule AND its entire firing history. Irreversible.
Takes two calls. Call it without confirm to see what would be destroyed and
get the phrase to pass back; call it again with that phrase to go ahead.
Prefer update_alert_rule with enabled false: that stops detection and keeps the history, and can be undone. Predefined rules cannot be deleted at all.
ref: the custom rule's uuid, from list_alert_rules.
confirm: the phrase from the first call's output.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
Delete the cost spike alert.
{ "name": "delete_alert_rule", "arguments": { "ref": "9c2…" } }| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| confirm | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes well beyond them: it specifies that the entire firing history is destroyed, that the action is irreversible, and that a confirm phrase from the first call gates the second. That is exactly the extra context an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive and irreversible nature is front-loaded in the first sentence, followed by the call protocol, the preferred alternative, and then per-parameter notes plus a concrete example. Every sentence earns its place and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-step tool this covers the full operational picture: irreversibility, the confirm handshake, the preferred non-destructive alternative, eligibility limits, parameter sourcing, and defaults. Since an output schema exists, the description rightly does not spend space explaining return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the burden, and it does: ref is the custom rule's uuid from list_alert_rules, confirm is the phrase returned by the first call's output, and workspace accepts an id, name, or org-name/workspace-name with a default noted. Each parameter gains meaning not present in the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a custom alert rule AND its entire firing history') and immediately distinguishes scope with 'custom' and 'Irreversible'. It also names the sibling alternative (update_alert_rule) and rules out a class of targets (predefined rules), so an agent can tell it apart without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not: prefer update_alert_rule with enabled false to keep history and stay reversible, and predefined rules cannot be deleted at all. It also documents the required two-call confirm protocol, so the invocation sequence is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_alert_catalogDescribe Alert CatalogARead-onlyInspect
Describe what you can alert on: the fields, metrics and limits for a custom rule.
Read this before calling create_alert_rule. It returns the filter fields, the metrics with the aggregations each one actually supports, the comparison operators, and the allowed window — plus the constraints the catalog itself does not advertise.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
field: optionally a filter field id (for example "service"), to list the values
actually seen in this workspace over the last 24h.
Example:
What can I alert on?
{ "name": "describe_alert_catalog", "arguments": {} }Example:
Which services could I filter an alert to?
{ "name": "describe_alert_catalog", "arguments": { "field": "service" } }| Name | Required | Description | Default |
|---|---|---|---|
| field | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. Beyond that the description adds real behavioral context: it discloses that the response includes 'constraints the catalog itself does not advertise' and that the field parameter returns values 'actually seen in this workspace over the last 24h', which is non-obvious. It stops short of auth, rate-limit, or pagination notes, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the create_alert_rule prerequisite, then parameter docs, then examples. Every element is useful, though the two fenced examples add bulk for a two-parameter read tool and the description is on the long side. Nothing is wasted, but it could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, yet the description summarizes what comes back and how it differs by parameter. An agent has the prerequisite ordering, both parameter semantics, and the response shape — nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: it documents both parameters with their default behavior, the three accepted workspace id forms, and a concrete field example ('service') plus the 24h lookback semantics. This meaning is entirely absent from the schema, so the description is doing genuine work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: describes what you can alert on, listing the exact contents returned (filter fields, metrics with supported aggregations, operators, allowed window). It also distinguishes itself from create_alert_rule and, implicitly, describe_search_catalog, so an agent can separate it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Read this before calling create_alert_rule', giving a clear when-to-use trigger and a sequencing prerequisite relative to a named sibling. The two worked examples map common user intents to the two call shapes, reinforcing when each parameter applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_search_catalogDescribe Search CatalogARead-onlyInspect
Describe what you can filter traces and spans on, before you guess a key.
Returns the filter grammar — every field, its type, the operators it admits,
and what a filter on it means for a TRACE — merged with the keys this
workspace has actually produced. Read it before composing filters for
list_agent_traces or list_spans; a guessed key is a rejected call.
Cost model, in the order worth trying: promoted columns (source: column)
are cheap over any window; attr.<key> and resource.<key> reach the
customer's own attributes, cost roughly 10x more, and are accepted only over
windows of 31 days or less — so narrow with a column first, then add one.
workspace: optional workspace id, name, or org-name/workspace-name
(defaults to your default).
field: optionally a key, to list the values seen in this workspace. Accepts
either spelling — "tool.name" or "attr.tool.name".
prefix: optionally narrow the key list, e.g. "tool." to find a customer's
own tool attributes.
hours: lookback for the key and value lists (default 24).
Example:
What can I filter traces on?
{ "name": "describe_search_catalog", "arguments": {} }What tool attributes does this workspace set?
{ "name": "describe_search_catalog", "arguments": { "prefix": "tool." } }Which models could I filter to?
{ "name": "describe_search_catalog", "arguments": { "field": "model" } }| Name | Required | Description | Default |
|---|---|---|---|
| field | No | ||
| hours | No | ||
| prefix | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description goes well beyond that with a genuine cost model: promoted columns are cheap over any window, attr./resource. keys cost ~10x and are only accepted over windows of 31 days or less. That operational context is exactly the behavioral detail an agent needs and 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core instruction, then the grammar/cost model, then per-parameter notes and examples. It is longer than strictly necessary and the grammar explanation is a touch expansive, but nearly every line earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a zero-required-parameter, read-only discovery tool, the description covers purpose, sequencing, cost, and every parameter including worked examples.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does so for all four parameters: workspace (accepts id, name, or org/workspace, with default), field (both spellings), prefix (with an example), and hours (default 24). Worked JSON examples reinforce each parameter's intent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: describing the filter grammar for traces and spans. It is clearly distinguished from the sibling list_agent_traces and list_spans, which it positions itself as a prerequisite to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to read this before composing `filters` for list_agent_traces or list_spans, and warns that a guessed key is a rejected call. The cost model gives ordered guidance ('narrow with a column first, then add one'), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_agent_traceGet Agent TraceARead-onlyInspect
Get one agent trace's span waterfall (spans in time order, indented by depth).
The header names the root span's agent and each row carries its own, so a
multi-agent run shows which agent owned which span; pass either name back to
list_agent_traces or list_spans as agent to see that agent's other work.
The header also names who sent the trace — the sending ingest key's own
email, which a console-made key usually carries too (it falls back to
its creator's own email). Blank only when the key could not be resolved
or the trace predates attribution.
The header also names the root span's session; pass it to
list_spans(session_id=...) for the rest of that conversation. A session
equal to the trace id means the run carried no session of its own. A trace
whose spans carry more than one session gets a per-span session column.
trace_id: the trace id (from list_agent_traces).
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
include_content: when true, also return each span's captured content: LLM
input/output messages, agent/tool input/output values, status messages and
events. Off by default because full message content can be very large; pass
true when you need to see what an LLM, agent, or tool span actually said,
received, or returned (e.g. to inspect prompts, completions, or tool I/O).
Captured content is subject to the workspace's privacy controls: spans exported with capture_content=False or a mask have nothing extra to show.
Example:
Break down trace 4bf92f3577b34da6a3ce929d0e0e4736 for me.
{
"name": "get_agent_trace",
"arguments": { "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736" }
}What did the LLM actually say in that failed span?
{
"name": "get_agent_trace",
"arguments": {
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"include_content": true
}
}| Name | Required | Description | Default |
|---|---|---|---|
| trace_id | Yes | ||
| workspace | No | ||
| include_content | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, yet the description adds real behavior: include_content is off by default because content can be very large, captured content is subject to workspace privacy controls (capture_content=False or masks yield nothing), and the attribution field is blank only when the key can't be resolved or the trace predates attribution. That is substantive disclosure beyond the safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the tool's action, then parameter docs, then worked examples. Most sentences earn their place, but the multi-sentence digression on the ingest key's own email and its fallback to the creator's email is deeper detail than an agent needs to select or call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description still covers the waterfall layout, the header/row agent attribution, session semantics, and the multi-session per-span column. For a read-only three-parameter tool this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: trace_id is sourced from list_agent_traces, workspace accepts an id/name/`org-name/workspace-name` disambiguator and defaults to the default workspace, and include_content's semantics and default are spelled out. All three parameters gain meaning not present in the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the exact output shape: 'Get one agent trace's span waterfall (spans in time order, indented by depth).' It also implicitly distinguishes itself from list_agent_traces (enumerating traces) and list_spans (per-span queries) by describing the waterfall-of-one-trace scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete follow-up routing ('pass either name back to list_agent_traces or list_spans as `agent`', 'pass it to `list_spans(session_id=...)` for the rest of that conversation') and states exactly when to set include_content=true. It never states when not to use this tool, but the context for use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_alertGet AlertARead-onlyInspect
Read one fired alert in full, with its root-cause finding when one exists.
Use this after list_alerts to understand a single alert: its labels, the sample trace ids behind it, and — if root-cause analysis ran for it — the investigation's written finding.
alert_id: the alert's id, from list_alerts.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
Why did that alert fire?
{ "name": "get_alert", "arguments": { "alert_id": "2f9c…" } }| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds what the agent actually gets back: labels, sample trace ids, and the investigation's written finding when root-cause analysis ran. That conditional return behavior is genuine context beyond the annotations, though permissions or failure modes are not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by usage, parameter notes, and a worked example — a sensible order with little wasted text. The JSON example largely restates what the parameter notes already convey, which is mildly redundant but still aids invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be documented, yet the description still summarizes the key payload fields. Combined with the parameter notes and the list_alerts handoff, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does: alert_id is defined as the id from list_alerts, and workspace is explained as an optional id, name, or `org-name/workspace-name` disambiguator with a stated default. Both parameters are fully specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (one fired alert), and explicitly delimits scope to a single alert including its root-cause finding when present. This clearly separates it from list_alerts and the trace-oriented siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this after list_alerts to understand a single alert" gives a clear trigger and names the preceding tool in the workflow. It does not state when not to use it (e.g. versus get_agent_trace for raw trace inspection), so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meGet My IdentityARead-onlyInspect
Get your own identity and access context.
Returns your user (id, external id, email), every organization you belong to with your role in each ("admin" or "member"), and the workspaces you can access — an interactive (OAuth) connection spans every one of those orgs, so workspaces are grouped by org when you belong to more than one. If you have not yet joined an organization (for example, a pending invite that has not been accepted), the organizations are reported as "none". On a connection authenticated with an API key rather than a login, only the one workspace the key is bound to is reported — a key has no user or organization of its own.
Example:
Who am I in Rius?
{ "name": "get_me", "arguments": {} }| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds real behavioral context beyond that: output varies by auth mode (interactive OAuth vs API key), workspaces are grouped by org when multiple orgs exist, and an unjoined user yields 'none'. This is meaningful disclosure for a read tool, though it omits rate limits or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then layers the auth-mode and edge-case nuances in a logical order. It is on the long side for a zero-parameter tool and the example call with empty arguments is somewhat redundant, but nearly every sentence carries distinct behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not explain return values, yet it still sketches the response shape and the conditions that alter it, and annotations cover the safety profile. Nothing needed to invoke or interpret this zero-parameter read tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the stated baseline of 4 applies; there are no parameters whose semantics could be clarified further. The description's empty-arguments example correctly reinforces that no input is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get your own identity and access context') and enumerates exactly what is returned (user, orgs with roles, accessible workspaces). The self-scoping implicitly separates it from list_users and list_workspaces, but no sibling is named explicitly, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — this is the tool to discover your own identity and permission scope — and it usefully explains auth-dependent behavior (OAuth spans all orgs; API key reports only its bound workspace). However, it never says when to prefer this over list_users / list_workspaces or what prerequisites exist, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agentsList AgentsARead-onlyInspect
List a workspace's agent instances with their live status — which agents exist, how many copies of each are running, and which copies are stale, gone or stopped. One row per instance, straight from the heartbeat store.
This is the same read the Rius console's Agents page makes, with the
server's own status words: running, ready, stale, gone, stopped.
The status is computed on the server from the last heartbeat; do not
re-derive it from last_seen_at. open_trace_count is the true number of
open traces and the running/ready signal; first_seen_at and stopped_at
appear when the core serves them, and a blank first_seen_at means the
start is unknown, not that it started now.
Every row here is a live instance; a trace-only agent (one that sends traces but no heartbeat) does not appear. If an agent you expect is missing, the reply says why that happens.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
agent: optional exact agent name, to list only that agent's instances. The
server has no filter for it, so this narrows the reply here and
names the agents that do have instances when nothing matches.
Example:
Which of my agents are running right now?
{ "name": "list_agents", "arguments": {} }Are any copies of planner lost?
{ "name": "list_agents", "arguments": { "agent": "planner" } }| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses real behavioral traits: status is computed server-side and must not be re-derived from last_seen_at, the meaning of open_trace_count and blank first_seen_at, and the important edge case that trace-only agents never appear with an explanation for missing agents. This is rich context the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then field semantics, then parameter guidance, then examples. It is on the longer side, but nearly every sentence adds distinct value; only the example block could be considered marginally redundant for a sophisticated agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not explain return values, yet it goes further and documents key fields and their edge cases. Combined with complete parameter guidance and documented missing-agent behavior, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it does: workspace is explained as an id, name, or org-name/workspace-name disambiguator with default behavior, and agent is explained as an exact-name narrowing filter with the caveat that the server has no native filter and that non-matching replies name agents that do have instances.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource with scope: 'List a workspace's agent instances with their live status.' It further differentiates from siblings by noting that trace-only agents do not appear, distinguishing it from trace-oriented tools like list_agent_traces and agent_traces_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context ('the same read the Rius console's Agents page makes') and two worked examples of the questions it answers, plus a pointer to list_workspaces for discovering workspace names. It never explicitly names an alternative tool to use instead, so it stops short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agent_tracesList Agent TracesARead-onlyInspect
List recent agent traces (one row per trace) newest-first, as a Markdown table.
The trace_id column feeds get_agent_trace. When more traces match than limit,
the reply carries a next-page cursor: pass it back as cursor to fetch the
next page, rather than raising limit past what a chat can usefully display.
The session column is the ROOT span's session id; pass it to
list_spans(session_id=...) to see every span of that conversation across
the traces it touched. A span with no session of its own is stamped with its
trace id, so a session equal to the row's trace_id means "no session", not a
one-trace conversation. Blank where this deployment does not report it yet.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of start/end is
not given.
start: optional absolute RFC3339 lower bound; overrides the hours-derived value
when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived value
when given.
service: optional service-name filter (traces that involve this service).
status: optional trace status filter, "Ok", "Error", or "Incomplete". Note a
trace reads Error when ANY of its spans errored, so a run that retried a
failing step and then succeeded is in here too — read root_status to tell
those apart.
root_status: optional filter on the ROOT span's own verdict, "Ok", "Error", or
"Incomplete". Composes with status rather than replacing it:
status="Error" with root_status="Ok" is the recovered slice (children
errored, the run itself finished clean), and root_status="Error" alone is
the genuine failures. A trace whose root_status column is blank matches
neither — the server made no claim about its root.
agent: optional exact agent-name filter, matched against the trace's root span
— the same value the root_agent column reports, so read a name off a
listing rather than guessing one, and pass it back to get every other run
of that agent. Agent identity is its own field, not the service name: a
run that declares no agent falls back to its service name, so equal
root_agent and service columns are that fallback, not two facts.
instance: optional exact agent-instance filter, narrowing to one running copy
of agent.
user_id: optional end-user scope — the exact id, as the user_id column
reports it. The END USER is the person your agents served (the user.id
your SDK stamps), not a console login. Matched against ANY span of the
trace, so a run counts if the user scope was open anywhere inside it.
The column, though, is the ROOT span's user, so the two need not agree:
a trace whose scope opened after its root matches the filter and still
shows a BLANK cell. That gap is the any-span rule working as specified,
not a filter that missed — read the trace's spans to see where the scope
opened.
anonymous: list the traffic carrying NO end user on any span, instead of one
user's. A real subject rather than an error case: it is where
un-instrumented traffic goes, and its error rate is worth knowing. The
console's ?user=anonymous. Pass either user_id or anonymous, never
both — they are disjoint by construction.
filters: optional list of {"field": ..., "op": ..., "values": [...]} clauses,
ANDed together and composable with the named parameters above. Cheapest
first: status, agent, service, model, span_kind, operation,
session_id are promoted columns and cost the same over any window.
attr.<key> and resource.<key> reach a customer's own attributes and
are ~10x dearer, so narrow with a column first; they are accepted only
over windows of 31 days or less. Ops: eq, ne, in, not_in, gt, gte, lt,
lte, exists, not_exists. Substring on an attribute value is refused —
use error_text or search instead. Call describe_search_catalog before
guessing a key; a rejected clause comes back naming itself.
search: optional case-insensitive contains match on span name, span id,
trace id, or session id. A session id alone — e.g. a coding-agent
session's — finds every trace of that session in one call; on a core
that predates session-id search it matches nothing, so fall back to
filters=[{"field": "session_id", "op": "eq", "values": [...]}].
error_text: optional free text over the failure itself — the status message
and any recorded exception. This is how you find a failure by what it
said ("rate limit", "connection reset") rather than by where it was.
limit: max rows (default 20).
cursor: opaque page token from a previous call's next-page cursor, to fetch
the page after it.
The sent_by column names the developer whose ingest key sent the trace
(their stable email — a console-made key falls back to its creator's own
email, so it usually carries one too). Blank only when the key could not
be resolved (unknown, another workspace's, or a failed lookup), or the
trace predates attribution.
Example:
Why did checkout-agent start failing at 14:00?
{
"name": "list_agent_traces",
"arguments": {
"agent": "checkout-agent", "status": "Error", "root_status": "Error",
"start": "2026-09-16T14:00:00Z", "end": "2026-09-16T15:00:00Z",
"error_text": "rate limit"
}
}Failed runs that used gpt-4o and called the send_email tool.
{
"name": "list_agent_traces",
"arguments": {
"status": "Error",
"filters": [
{"field": "model", "op": "eq", "values": ["gpt-4o"]},
{"field": "attr.tool.name", "op": "eq", "values": ["send_email"]}
]
}
}Example:
Show me the failed runs from the last two days.
{ "name": "list_agent_traces", "arguments": { "hours": 48, "status": "Error" } }Which runs actually failed, ignoring the ones that retried and recovered?
{ "name": "list_agent_traces", "arguments": { "hours": 48, "root_status": "Error" } }Show me the runs that hit errors but finished cleanly anyway.
{
"name": "list_agent_traces",
"arguments": { "hours": 48, "status": "Error", "root_status": "Ok" }
}checkout-agent's traces between two dates.
{
"name": "list_agent_traces",
"arguments": {
"agent": "checkout-agent",
"start": "2026-08-01T00:00:00Z",
"end": "2026-08-08T00:00:00Z"
}
}| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| agent | No | ||
| hours | No | ||
| limit | No | ||
| start | No | ||
| cursor | No | ||
| search | No | ||
| status | No | ||
| filters | No | ||
| service | No | ||
| user_id | No | ||
| instance | No | ||
| anonymous | No | ||
| workspace | No | ||
| error_text | No | ||
| root_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only/open-world; the description adds substantial behavior beyond that: cursor-based paging and why not to raise limit, ~10x cost for attr/resource keys with a 31-day window cap, substring-on-attribute refusal, blank-cell semantics for session/user_id/root_status/sent_by, and the any-span-vs-root-span matching asymmetry that would otherwise look like a bug.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and paging, then per-parameter paragraphs that each earn their place. It runs long and the example block repeats the status/root_status distinction already stated in prose, so a little redundancy, but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, zero-schema-coverage, output-schema-bearing query tool, this covers gaps the structured data leaves open: cost tiers, window limits, pagination, filter composition, and the exact failure modes (rejected clause names itself, session search unavailable on older cores, fall back to filters).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does: every one of the 16 parameters is documented with defaults, override precedence (start/end override hours), enum values, exact-match rules, and composition semantics. The subtle 'root_agent == service means fallback, not two facts' note is exactly the kind of meaning a schema can't express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+shape: 'List recent agent traces (one row per trace) newest-first, as a Markdown table.' It also distinguishes itself from siblings by naming get_agent_trace, list_spans, and describe_search_catalog as the follow-on/alternative tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing throughout: trace_id feeds get_agent_trace, session feeds list_spans, status+root_status composability is spelled out with concrete slices (recovered vs genuine failures), user_id vs anonymous are declared mutually exclusive, and filters are ordered by cost with a directive to call describe_search_catalog before guessing keys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_alert_channelsList Alert ChannelsARead-onlyInspect
List where this workspace's alerts can be delivered.
Use it to find a channel id for create_alert_rule or update_alert_rule. Needs
the channels:manage capability rather than plain read, because the target
column shows the actual destination — a webhook URL, an email recipient list,
a Slack channel.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
Where do my alerts go?
{ "name": "list_alert_channels", "arguments": {} }| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description discloses an unusual auth requirement ('needs the channels:manage capability rather than plain read') and reveals that results expose sensitive destinations. That is meaningful context annotations cannot convey, though pagination/result-size behavior is unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then usage, capability note, and parameter doc in a logical order. The quoted 'Where do my alerts go?' plus JSON example is mildly redundant but does show the valid empty-arguments call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description still characterizes the payload. Auth requirement, param semantics, and routing to the create/update tools cover everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the single parameter — and it does: accepted forms (id, name, org-name/workspace-name), the disambiguation condition, and the default. Nothing about 'workspace' is left ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List where this workspace's alerts can be delivered') and immediately disambiguates from the rule-listing siblings by describing the returned destination content (webhook URL, email recipient list, Slack channel). An agent can distinguish this from list_alert_rules and list_alerts without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the downstream use case: find a channel id for create_alert_rule or update_alert_rule. It does not state exclusions or contrast directly with list_alert_rules/create_alert_channel, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_alert_rulesList Alert RulesARead-onlyInspect
List every alert rule in the workspace — predefined and custom together.
Predefined rules are the built-in detectors, one per kind, which you can configure and toggle but not create or delete. Custom rules are ones someone built from the metric catalog; there can be many.
The ref column is what update_alert_rule and delete_alert_rule take: a kind
name for a predefined rule, a uuid for a custom one.
A predefined rule only appears once alert-manager has reached this workspace, so an empty list can simply mean detection has not started yet.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
What alerts are configured?
{ "name": "list_alert_rules", "arguments": {} }| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: predefined rules can be toggled but not created/deleted, the semantics of the `ref` identifier, and the caveat that an empty list may reflect alert-manager not yet reaching the workspace.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then layered detail; each paragraph adds distinct information. The trailing JSON example with empty arguments is somewhat redundant for a zero-required-param tool, costing a point but not much.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for this tool. Return values are covered by the output schema, and the description still supplies the interpretive context an agent needs (rule categories, ref semantics, empty-list meaning) to act on results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only marks `workspace` as a string with default "", so the description carries full burden. It explains the param accepts an id, name, or `org-name/workspace-name` disambiguator, and that it defaults — fully compensating for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every alert rule in the workspace') and immediately distinguishes the two categories it returns (predefined vs custom). Clear enough that an agent can tell it apart from siblings like list_alert_channels and list_alerts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong context: it explains the `ref` column is the input to update_alert_rule/delete_alert_rule, and that an empty list may just mean detection hasn't started. It never explicitly states when to prefer this over list_alerts or list_alert_channels, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_alertsList AlertsARead-onlyInspect
List alerts that have fired, newest first.
This is the "what is broken" tool. An alert is opened by a detector and stays
open, accumulating occurrences, until the detector resolves it — so an open
alert with a recent last_seen is still happening.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
status: open or resolved; omit for both.
kind: narrow to one detector — consistent_error_pattern, silent_failure,
tool_loop, or custom. Every custom rule shares the kind "custom", so use
rule_id to isolate one custom rule.
rule_id: narrow to the firings of one specific rule (from list_alert_rules).
service: exact service name.
step: exact step (span) name.
search: case-insensitive match on the alert title.
acknowledged: true or false; omit for both.
hours: how far back to look, on last_seen. Defaults to 24. The server itself is
unbounded if no window is given, which would scan all history.
limit: rows to return, at most 200.
Example:
What alerts are open right now?
{ "name": "list_alerts", "arguments": { "status": "open" } }Example:
Show me the errors alert for the checkout service this week.
{ "name": "list_alerts", "arguments": { "service": "checkout", "hours": 168 } }| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| step | No | ||
| hours | No | ||
| limit | No | ||
| search | No | ||
| status | No | ||
| rule_id | No | ||
| service | No | ||
| workspace | No | ||
| acknowledged | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, yet the description adds substantive domain behavior: alerts stay open until the detector resolves them, an open alert with a recent last_seen is still occurring, and the server is unbounded if no window is given (a real performance hazard). This is genuinely useful context beyond the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose and the 'what is broken' framing before parameter docs and examples. It is long, but the length is earned given 10 undocumented parameters; only mild tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a read-only, fully filterable list tool the description covers purpose, filtering semantics, edge cases (unbounded scan), and examples — nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does so: it defines workspace format, status values, the kind enum and its 'custom' caveat, the distinction between kind and rule_id, and defaults/ranges for hours and limit (at most 200). All 10 parameters are given meaning beyond their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List alerts that have fired, newest first') and frames the tool's role as the "what is broken" tool, clearly distinguishing it from get_alert (single) and list_alert_rules (rule definitions). An agent can identify the right sibling without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete usage context via two worked examples (open alerts now; errors for a service this week) and routes the agent to list_alert_rules as the source of rule_id. It does not explicitly state when not to use it versus get_alert/ack_alert, but the conditions that select it are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_metrics_catalogList Metrics CatalogARead-onlyInspect
List every metric the platform knows how to compute, with its unit, nullability,
which read serves it, and its companions (the extra response keys it
contributes: coverage keys for scalars, row/point value keys for breakdowns and
series). Use it to discover exact field names instead of guessing them.
workspace: optional workspace name or id (the catalog is identical for every caller; this only fills the request path). group: optional group filter, e.g. "cost", "volume", "tokens", "latency", "ttft", "reliability". kind: optional kind filter: "scalar", "series", or "breakdown".
Example:
What latency metrics exist?
{ "name": "list_metrics_catalog", "arguments": { "group": "latency" } }| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| group | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds useful context beyond them: the catalog is identical for every caller and workspace only fills the request path, plus it explains the 'companions' semantics of the response. No rate-limit, auth, or size caveats, but the added behavioral detail is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, followed by usage, parameter docs, and a worked example; each block earns its place. The lead sentence is dense and the companions parenthetical lengthens it, but there is no genuinely wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-param, zero-required discovery tool with an output schema and read-only annotations, the description covers purpose, all parameters with valid values, behavioral nuance, and a concrete invocation example. Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so completely: workspace (name/id, content-invariant), group (filter with concrete examples like cost/latency/ttft), and kind (filter with its three valid values scalar/series/breakdown). This compensates fully for the undocumented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('List every metric the platform knows how to compute') and enumerates the returned facts (unit, nullability, serving read, companions), making the tool's scope unambiguous. It does not explicitly contrast itself with nearby siblings such as workspace_metrics_overview or the other catalog tools, so it falls just short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States a clear use case: 'Use it to discover exact field names instead of guessing them,' which tells the agent this is a discovery/introspection tool. It never names an alternative or a when-not-to-use condition (e.g., use workspace_metrics_overview for actual values), so there are no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_spansList SpansARead-onlyInspect
List spans across every trace in the workspace (not grouped by trace), as a Markdown table — the cross-trace complement to get_agent_trace's single-trace waterfall. Use it to find spans by kind/session/agent regardless of which trace they landed in, e.g. "every failed tool call this week" or "this session's spans across however many traces it touched".
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of start/end is
not given.
start: optional absolute RFC3339 lower bound; overrides the hours-derived value
when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived value
when given.
kind: optional derived semantic span kind: "llm", "tool", "chain", "retriever",
"reranker", "agent", "embedding", or "other". A rerank call is
"reranker", not "llm", though it names a model. Distinct from each
row's own kind column, which is the raw OTLP span kind
(SERVER/CLIENT/INTERNAL/...).
status: optional span status filter, "Ok", "Error", or "Incomplete".
session_id: optional exact match on the span's session id, across every trace
in that session. Read one off the session column (reported here, on
list_agent_traces and by get_agent_trace) rather than guessing. A span
with no session of its own reports its trace id there, so passing a
trace id selects that one trace's session-less spans.
agent: optional exact agent-name filter — the span's own agent, not a
trace-level rollup. Reported back in the agent column, so a listing
names the agents it can filter by; a span whose run declared no agent
carries its service name there instead.
instance: optional exact agent-instance filter, narrowing to one running copy
of agent.
user_id: optional end-user scope — the exact id, as the user_id column
reports it. Here the column is the SPAN's own end user rather than a
trace-level rollup, so every row of a scoped listing shows the id it
matched on. (On list_agent_traces the same column name is the ROOT
span's, which is why a trace row there can match and still read blank.
When that happens, this tool is how you find the spans that did carry
the user.)
anonymous: list the spans carrying no end user instead of one user's. Pass
either user_id or anonymous, never both.
search: optional case-insensitive contains match on span name, span id,
trace id, or session id.
error_text: optional free text over the failure itself — the status message
and any recorded exception. Finds a failing span by what it said.
filters: optional list of {"field": ..., "op": ..., "values": [...]} clauses,
ANDed and composable with the named parameters. Promoted columns
(status, agent, service, model, span_kind, operation,
session_id) are cheap over any window; attr.<key> and
resource.<key> reach a customer's own attributes, cost ~10x more, and
are accepted only over 31 days or less — narrow with a column first.
Ops: eq, ne, in, not_in, gt, gte, lt, lte, exists, not_exists. Call
describe_search_catalog before guessing a key.
sort_field: optional sort column: "start_time" (default), "duration_ms",
"tokens", or "cost".
sort_dir: optional sort direction, "asc" or "desc" (default "desc").
limit: max rows (default 50).
cursor: opaque page token from a previous call's next-page cursor, to fetch
the page after it.
Example:
Show me every errored tool call in the last day.
{ "name": "list_spans", "arguments": { "kind": "tool", "status": "Error" } }All spans in session user-42-chat-7.
{ "name": "list_spans", "arguments": { "session_id": "user-42-chat-7" } }| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| kind | No | ||
| agent | No | ||
| hours | No | ||
| limit | No | ||
| start | No | ||
| cursor | No | ||
| search | No | ||
| status | No | ||
| filters | No | ||
| user_id | No | ||
| instance | No | ||
| sort_dir | No | ||
| anonymous | No | ||
| workspace | No | ||
| error_text | No | ||
| session_id | No | ||
| sort_field | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld, but the description adds substantial context beyond them: Markdown-table output shape, the ~10x cost and 31-day cap on attr./resource. filters, the advice to call describe_search_catalog first, and the cross-trace column semantics for session/agent/user_id. This is rich disclosure of behavior annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then parameters, then worked examples — a clean structure. It is long and occasionally parenthetical (e.g. comparisons back to list_agent_traces), but for an 18-param tool with no schema docs the length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 18 parameters, no required fields, an output schema (so return values need not be explained), and only readOnly annotations, the description supplies everything an agent needs to call it correctly, including examples. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden — and it documents all 18 parameters with defaults, edge cases (start/end override hours), the derived-vs-raw kind distinction, session_id fallback to trace id, and the user_id-vs-anonymous exclusivity. It more than compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) plus resource (spans) plus scope (across every trace in the workspace, not grouped by trace) and explicitly contrasts itself with get_agent_trace's single-trace waterfall. An agent can distinguish it from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use framing ('find spans by kind/session/agent regardless of which trace they landed in') with two concrete scenarios, and names the alternative tool (get_agent_trace) it complements. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersList End UsersARead-onlyInspect
The window's END USERS as a ranked register: who your agents served.
The end user is the person on the other side of the agent — the user.id
your SDK stamps — not a console login and not an org member. The words are
worth keeping straight: an ORG is the Rius customer, a WORKSPACE is one of
their own clients, and an end user is that client's user.
Read a user_id off this register and pass it to user_activity_summary
for that person's KPIs, or to list_agent_traces(user_id=...) for their
runs. This is the same read the console's Users page makes.
TOP-N by design, not by accident: a B2C workspace can hold millions of end
users, so the server ranks and caps. When it reports more, q reaches PAST
the cap by exact id — it is an equality probe, never a substring search, so
a fragment finds nothing rather than scanning millions of ids.
Three figures that are easy to misread, so each travels with its caveat: anonymous traffic is always reported and is a real subject rather than an error case; coverage is counted in TRACES because one trace can belong to two end users under the any-span rule; and a null cost means nothing in the window was priced, which is not the same as free.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default; use
list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of
start/end is not given. The register is an unindexed group-by, so the
window is capped at 31 days and a wider one is refused.
start: optional absolute RFC3339 lower bound (e.g. "2026-08-01T00:00:00Z");
overrides the hours-derived value when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived
value when given.
sort: "traces" (default), "failed_traces", or "cost" — all descending. A
value outside that set is refused rather than quietly defaulted, since
a wrong ranking under a right-looking header cannot be caught later.
limit: users per page (default 20, server max 100).
q: an EXACT end-user id. Returns that user's row even when they fall outside
the top-N, or an empty register when the window holds nothing for them.
Example:
Who are my busiest end users this week?
{ "name": "list_users", "arguments": { "hours": 168 } }Which end users are seeing the most failures?
{ "name": "list_users", "arguments": { "hours": 168, "sort": "failed_traces" } }Is u_8f2 in the last 30 days at all?
{ "name": "list_users", "arguments": { "hours": 720, "q": "u_8f2" } }| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| end | No | ||
| sort | No | traces | |
| hours | No | ||
| limit | No | ||
| start | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint, but the description adds the operational envelope: TOP-N ranking by server-side cap, q as an equality probe rather than substring search, a hard 31-day window that is refused if exceeded, refusal of out-of-set sort values, and the caveats on anonymous traffic, trace-based coverage, and null cost. This is disclosure well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and well-sectioned, with parameters and examples following the framing. It is longer than strictly necessary, though: the 'words are worth keeping straight' exposition and some of the caveat prose lean narrative where a tighter phrasing would lose nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the description instead fills every remaining gap an agent needs: entity scope, window semantics and cap, ranking behavior, the id-probe escape hatch, and three figures called out as easy to misread. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (bare types and defaults only), so the description carries the full burden and does: all seven parameters are documented with semantics, defaults, and edge behavior (hours vs start/end precedence, workspace name disambiguation, sort's allowed set and refusal, limit's server max, q's exact-match-only rule). This is exactly the compensation a low-coverage schema needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource framing ('END USERS as a ranked register') and immediately scopes the entity by contrasting it against two look-alikes: console logins and org members. It also disambiguates the whole vocabulary chain (org/workspace/end user), so an agent can tell exactly what population this returns before opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit downstream routing: read a user_id here and pass it to user_activity_summary or list_agent_traces(user_id=...). It also states the exact condition that selects the `q` path (a user outside the top-N) and how q behaves when it misses, which is the main alternative-use decision for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList WorkspacesARead-onlyInspect
List the workspaces you have access to (id and name).
On an interactive (OAuth) login this spans every organization you belong to, grouped under each org's name; an API-key connection sees the single workspace its key is bound to.
Use it to find the right value for the workspace argument of the trace,
metrics and alert tools. That argument takes a workspace id, a workspace
name, or — when the same name occurs in two of your orgs — the
org-qualified org-name/workspace-name form.
Example:
Which Rius workspaces do I have?
{ "name": "list_workspaces", "arguments": {} }| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=true, openWorldHint=false), but the description adds behavioral detail the annotations cannot: OAuth logins see every org grouped by org name, while API-key connections see only the bound workspace. That auth-dependent scope difference is exactly the kind of context an agent needs before interpreting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then scope, then usage, then a compact example. The example JSON block with empty arguments is a small luxury for a no-parameter tool, but it is short and illustrative rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not needed. The description covers the two things an agent could not infer: the auth-dependent result scope and how the returned workspace values are consumed by other tools. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description does add meaning by explaining the workspace identifier formats (id, name, org-qualified name) that this tool's output feeds into, which is useful context even though there is no input to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'List the workspaces you have access to (id and name)' — and immediately scopes what is returned. No sibling in the list does workspace enumeration, so an agent can route to it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'Use it to find the right value for the `workspace` argument of the trace, metrics and alert tools.' It even explains the three acceptable forms of that argument, removing any guesswork about downstream usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_alert_channelUpdate Alert ChannelADestructiveIdempotentInspect
Change a notification channel: rename it, re-point it, or enable/disable it.
Only what you pass changes; a channel's secrets are left alone if you do not resubmit them. A channel's type cannot be changed — create a new one instead.
A channel that has failed to deliver several times in a row is disabled automatically; pass enabled true to bring it back once you have fixed it.
Needs the channels:manage capability.
channel_id: the channel's id, from list_alert_channels.
name: a new label.
url: for a webhook — a new https URL to POST to.
recipients: for email — the full replacement list of addresses.
enabled: turn delivery on or off.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
Disable the ops webhook for now.
{ "name": "update_alert_channel", "arguments": { "channel_id": "8a1…", "enabled": false } }| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| name | No | ||
| enabled | No | ||
| workspace | No | ||
| channel_id | Yes | ||
| recipients | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=true and openWorldHint=true, but the description goes well beyond them: secrets are preserved unless resubmitted, the type field is immutable, repeated delivery failures cause automatic disabling, and the call requires the `channels:manage` capability. These are exactly the operational facts an agent needs before mutating a channel.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavioral rules, then a per-parameter glossary, then a worked example — a logical progression with almost no filler. It is on the long side, but every section carries information not available in the structured fields, so the length is defensible rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutation tool with destructiveHint=true, no schema descriptions, and no enum hints — the risky categories — yet the description covers partial-update behavior, immutability, auth capability, auto-disable recovery, and workspace disambiguation. An output schema exists, so return values need not be described. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden — and it does: channel_id (source: list_alert_channels), name (new label), url (https POST target for webhooks), recipients (full replacement list, not a merge), enabled (delivery on/off), and workspace (id, name, or `org-name/workspace-name` disambiguation, with default noted). The 'full replacement' wording for recipients is semantics the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Change a notification channel') and immediately enumerates the three shapes of change (rename, re-point, enable/disable), which cleanly separates it from create_alert_channel and delete_alert_channel in the sibling list. An agent can identify the tool's job without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states partial-update semantics ('Only what you pass changes'), a hard exclusion with a redirect ('A channel's type cannot be changed — create a new one instead'), a recovery scenario (auto-disabled channels, pass enabled true after fixing), and points to list_alert_channels for obtaining channel_id. When-to-use, when-not-to-use, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_alert_ruleUpdate Alert RuleADestructiveIdempotentInspect
Reconfigure or toggle one alert rule, predefined or custom.
ref decides which: a kind name (consistent_error_pattern, silent_failure,
tool_loop) addresses the predefined rule of that kind; a uuid addresses a
custom rule. Get either from list_alert_rules.
Only what you pass changes. Turning a rule off stops detection, not just notification — gaps in history are permanent and nothing backfills them.
The two rule shapes take DIFFERENT settings, and mixing them is refused with a message naming the right one:
a predefined rule has named integer knobs -> pass
configa custom rule has metric thresholds -> pass
rules(+window_minutes)
ref: the rule's kind or uuid.
enabled: turn detection on or off.
rca_enabled: turn root-cause analysis on or off for this rule.
name: rename a custom rule (predefined rules take their name from their kind).
config: for a PREDEFINED rule only — its named knobs, e.g.
{"min_errored_spans": 10}. consistent_error_pattern takes
window_minutes, min_errored_spans, min_distinct_traces; silent_failure
takes window_minutes; tool_loop takes window_minutes,
min_identical_calls. Call describe_alert_catalog for the bounds.
rules: for a CUSTOM rule only — replace its thresholds. Replaces the whole
list, so pass window_minutes with it.
window_minutes: the window. For a custom rule it is part of the replaced
config, so pass rules too; for a predefined rule put it in config.
filters: for a CUSTOM rule only — replace its filters. Replaces the whole
list. Same shape and the same verbatim-value rule as create_alert_rule.
channel_ids: change where the rule delivers. Needs channels:manage. An empty
list does NOT silence the rule — it re-points it at the region's default
webhook. To stop notifications, set enabled to false.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default).
Example:
Turn off the tool loop alert.
{ "name": "update_alert_rule", "arguments": { "ref": "tool_loop", "enabled": false } }Example:
Make the error pattern alert less noisy — 10 errors, not 3.
{ "name": "update_alert_rule", "arguments": {
"ref": "consistent_error_pattern",
"config": { "min_errored_spans": 10 }
} }| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| name | No | ||
| rules | No | ||
| config | No | ||
| enabled | No | ||
| filters | No | ||
| workspace | No | ||
| channel_ids | No | ||
| rca_enabled | No | ||
| window_minutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond that: disabling stops detection with permanently unfilled history gaps, mixed rule shapes are refused with a corrective message, and an empty channel_ids list re-points delivery to the default webhook rather than silencing. These are exactly the non-obvious behaviors the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long but justified by ten parameters and zero schema coverage, and it is well front-loaded: the core action, then `ref` resolution, then the destructive warning, then per-parameter detail. There is minor redundancy where the bullet list restates points already made in prose (e.g. `ref`, `window_minutes`), which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and everything else an agent needs is present: the destructive permanence warning, the two config shapes, delivery re-pointing semantics, permission requirements, and workspace disambiguation. Nothing material is left uncovered for a 10-param mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the entire burden, and it documents all ten parameters with real semantics: `ref` format, the predefined-vs-custom split for `config`/`rules`, the full-replace semantics of `rules` and `filters`, `window_minutes` placement rules, and the channels:manage requirement for `channel_ids`. This is maximal compensation for a documentation-free schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Reconfigure or toggle one alert rule") and immediately scopes it to "predefined or custom," distinguishing it from create_alert_rule and delete_alert_rule. It names the sibling it depends on (list_alert_rules) and the catalog tool (describe_alert_catalog), so an agent can tell exactly which tool to reach for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent where to obtain `ref` (list_alert_rules) and where to find bounds (describe_alert_catalog), and prescribes which config shape applies to which rule type. It also states the failure mode when shapes are mixed, giving clear when-to-use-which guidance rather than leaving it to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user_activity_summarySummarize User ActivityARead-onlyInspect
Summary KPIs for ONE end user's activity over a time window: trace count, LLM calls, error rate, failed vs errored traces, sessions, total/average cost, token usage, and latency and TTFT percentiles.
An "end user" here is the person your agents serve — the user.id your SDK
stamps via rius.user(...) / withUser(...) — not a Rius account. Use it when
someone arrives with a complaint and an identifier: "what did user u_8f2
experience this week" is one call, and the answer is a rollup rather than a
trace list you have to fold yourself.
Same read, same window and the same figures the Rius console's user page shows for that id, so a number you report and a number a human reads there are the same number. Field names match agent_traces_summary wherever they mean the same thing.
Read the Failed traces and Errored traces lines as the two different questions they are, and do not add them together or report one as "errors": a run whose ROOT span errored FAILED, while a run that errored somewhere and then recovered did not.
user_id: the end user's exact id, as list_agent_traces reports it in the
user_id column — read one off a listing rather than guessing. Matched
against any span of the trace, so a trace counts for this user if the user
scope was open anywhere inside it, not only at the root.
anonymous: summarise the traffic that carries NO end user instead. This is a
real subject, not an error case: it answers "what is happening to the runs
nobody attributed", and a high error rate there is worth knowing. It is the
console's ?user=anonymous. Pass either user_id or anonymous, not both.
workspace: optional workspace id, name, or org-name/workspace-name when the
same name occurs in two of your orgs (defaults to your default; use
list_workspaces to discover them).
hours: lookback window in hours (default 24), used for whichever of start/end
is not given.
start: optional absolute RFC3339 lower bound (e.g. "2026-08-01T00:00:00Z");
overrides the hours-derived value when given.
end: optional absolute RFC3339 upper bound; overrides the hours-derived value
when given.
filters: optional further {"field": ..., "op": ..., "values": [...]} clauses,
ANDed with the user scope — the same grammar and registry as
list_agent_traces. Call describe_search_catalog before guessing a key.
Example:
What did user u_8f2 experience in the last 24 hours?
{ "name": "user_activity_summary", "arguments": { "user_id": "u_8f2" } }How has that user's week been?
{
"name": "user_activity_summary",
"arguments": { "user_id": "u_8f2", "hours": 168 }
}How much of our traffic has no user attached, and is it failing?
{ "name": "user_activity_summary", "arguments": { "anonymous": true } }What did that user's gpt-4o runs cost?
{
"name": "user_activity_summary",
"arguments": {
"user_id": "u_8f2",
"filters": [{ "field": "model", "op": "eq", "values": ["gpt-4o"] }]
}
}| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| hours | No | ||
| start | No | ||
| filters | No | ||
| user_id | No | ||
| anonymous | No | ||
| workspace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds much more: the result is a rollup, not a trace list; it returns "the same figures the Rius console's user page shows"; matching is against any span of the trace, not just the root; and it warns against conflating Failed vs Errored traces. That is genuine behavioral context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by parameter docs and then four examples that each exercise a distinct path (default window, custom window, anonymous, filters). Every section earns its place for a 7-param tool, though the four worked examples plus the console-equivalence note make it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be enumerated, yet the KPI list still tells the agent what to expect. Combined with full parameter coverage, the user-scope semantics, the Failed/Errored caveat, and the sibling cross-references, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 7 parameters, so the description carries the full burden and does so: user_id sourcing and span-matching semantics, anonymous as a mutually exclusive alternative, workspace formats including the `org-name/workspace-name` disambiguator, hours default with its interaction with start/end, RFC3339 formats for both bounds, and the filters clause grammar with a pointer to describe_search_catalog.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Summary KPIs for ONE end user's activity over a time window") and enumerates exactly which KPIs are returned. It explicitly distinguishes itself from siblings: the field names "match agent_traces_summary", the id comes from `list_agent_traces`, and the result is "a rollup rather than a trace list you have to fold yourself".
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use trigger ("someone arrives with a complaint and an identifier") plus a worked query phrasing. It also spells out the mutually exclusive choice ("Pass either `user_id` or `anonymous`, not both"), clarifies anonymous is "a real subject, not an error case", and routes to `list_agent_traces` / `describe_search_catalog` for adjacent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_metrics_overviewWorkspace Metrics OverviewARead-onlyInspect
Aggregated health of a whole workspace over a time window: the numbers behind the dashboard's overview: volume (traces/spans/LLM calls), cost, tokens, latency percentiles, TTFT, error rates, each with its previous-window baseline and delta, plus ranked breakdowns (per model, top agents, calls by kind, top exceptions, slowest spans).
Use this to answer "how is my workspace doing" before drilling into individual traces with list_agent_traces / get_agent_trace.
workspace: optional workspace id, name, or org-name/workspace-name when
the same name occurs in two of your orgs (defaults to your default;
use list_workspaces to discover them).
hours: lookback window in hours (default 24). Bucket grain is server-decided from
the window length: ≤2h → minute, ≤48h → hour, else day. minute and hour
buckets are window-relative (bucket k starts at from + k×step); day
buckets are UTC calendar days, so the first and last cover only the part of
their day inside the window and a low value there is that clip, not a drop.
The rendered series states which of its edges are clipped.
minutes: lookback in minutes instead of hours, for short "last 10 minutes" windows
(ignored when 0).
breakdowns: include the ranked per-model / per-agent / per-kind tables (default true).
series: include the per-bucket sparkline values (default false; they are verbose).
Values are milliseconds for latency/TTFT; — means not measured (null), which is
never the same as a measured 0. Metrics listed as degraded failed to compute and
are absent rather than zero.
Example:
How is my workspace doing today?
{ "name": "workspace_metrics_overview", "arguments": {} }Anything wrong in the last 10 minutes?
{ "name": "workspace_metrics_overview", "arguments": { "minutes": 10 } }| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| series | No | ||
| minutes | No | ||
| workspace | No | ||
| breakdowns | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, yet the description adds substantial behavioral context beyond them: server-decided bucket grain from window length, the distinction between window-relative and UTC-calendar buckets, clipped first/last buckets, and the critical null-vs-measured-0 semantics plus degraded metrics being absent rather than zero. This is exactly the kind of disclosure that prevents misreading the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose before parameters and examples, and each block earns its place by resolving a real ambiguity (grain, clipping, null semantics). It is on the long side and the parameter prose is dense, but there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be restated, and the description instead supplies the interpretation rules that the output schema cannot convey (clipped buckets, null vs 0, degraded metrics). For a zero-required-param read-only overview tool, nothing an agent needs to invoke and correctly read it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the full parameter burden and it does: workspace (id/name/org-name/workspace-name plus default and discovery via list_workspaces), hours (default 24, grain rules), minutes (for 'last 10 minutes', ignored when 0), breakdowns (default true), series (default false, verbose). Every parameter gets meaning and defaults beyond the bare JSON types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Aggregated health of a whole workspace over a time window') and then enumerates the concrete metrics returned (volume, cost, tokens, latency percentiles, TTFT, error rates, ranked breakdowns). It explicitly positions itself against siblings by framing the output as what you check 'before drilling into individual traces with list_agent_traces / get_agent_trace.' An agent can distinguish it from agent_traces_summary or user_activity_summary without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit usage trigger ('Use this to answer "how is my workspace doing"') and names the alternative tools (list_agent_traces / get_agent_trace) that handle the drill-down follow-up. It does not state exclusions relative to the other summary siblings (agent_traces_summary, user_activity_summary), so the when-not guidance is incomplete.
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.
29 tool updates
- First observed
ack_alert - First observed
agent_error_groups - First observed
agent_lifecycle_events - First observed
agent_traces_summary - First observed
agent_versions - First observed
compare_agent_versions - First observed
create_alert_channel - First observed
create_alert_rule - First observed
create_api_key - First observed
delete_alert_channel - First observed
delete_alert_rule - First observed
describe_alert_catalog - First observed
describe_search_catalog - First observed
get_agent_trace - First observed
get_alert - First observed
get_me - First observed
list_agent_traces - First observed
list_agents - First observed
list_alert_channels - First observed
list_alert_rules - First observed
list_alerts - First observed
list_metrics_catalog - First observed
list_spans - First observed
list_users - First observed
list_workspaces - First observed
update_alert_channel - First observed
update_alert_rule - First observed
user_activity_summary - First observed
workspace_metrics_overview
Publisher details
- Operator
- GlassFlow GmbH
- Operator website
- https://www.glassflow.ai/rius
- Vendor relationship
- First-party
- Documentation
- https://www.docs.glassflow.ai/rius
- Trust center
- https://www.glassflow.ai/privacy-policy
- Restrictions
- Pricing: https://www.glassflow.ai/rius/pricing
Related MCP Connectors
AI agent observability for production traces, natural-language insights, and improvement loops.
Production observability for AI agents: search runs, read evaluations, acknowledge incidents.
Data + AI observability — monitor and troubleshoot production-grade agents and the context they use.
- SpanlyOAuthcom.spanly
MCP observability. Query live traffic, errors, duration, and alerts from your AI agent.
Related MCP Servers
- AlicenseAqualityCmaintenanceLets AI agents query, manage, and operate their LLM observability data directly from the conversation. Provides 87 tools for cost analysis, alerting, anomaly detection, and runtime control gates.87132 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to access observability and evaluation data, including run history, span traces, LLM-as-judge evaluation results, and regression reports.MIT
- AlicenseNot gradedqualityDmaintenanceProvides unified AI agent observability including tracing, cost tracking, performance monitoring, anomaly detection, and audit trails via MCP.32 npmMIT
- AlicenseNot gradedqualityDmaintenanceTracks and analyzes AI agent tool calls with event logging, dashboard, per-tool and per-agent analytics, and error monitoring.33 PyPIMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.