Tool reference
Every tool the Rius MCP server exposes, with arguments and example
invocations. All tools return Markdown, which your client renders as tables
and summaries. Everything is read-only with one exception, create_api_key,
which is admin-gated.
Two conventions apply across the trace tools:
workspaceis optional everywhere: pass a workspace name or ID, or omit it to use your default workspace. Discover workspaces withlist_workspaces.hoursis a lookback window ending now (default 24). “This week” ishours: 168.
You rarely invoke tools by hand. Ask your client a question, and it picks the tools and arguments itself. The examples show what the client sends, which helps when a question is not picking the tool you expect.
ack_alert
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 the API 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.
| Argument | Type | Default | Description |
|---|---|---|---|
alert_id | string | required | the alert’s id, from list_alerts. |
workspace | string | "" | optional workspace name or id (defaults to your default). |
I’ve seen that alert, stop pinging me about it.
{ "name": "ack_alert", "arguments": { "alert_id": "2f9c…" } }agent_traces_summary
Summary KPIs for agent traces over a time window: trace count, LLM calls, error rate, total/average cost, token usage, and latency percentiles (p50/p95/p99).
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default; use list_workspaces to discover them). |
hours | integer | 24 | lookback window in hours (default 24), used for whichever of start/end is not given. |
start | string | "" | optional absolute RFC3339 lower bound (e.g. “2026-08-01T00:00:00Z”); overrides the hours-derived value when given. |
end | string | "" | optional absolute RFC3339 upper bound; overrides the hours-derived value when given. |
service | string | "" | optional service-name filter (traces that involve this service). |
How did my agents do over the last 24 hours?
{ "name": "agent_traces_summary", "arguments": { "hours": 24 } }Summarize the checkout-agent service this week.
{
"name": "agent_traces_summary",
"arguments": { "hours": 168, "service": "checkout-agent" }
}Summarize traces between two specific dates.
{
"name": "agent_traces_summary",
"arguments": { "start": "2026-08-01T00:00:00Z", "end": "2026-08-08T00:00:00Z" }
}create_alert_channel
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.
| Argument | Type | Default | Description |
|---|---|---|---|
name | string | required | a label for the channel, 1 to 120 characters. |
channel_type | string | required | webhook, email, or slack. |
url | string | "" | for a webhook — the https URL to POST to. |
recipients | any | null | for email — 1 to 20 addresses. |
slack_channel_id | string | "" | for Slack — a channel id from the connected Slack workspace. Slack must be connected in the console first. |
workspace | string | "" | optional workspace name or id (defaults to your default). |
enabled | boolean | true | whether it starts receiving deliveries. Defaults to true. |
Send my alerts to this webhook.
{ "name": "create_alert_channel", "arguments": {
"name": "ops webhook", "channel_type": "webhook",
"url": "https://hooks.example.com/rius"
} }create_alert_rule
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.
| Argument | Type | Default | Description |
|---|---|---|---|
name | string | required | what to call the rule, 1 to 120 characters. |
rules | array | required | 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 | integer | 15 | the rolling window every threshold is measured over, 5 to 1440. |
filters | any | null | optional narrowing, each {"field":…, "operator":…, "values":[…]}. ANDed. Omit to watch the whole workspace. eq and ne take exactly one value. |
channel_ids | any | null | 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 | boolean | true | whether detection starts immediately. Defaults to true. |
workspace | string | "" | optional workspace name or id (defaults to your default). |
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}]
} }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}]
} }create_api_key
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.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default; use list_workspaces to discover them). |
name | string | glassflow-connect-agent | a label for the key, shown in the workspace’s key list later. |
scopes | any | null | 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 and the query API. 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. |
Create an API key so this agent can send traces.
{ "name": "create_api_key", "arguments": { "name": "my-agent" } }Give it a key that can query the API too.
{ "name": "create_api_key", "arguments": { "scopes": ["ingest", "read"] } }delete_alert_channel
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.
| Argument | Type | Default | Description |
|---|---|---|---|
channel_id | string | required | the channel’s id, from list_alert_channels. |
confirm | string | "" | the phrase from the first call’s output. |
workspace | string | "" | optional workspace name or id (defaults to your default). |
Remove the old ops webhook.
{ "name": "delete_alert_channel", "arguments": { "channel_id": "8a1…" } }delete_alert_rule
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.
| Argument | Type | Default | Description |
|---|---|---|---|
ref | string | required | the custom rule’s uuid, from list_alert_rules. |
confirm | string | "" | the phrase from the first call’s output. |
workspace | string | "" | optional workspace name or id (defaults to your default). |
Delete the cost spike alert.
{ "name": "delete_alert_rule", "arguments": { "ref": "9c2…" } }describe_alert_catalog
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.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default). |
field | string | "" | optionally a filter field id (for example “service”), to list the values actually seen in this workspace over the last 24h. |
What can I alert on?
{ "name": "describe_alert_catalog", "arguments": {} }Which services could I filter an alert to?
{ "name": "describe_alert_catalog", "arguments": { "field": "service" } }get_agent_trace
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.
Captured content is subject to the workspace’s privacy controls: spans exported with capture_content=False or a mask have nothing extra to show.
| Argument | Type | Default | Description |
|---|---|---|---|
trace_id | string | required | the trace id (from list_agent_traces). |
workspace | string | "" | optional workspace name or id (defaults to your default; use list_workspaces to discover them). |
include_content | boolean | false | 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). |
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
}
}get_alert
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.
| Argument | Type | Default | Description |
|---|---|---|---|
alert_id | string | required | the alert’s id, from list_alerts. |
workspace | string | "" | optional workspace name or id (defaults to your default). |
Why did that alert fire?
{ "name": "get_alert", "arguments": { "alert_id": "2f9c…" } }get_me
Get your own identity and access context.
Returns your user (id, external id, email), your organization (id, name) and your role in it (“admin” or “member”), and the workspaces you can access. If you have not yet joined an organization (for example, a pending invite that has not been accepted), the organization and role are reported as “none”. On a connection authenticated with an API key rather than a login, only the workspaces are reported — a key has no user or organization of its own.
No arguments.
Who am I in Rius?
{ "name": "get_me", "arguments": {} }list_agent_traces
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.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default; use list_workspaces to discover them). |
hours | integer | 24 | lookback window in hours (default 24), used for whichever of start/end is not given. |
start | string | "" | optional absolute RFC3339 lower bound; overrides the hours-derived value when given. |
end | string | "" | optional absolute RFC3339 upper bound; overrides the hours-derived value when given. |
service | string | "" | optional service-name filter (traces that involve this service). |
status | string | "" | 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 | string | "" | 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 | string | "" | 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 | string | "" | optional exact agent-instance filter, narrowing to one running copy of agent. |
limit | integer | 20 | max rows (default 20). |
cursor | string | "" | opaque page token from a previous call’s next-page cursor, to fetch the page after it. |
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"
}
}list_alert_channels
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.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default). |
Where do my alerts go?
{ "name": "list_alert_channels", "arguments": {} }list_alert_rules
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.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default). |
What alerts are configured?
{ "name": "list_alert_rules", "arguments": {} }list_alerts
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.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default). |
status | string | "" | open or resolved; omit for both. |
kind | string | "" | 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 | string | "" | narrow to the firings of one specific rule (from list_alert_rules). |
service | string | "" | exact service name. |
step | string | "" | exact step (span) name. |
search | string | "" | case-insensitive match on the alert title. |
acknowledged | string | "" | true or false; omit for both. |
hours | integer | 24 | how far back to look, on last_seen. Defaults to 24. The API itself is unbounded if no window is given, which would scan all history. |
limit | integer | 50 | rows to return, at most 200. |
What alerts are open right now?
{ "name": "list_alerts", "arguments": { "status": "open" } }Show me the errors alert for the checkout service this week.
{ "name": "list_alerts", "arguments": { "service": "checkout", "hours": 168 } }list_metrics_catalog
List every metric the platform knows how to compute, with its unit, nullability,
which endpoint 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.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (the catalog is identical for every caller; this only fills the request path). |
group | string | "" | optional group filter, e.g. “cost”, “volume”, “tokens”, “latency”, “ttft”, “reliability”. |
kind | string | "" | optional kind filter: “scalar”, “series”, or “breakdown”. |
What latency metrics exist?
{ "name": "list_metrics_catalog", "arguments": { "group": "latency" } }list_spans
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”.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default; use list_workspaces to discover them). |
hours | integer | 24 | lookback window in hours (default 24), used for whichever of start/end is not given. |
start | string | "" | optional absolute RFC3339 lower bound; overrides the hours-derived value when given. |
end | string | "" | optional absolute RFC3339 upper bound; overrides the hours-derived value when given. |
kind | string | "" | optional derived semantic span kind: “llm”, “tool”, “chain”, “retriever”, “agent”, “embedding”, or “other”. Distinct from each row’s own kind column, which is the raw OTLP span kind (SERVER/CLIENT/INTERNAL/…). |
status | string | "" | optional span status filter, “Ok”, “Error”, or “Incomplete”. |
session_id | string | "" | optional exact match on the span’s session id, across every trace in that session. |
agent | string | "" | 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 | string | "" | optional exact agent-instance filter, narrowing to one running copy of agent. |
search | string | "" | optional case-insensitive contains match on span name, span id, or trace id. |
sort_field | string | "" | optional sort column: “start_time” (default), “duration_ms”, “tokens”, or “cost”. |
sort_dir | string | "" | optional sort direction, “asc” or “desc” (default “desc”). |
limit | integer | 50 | max rows (default 50). |
cursor | string | "" | opaque page token from a previous call’s next-page cursor, to fetch the page after it. |
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" } }list_workspaces
List the workspaces you have access to (id and name).
Use it to find the right value for the workspace argument of the
trace and metrics tools.
No arguments.
Which Rius workspaces do I have?
{ "name": "list_workspaces", "arguments": {} }update_alert_channel
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.
| Argument | Type | Default | Description |
|---|---|---|---|
channel_id | string | required | the channel’s id, from list_alert_channels. |
name | string | "" | a new label. |
url | string | "" | for a webhook — a new https URL to POST to. |
recipients | any | null | for email — the full replacement list of addresses. |
enabled | any | null | turn delivery on or off. |
workspace | string | "" | optional workspace name or id (defaults to your default). |
Disable the ops webhook for now.
{ "name": "update_alert_channel", "arguments": { "channel_id": "8a1…", "enabled": false } }update_alert_rule
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
config - a custom rule has metric thresholds -> pass
rules(+window_minutes)
| Argument | Type | Default | Description |
|---|---|---|---|
ref | string | required | the rule’s kind or uuid. |
enabled | any | null | turn detection on or off. |
rca_enabled | any | null | turn root-cause analysis on or off for this rule. |
name | string | "" | rename a custom rule (predefined rules take their name from their kind). |
config | any | null | 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 | any | null | for a CUSTOM rule only — replace its thresholds. Replaces the whole list, so pass window_minutes with it. |
window_minutes | integer | 0 | 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 | any | null | for a CUSTOM rule only — replace its filters. Replaces the whole list. |
channel_ids | any | null | 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 | string | "" | optional workspace name or id (defaults to your default). |
Turn off the tool loop alert.
{ "name": "update_alert_rule", "arguments": { "ref": "tool_loop", "enabled": false } }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 }
} }workspace_metrics_overview
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.
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.
| Argument | Type | Default | Description |
|---|---|---|---|
workspace | string | "" | optional workspace name or id (defaults to your default; use list_workspaces to discover them). |
hours | number | 24 | 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 | integer | 0 | lookback in minutes instead of hours, for short “last 10 minutes” windows (ignored when 0). |
breakdowns | boolean | true | include the ranked per-model / per-agent / per-kind tables (default true). |
series | boolean | false | include the per-bucket sparkline values (default false; they are verbose). |
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 } }Next steps
- Example workflows: the trace tools composed into complete investigations.
- Quick connect: connecting a client if you have not yet.