observability-aiops
Use this server to read, analyze, and govern writes across self-hosted Prometheus, Alertmanager, Grafana, and Loki via MCP/CLI.
Query Prometheus with instant/range PromQL, label values, series metadata, targets, rules, config/TSDB status.
Inspect firing/pending alerts, Alertmanager post-routing alerts, and silences.
Browse Grafana dashboards, datasources (+ health), and folders.
Read Loki logs with bounded LogQL: labels, label values, query_range, and canned error tail.
Run advisory RCAs/analyses: firing alert RCA, scrape health, alert noise/flap, log error burst, log volume, alert-log correlation.
Perform audited writes: create/expire Alertmanager silences, create Grafana annotations, update/delete dashboards, reload Prometheus config.
Preview writes with dry_run; apply recorded undo via undo_list/undo_apply.
Every call is audited with risk tiers; Loki writes are deliberately unsupported.
Enables interacting with Grafana to list, fetch, update, and delete dashboards, manage datasources and folders, check datasource health, and create annotations, all with audit logging and undo support.
Provides observability and AIOps capabilities for Prometheus, including PromQL instant and range queries, target and rule health checks, alert inspection, TSDB status, and governed write operations such as creating silences and reloading the Prometheus configuration.
Observability AIops
Disclaimer: Community-maintained open-source project. Not affiliated with, endorsed by, or sponsored by the Prometheus or Grafana projects, Grafana Labs, or the Cloud Native Computing Foundation. Prometheus, Alertmanager and Grafana are trademarks of their respective owners. MIT licensed.
Governed AI-ops for a self-hosted observability stack in one server —
Prometheus (HTTP API, PromQL, targets, rules, alerts), Alertmanager
(alerts + silences), Grafana (dashboards, datasources, folders), and
Grafana Loki (bounded LogQL log reads + log RCA) — with a built-in
governance harness: unified audit log, token/runaway budget
guard, undo-token recording, and descriptive risk-tier labels. One config can
span your whole stack; each target names its own platform.
Beyond the mock test suite, the Prometheus/Alertmanager/Grafana reads, the RCAs,
and the governed silence + dashboard write paths (with undo) have been exercised against a live Prometheus 3.x + Alertmanager + Grafana 13 stack — see
docs/VERIFICATION.md.
This is the self-hosted-observability complement to enterprise monitoring suites: it speaks the open Prometheus/Grafana APIs an SRE actually runs, not a vendor NMS.
What it does
Answers the questions an SRE actually repeats over a Prometheus/Grafana stack, and guards the writes that follow:
PromQL + metadata — instant and range queries, label-value enumeration, and series metadata, all read-only and result-capped.
Scrape-target & rule health — which targets are up/down (and why, from
lastError), which were dropped by relabeling, and which recording/alerting rules are erroring.Alerts & silences — firing/pending Prometheus rule alerts, Alertmanager's post-routing view, and its silences.
Grafana — dashboards, datasources (+ health), and folders.
Loki logs — bounded LogQL reads (label + label-value enumeration, a validation-gated
query_range, and a canned error-tail), all read-only with a hard lookback + line cap, optional multi-tenantX-Scope-OrgID, and basic/bearer auth per target.Flagship analyses — transparent heuristics that show their numbers:
firing_alert_rca(join each firing alert to its rule expr → cause + action),target_scrape_health_analysis(rank down/erroring scrapes → likely cause),alert_noise_and_flap_analysis(frequently-repeated / duplicate alerts → dedup/rollup recommendation), plus two log analyses —log_error_burst_rca(per-stream error burst vs baseline → new-signature / volume-spike / single-instance / no-baseline) andlog_volume_analysis(top streams + high-cardinality label warnings + retention hint) — andalert_log_context, which correlates a firing Prometheus alert to its Loki streams.Governed writes — create/expire Alertmanager silences (time-boxed), create Grafana annotations, update/delete dashboards, and hot-reload the Prometheus config — each audited, risk-tiered,
dry_run-able, and the reversible ones capture the real fetched before-state for undo.
Related MCP server: cicd-aiops
What this tool does, and does not, decide
It delivers Prometheus + Grafana operations — reads and writes — accurately and efficiently, and records every one of them. It does not decide whether a write is allowed to happen. That is the agent's judgement, or the permission of the account you connect it with: give it a Grafana token with only Viewer scope, and a Prometheus/Alertmanager reached without the admin/write API, and the writes fail at the server — the place that actually owns the permission.
So there is no read-only switch, no policy file, no approval gate to configure. The one thing the
tool guarantees is that nothing is silent: every call, over MCP and over the CLI alike, lands
an audit row in ~/.observability-aiops/audit.db, and destructive writes still capture their
before-state and record an inverse where one exists.
Each tool declares a
risk_level, carried into the audit row as a descriptive tier (none/confirm/review) — so a reviewer can see at a glance that a row was a high-risk delete. It is a label, not a gate.
Capability matrix (39 MCP tools)
Group | Platform | Tools | Count | R/W |
Metrics | Prometheus |
| 4 | read |
Targets | Prometheus |
| 3 | read |
Status | Prometheus |
| 2 | read |
Rules | Prometheus |
| 2 | read |
Alerts | Prometheus/Alertmanager |
| 4 | read |
Grafana | Grafana |
| 5 | read |
Loki | Loki |
| 4 | read |
Overview | all |
| 1 | read |
Analyses | Prometheus |
| 3 | read |
Log analyses | Loki |
| 2 | read |
Cross-signal | Prometheus + Loki |
| 1 | read |
Writes | Alertmanager |
| 2 | write (med) |
Grafana |
| 1 | write (medium) | |
Grafana |
| 1 | write (med) | |
Grafana |
| 1 | write (high) | |
Prometheus |
| 1 | write (med) | |
Undo | all |
| 1 | read |
all |
| 1 | write (med) |
Loki is read-only — Loki exposes no safe operational write surface (no silence/annotation analogue), so this tool deliberately ships no Loki writes.
The CLI exposes a convenience subset (query, logs, alert, overview, …);
the full 39-tool surface is via the MCP server.
Quick start
As a Claude Code plugin
One install gives an agent both the skill and the MCP server:
/plugin marketplace add AIops-tools/marketplace
/plugin install observability-aiops@aiops-toolsThe MCP server is fetched with uv and pinned to the
package version this plugin declares, so an audit row can be traced back to the
code that wrote it. Credentials are still configured with observability-aiops init — see below.
As an OpenClaw plugin
The same bundle is published on ClawHub, where one install delivers the skill and its MCP server together:
openclaw plugins install clawhub:@zw008/observability-aiops
openclaw skills info observability-aiops # expect: Visible to model: yesRestart the OpenClaw gateway afterwards so it loads the plugin. The MCP server is
fetched with uv, pinned to this exact release, so
uvx has to be on PATH — without it the skill still installs but reports
Visible to model: no. Credentials are configured exactly as below.
As a CLI or standalone MCP server
uv tool install observability-aiops # or: pipx install observability-aiops
observability-aiops init # wizard: pick platform (prometheus/grafana) + store the token (encrypted)
observability-aiops doctor # verify config, secrets, connectivity
observability-aiops overview # snapshot: firing alerts + targets up/down + rules erroring
observability-aiops query instant 'up' # run a PromQL instant query
observability-aiops logs errors '{app="api"}' # tail error-level Loki logs (bounded)
observability-aiops alert rca # root-cause the firing alertsRun as an MCP server (stdio):
export OBSERVABILITY_AIOPS_MASTER_PASSWORD=... # unlock secrets non-interactively
observability-aiops mcpWhere that password then lives: an exported variable is readable by every process this shell starts and is recorded by shell history. On a shared or long-lived host, prefer the interactive prompt, or inject it from a secret manager for the life of the one command that needs it.
Governance
Every MCP tool passes through the bundled @governed_tool harness:
Audit — every call (params, result, status, duration, risk tier, and any operator-supplied approver/rationale) is logged to
~/.observability-aiops/audit.db(relocatable viaOBSERVABILITY_AIOPS_HOME). The CLI writes the same row the MCP path does — there is no unaudited entry point.Runaway guard — a safety backstop, not an authorization gate: the same call hammered in a tight loop trips a circuit breaker. Disable with
OBSERVABILITY_RUNAWAY_MAX=0; optional hard ceilings viaOBSERVABILITY_MAX_TOOL_CALLS/OBSERVABILITY_MAX_TOOL_SECONDS.Undo recording — reversible writes record an inverse descriptor built from the fetched before-state (
create_silence→expire,update_dashboard/delete_dashboard→restore the captured prior model).Risk tier — a descriptive label on the audit row derived from
risk_level; it gates nothing.
Supported scope & limitations
Platforms: Prometheus HTTP API (+ a companion Alertmanager), Grafana HTTP API, and Grafana Loki HTTP API (read-only). Hosted/SaaS monitoring suites (Datadog, New Relic, enterprise NMS) are deliberately out of scope for this tool.
Verification. The mock suite covers all four platforms; in addition the Prometheus, Alertmanager and Grafana surfaces have been exercised against a live Prometheus 3.x + Alertmanager + Grafana 13 stack (RCAs, the silence and dashboard governed writes, and undo replay). The Loki surface has not yet been exercised live. All four are free and open-source and trivial to stand up in a lab (
docker run prom/prometheus,grafana/grafana,grafana/loki), soobservability-aiops doctoris the fastest live check (Prometheus/api/v1/status/buildinfo, Grafana/api/health, Loki/ready+/loki/api/v1/status/buildinfo). Seedocs/VERIFICATION.md.
Missing a capability?
Want another read, an analysis tuned, or a platform capability that isn't here? Open an issue or a PR — feedback and contributions are welcome.
Available Tools
39 toolsalert_log_contextARead-only
[READ][cross-signal] Correlate a firing Prometheus alert to its Loki log streams.
Reads the firing alert's labels from the Prometheus target, maps the Loki-friendly ones (namespace, job, service, app, container, pod, instance, component — first four, in that priority order) into a LogQL stream selector, and pulls the correlated error streams from the Loki target. Best-effort: label values are escaped into the selector and only labels the alert and Loki actually share will match.
Args: alertname: The firing alert's name (from firing_alerts / firing_alert_rca). hours: Lookback window in hours (capped at the tool's max lookback). target: Prometheus target name from config; omit for the default. loki_target: Loki target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| target | No | ||
| alertname | Yes | ||
| loki_target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description adds substantial mechanism beyond that: it reads the alert's labels, maps Loki-friendly labels in a stated priority order, escapes values into a LogQL selector, matches only shared labels, and caps lookback. It also states what it returns (correlated error streams). This is rich behavioral disclosure well past the annotation bar.
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 [READ][cross-signal] tag and the purpose sentence, then mechanism, then Args — a sensible order. It runs a bit long with the parenthetical label list and escaping detail, but nearly every sentence adds real information, so it stays efficient.
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 no output schema, the description does sketch the return ('correlated error streams') and covers all inputs and the best-effort caveat, so an agent can call it correctly. It stops short of detailing the shape of the returned streams, which is the only real gap against the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the burden, and it does: an Args section documents all four parameters — alertname (and its source), hours (lookback, capped), target (config name, omit for default), and loki_target (config name, omit for default). This fully compensates for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: correlate a firing Prometheus alert to its Loki log streams. The [cross-signal] tag plus the explicit Prometheus-to-Loki bridge clearly distinguishes it from single-signal siblings like loki_query, firing_alert_rca, or instant_query. An agent can pick it 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?
Provides clear context for use (a *firing* alert) and routes the agent to the right source for the input by naming 'firing_alerts / firing_alert_rca'. It also sets 'Best-effort' expectations. However, it gives no explicit when-not-to-use condition or a named alternative to reach for when correlation fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alertmanager_alertsBRead-only
[READ] Alerts as Alertmanager sees them (post grouping/silence/inhibit).
Args: active_only: If True, exclude silenced/inhibited alerts. target: Prometheus target name from config (its Alertmanager); omit for default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| active_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is already supplied by annotations, so the '[READ]' prefix is redundant. The genuinely additive part is '(post grouping/silence/inhibit)', which tells the agent these are processed rather than raw alerts. Nothing is said about result shape, grouping collapse, or pagination, so it is modest added value rather than rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short lines with the scope statement front-loaded and no filler. The '[READ]' tag duplicates the annotation and the 'Args:' block is terse, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter read tool with a readOnly annotation, the core is covered. However, with no output schema and a crowded sibling set (firing_alerts, pending_alerts, list_silences, firing_alert_rca), the description never states how this differs from or complements those tools, which is the main completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, and it does document both parameters: active_only's exclusion semantics and target's 'Prometheus target name from config; omit for default'. The target explanation ('its Alertmanager') is slightly vague on what named value to pass, keeping this at adequate rather than strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource (alerts) and, crucially, a scope qualifier: 'as Alertmanager sees them (post grouping/silence/inhibit)'. This conceptually distinguishes it from raw-Prometheus siblings like firing_alerts and pending_alerts, though it never names them explicitly, so full sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the active_only note ('exclude silenced/inhibited alerts') and the target default hint. There is no explicit when-to-use statement or routing to alternatives such as firing_alerts, pending_alerts, or list_silences, so an agent must infer the selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alert_noise_and_flap_analysisBRead-only
[READ][analysis] Find noisy/duplicate alerts → dedup/rollup recommendation.
Args: noise_threshold: Instance count at/above which an alertname is "noisy". target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| noise_threshold | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The '[READ]' prefix merely repeats that annotation. The description adds only that the tool produces a recommendation, without disclosing return shape, thresholds applied, or any cost/limits. Modest added value over the annotation.
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 one-line purpose followed by a compact Args block; no filler sentences. The bracketed '[READ][analysis]' tag is slightly noisy but harmless.
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 read-only two-parameter analysis tool with no output schema needs only to explain purpose and params, which it largely does. The gap is that the advertised 'flap' dimension is never described, so an agent cannot tell whether flapping is covered by this tool or expected elsewhere.
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 burden and does so: it defines noise_threshold ('instance count at/above which an alertname is noisy') and target ('Prometheus target name from config; omit for the default'). Both parameters are given clear 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 ('Find noisy/duplicate alerts') and a concrete outcome ('dedup/rollup recommendation'), which distinguishes it from generic alert tools like firing_alerts. However, the tool name advertises 'flap' analysis while the description never mentions flapping, so the stated scope is narrower than the name implies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to reach for this versus siblings such as firing_alert_rca or alert_log_context. The agent must infer from the name alone that this is the post-noise triage/dedup tool, and there is no statement of prerequisites or when it is inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_annotationADestructive
[WRITE][risk=medium] Create a Grafana annotation (an event marker).
Args: text: Annotation text. tags: Optional list of tag strings. dashboard_uid: Optional dashboard UID to attach the annotation to. dry_run: If True, preview without creating. target: Grafana target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| text | Yes | ||
| target | No | ||
| dry_run | No | ||
| dashboard_uid | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=true, so the write/repeat-safety profile is largely covered. The description adds useful context the annotations do not carry — the [WRITE][risk=medium] label and the dry_run "preview without creating" semantics — but never says whether the created annotation can be deleted, what happens if the same text is submitted twice, or how the target config is resolved.
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 purpose is front-loaded in the first sentence, followed by a compact Args block that maps one line per parameter. It is appropriately sized for a five-parameter mutation tool, with 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 5-parameter mutation tool with no output schema, the description covers purpose, every argument, and the dry-run escape hatch, which is nearly everything an agent needs to invoke it correctly. The remaining gap is failure/permission behavior, which is not addressed.
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 parameter meaning, and it does: it documents all five arguments, including the optionality of tags/dashboard_uid/target and the behavior of dry_run. It stops short of formats (e.g. tag syntax or how dashboard_uid relates to tags), keeping it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Create a Grafana annotation") and adds a clarifying gloss ("an event marker"). No sibling tool creates annotations, so the operation is unambiguously distinct from the list/get/query siblings that surround it.
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 only implied: the agent can infer this is the tool for writing event markers, and the dry_run argument hints at a preview-before-commit workflow. There is no explicit statement of when to use this versus alternatives, nor prerequisites such as required Grafana permissions or target configuration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_silenceADestructive
[WRITE][risk=medium] Create a time-boxed Alertmanager silence. Inverse: expire_silence.
Args: matchers: List of {name, value, isRegex?} to match alerts to silence. minutes: Silence duration in minutes (must be > 0; silences are time-boxed). comment: Reason recorded on the silence. dry_run: If True, preview without creating. target: Prometheus target (its Alertmanager); omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| comment | No | silenced via observability-aiops | |
| dry_run | No | ||
| minutes | No | ||
| matchers | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=true, so the write/safety profile is covered. The description usefully adds that silences are time-boxed, that minutes must be > 0, and that matchers select which alerts get muted — but it never explains the actual consequence of 'destructive' here (that matching alerts stop notifying).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence carries the operation and its inverse, followed by a compact Args list where each line maps to a parameter with no filler. The [WRITE][risk=medium] tag is dense signal rather than noise.
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 5-parameter mutation tool with no output schema, the description covers the operation, all parameters and the inverse action. What's missing is the operational context an agent would want: what happens to already-firing alerts, whether re-creation is possible, and any auth requirements.
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 burden, and it does document all five parameters: matcher object shape {name, value, isRegex?}, the minutes > 0 constraint, the meaning of comment, dry_run's preview semantics, and target's default behavior. This is a solid compensation, though matcher value semantics (exact vs. regex matching) stay thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a time-boxed Alertmanager silence') and flags the write risk level. It explicitly names its inverse sibling, expire_silence, so an agent can distinguish the create/expire pair without inspecting 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 description identifies the inverse tool (expire_silence) and notes dry_run previews a change without creating it, which gives some routing signal. However, it never states when silencing is the right action versus alternatives (e.g., fixing the underlying alert), nor any prerequisites such as required permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
datasource_healthBRead-only
[READ] Health of one Grafana datasource.
Args: datasource_id: Numeric datasource id (from list_datasources). target: Grafana target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| datasource_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the "[READ]" prefix merely restates that without adding information. The description says nothing about what a "health" check actually does (backend query, latency, error surface), whether it has side effects, or any rate/auth considerations, so it adds no behavioral context beyond the annotation.
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 short, front-loaded with the one-line purpose, and the argument list is compact with no filler. The bracketed "[READ]" prefix is slightly redundant with the annotation but costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with no output schema, the definition is adequate on inputs but leaves a real gap: it never indicates what the health result contains or how failure is reported, which matters since no output schema exists to fill that in.
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 largely does so: datasource_id is defined as a numeric id sourced from list_datasources, and target is explained as a config target name with the omission-means-default behavior called out. Minor gaps remain (no id format/range, no target naming conventions).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ("Health of one Grafana datasource") and scopes it to a single datasource, which is enough to tell it apart from list_datasources. It stops short of explicitly distinguishing it from nearer siblings like prometheus_config_status or rule_health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is the parenthetical that datasource_id comes from list_datasources, which is a prerequisite rather than guidance on when to use this tool. There is no statement of when to prefer it over prometheus_config_status, rule_health, or other health-oriented siblings, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_dashboardADestructive
[WRITE][risk=high] Delete a Grafana dashboard. Captures the prior model BEFORE delete.
Pass dry_run=True to preview (reports the dashboard title). Optionally set an approver (OBSERVABILITY_AUDIT_APPROVED_BY) to annotate the audit row — it is not required. The prior model is captured so the recorded undo can recreate it.
Args: uid: Dashboard UID to delete (from list_dashboards). dry_run: If True, preview without deleting. target: Grafana target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | ||
| target | No | ||
| dry_run | No |
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 adds real depth: the prior model is captured before delete so undo can recreate it, dry_run previews by reporting the dashboard title, and an approver can annotate the audit row without being mandatory. It discloses state capture, audit behavior, and preview semantics 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 with the risk tag and purpose, then behavior, then a structured Args block. The two mentions of prior-model capture are a fact and its rationale rather than dead repetition; every sentence contributes.
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?
There is no output schema, yet the description covers the preview return ('reports the dashboard title'), the audit trail, the undo/restore mechanism, and all parameters. For a three-parameter destructive tool with full annotation coverage, nothing an agent needs to invoke it 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 must carry the burden — and it does, documenting all three parameters: uid (with provenance from list_dashboards), dry_run (preview intent), and target (config name, omittable for default). Nothing in the schema is left undocumented.
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 ('Delete a Grafana dashboard') prefixed by a [WRITE][risk=high] tag. It is trivially distinguishable from list_dashboards, get_dashboard, and update_dashboard, and the risk tag immediately signals the mutation class.
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 operational context: pass dry_run=True to preview, optionally set OBSERVABILITY_AUDIT_APPROVED_BY (explicitly not required), and notes uid provenance from list_dashboards. It stops short of naming undo_apply as the recovery path or stating when not to delete, so it is strong but not complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dropped_targetsARead-only
[READ] Targets discovered but dropped by relabeling.
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this as a safe read, so the '[READ]' prefix is redundant. The description does add useful domain context: the drops come specifically from relabeling, not from scrape failures. It says nothing about return shape, pagination, or whether a config reload is involved.
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 purpose clause is front-loaded and wastes no words. The Args block is boilerplate but earns its place because the schema documents nothing about the parameter.
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 no output schema and 0% schema coverage, the description has to carry more than it does. It establishes what the tool returns conceptually and how to filter, but leaves the default target, the return structure, and the relationship to config reload undefined.
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 carries no description for 'target', so the description is the only source of semantics. It explains that the value is a Prometheus target name from config and that omitting it selects the default. It stops short of defining which target is 'the default'.
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 resource and condition: targets that were discovered but dropped by relabeling. That is meaningfully distinct from the near-neighbors list_targets and target_scrape_health, so an agent can pick it out. It lacks an explicit verb, but the read-only listing intent is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose (debugging relabel drops) rather than stated. No when-to-use or when-not-to-use guidance, and the close siblings list_targets and target_scrape_health are never contrasted. The only explicit guidance is the 'omit for the default' note on the argument.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expire_silenceADestructive
[WRITE][risk=medium] Expire (delete) an Alertmanager silence by id.
Args: silence_id: The silence id (from list_silences / create_silence). dry_run: If True, preview without expiring. target: Prometheus target (its Alertmanager); omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| dry_run | No | ||
| silence_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, so the safety profile is partly covered. The description adds meaningful context beyond that: the [WRITE][risk=medium] rating and the dry_run preview capability, which is an important safety behavior an agent should know before deleting.
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 write/risk tags and the core action, followed by a compact Args block. Every line earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive write tool with no output schema and three params, the description covers purpose and args but says nothing about the return value, failure behavior, or permissions requirements. Adequate but with a clear gap for an irreversible-style operation.
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 parameter meaning and it does: silence_id (source), dry_run (preview without expiring), and target (which Alertmanager, omit for default). This covers all three parameters adequately, though it gives no id format detail.
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: 'Expire (delete) an Alertmanager silence by id', with the [WRITE][risk=medium] tag signaling the category immediately. It is clearly distinguishable from create_silence and list_silences (which it even cites as the id source), though it does not explicitly name those 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?
Tells the agent where the silence_id comes from (list_silences / create_silence) and offers dry_run as a preview path, which implies when to use it. But there is no explicit when-not guidance or statement of alternatives for a destructive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firing_alert_rcaARead-only
[READ][analysis] Root-cause firing alerts: join each to its rule expr → cause+action.
Pulls firing alerts + alerting rules, matches them, and maps each to a likely cause and recommended action. Advisory heuristic — verify before acting.
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds genuine context by labeling this an 'Advisory heuristic — verify before acting', which tells the agent the cause/action output is non-authoritative. It does not cover pagination, limits, or return shape, but the advisory caveat is meaningful added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the [READ][analysis] tag and a one-line summary; the follow-up sentence and Args block stay tight. Minor redundancy where 'Pulls firing alerts + alerting rules, matches them' restates the first line's join description.
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 no output schema and only readOnlyHint, the description covers the input, the internal mechanism, and the advisory nature of the result — enough to invoke and interpret it correctly. Only return-format/pagination specifics are absent, which is acceptable given the tool's focused scope.
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% for the single optional 'target' param, so the description must carry it: it explains that target is a Prometheus target name from config and that omitting it uses the default. That fully compensates for the undocumented schema, though it adds no format/validation detail.
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 (root-cause firing alerts) plus the mechanism (join each alert to its rule expr to produce cause+action). This clearly differentiates it from the sibling 'firing_alerts' which merely lists them, and from other *_rca siblings by naming the alert domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and body — use it to diagnose firing alerts — and the 'target ... omit for the default' note gives a calling hint. However, it never explicitly says when to prefer this over firing_alerts, alert_noise_and_flap_analysis, or log_error_burst_rca, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
firing_alertsBRead-only
[READ] Currently firing Prometheus rule alerts, grouped by severity.
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the '[READ]' tag merely restates that. The description does add genuine value beyond annotations by disclosing the output shape ('grouped by severity') and that target names come from config with a default fallback, though it says nothing about permissions, scope, or limits of the read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short components with the purpose front-loaded before the Args block; no filler sentences. Slightly terse and the bracketed tag is redundant with annotations, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with no output schema and readOnlyHint covering the safety profile, the description supplies purpose, grouping behavior, and full parameter meaning. Only sibling disambiguation within the alerting family is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for the lone parameter and does so well: it identifies 'target' as a Prometheus target name sourced from config and explains that omitting it selects the default. It stops short of giving format examples or listing valid target 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+resource: 'Currently firing Prometheus rule alerts', with the added scope 'grouped by severity'. The resource is precise enough that an agent can distinguish it from pending_alerts, alertmanager_alerts, and firing_alert_rca, though it never explicitly names those 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?
There is no guidance on when to choose this tool over pending_alerts or alertmanager_alerts, which is the main ambiguity given the crowded alerting family. The only usage-like statement, 'omit for the default', is about the parameter rather than tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dashboardARead-only
[READ] One dashboard's summary (title, version, panel + tag counts).
Args: uid: Dashboard UID (from list_dashboards). target: Grafana target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the '[READ]' tag is largely redundant. What does add value is disclosing the return shape ('summary' with title, version, panel + tag counts), which tells the agent it will not receive the full dashboard model. No auth or rate-limit details, but those are secondary here.
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 read tag and a one-line purpose, followed by a compact args block. Every sentence is load-bearing and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description covers the purpose, the scope of the returned summary, and both arguments. It is nearly self-sufficient; only the uid string format is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the params, and it does: uid is explained with its source (list_dashboards) and target is explained as a config name with omit-for-default behavior. Both parameters gain meaning beyond the bare schema types, though the uid format itself is not described.
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 names a specific verb+resource ('One dashboard's summary') and enumerates what the summary contains (title, version, panel + tag counts). This cleanly separates it from list_dashboards (bulk list) and update_dashboard/delete_dashboard, though the differentiation is implied by scope rather than stated explicitly against a named sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use/when-not statement, but the uid note ('from list_dashboards') implies the prerequisite workflow: list first, then fetch a single dashboard's summary. Usage is inferable but not spelled out, and no alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
instant_queryARead-only
[READ] Evaluate a PromQL expression at a single instant.
Args: query: A PromQL expression (e.g. 'up' or 'rate(http_requests_total[5m])'). time: Optional RFC-3339 or unix timestamp for the evaluation instant. target: Prometheus target name from config; omit for the default.
Returns an envelope with returned/limit/truncated. If
truncated is true the result is partial — narrow the selector or raise
the limit rather than treating it as complete.
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | ||
| query | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is already declared, so the annotation carries the safety profile, and the description usefully reinforces it with a '[READ]' tag. More importantly it discloses behavior beyond the annotations: that results arrive in an envelope and that truncated=true means a partial result requiring a narrower selector or higher limit. It doesn't cover pagination mechanics or any auth/target-resolution caveats.
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 '[READ]' marker and the core purpose in one sentence, then uses a compact Args block with no filler. The Returns paragraph is slightly longer than needed, but the truncation warning is actionable 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?
With no output schema, the description steps in to describe the return envelope (returned/limit/truncated) and the meaning of partial results, which is exactly what an agent needs to avoid misreading output. It is nearly complete for this read tool; the only omissions are the default value of 'time' and any hint about result-size limits.
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 largely meets it: it defines 'query' with concrete PromQL examples, gives accepted formats for 'time' (RFC-3339 or unix), and explains 'target' resolution plus the omit-for-default behavior. The one gap is that it never states what 'time' defaults to when omitted (presumably now).
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 (evaluate) and resource (PromQL expression) scoped to a single instant. The 'single instant' qualifier implicitly separates it from the sibling range_query, but the description never names that alternative, so it falls short of the explicit sibling differentiation a 5 requires.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'at a single instant' and the documented 'time' argument, which together signal this is for point-in-time evaluation rather than a range. However, the description gives no explicit when-to-use, when-not, or reference to range_query as the alternative, so the agent must infer the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
label_valuesARead-only
[READ] Distinct values of a label (default name = all metric names).
Args: label: Label name to enumerate (default name). match: Optional PromQL selector to scope the values (e.g. '{job="api"}'). target: Prometheus target name from config; omit for the default.
Returns an envelope with returned/limit/truncated. If
truncated is true the result is partial — narrow the selector or raise
the limit rather than treating it as complete.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | __name__ | |
| match | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description adds real value by disclosing the return envelope (returned/limit/truncated) and warning that truncated=true means partial results, plus what to do about it. It still omits any auth/permission or rate-limit context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the [READ] marker and a one-line purpose, then Args and Returns in scannable order. Every sentence carries information; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description covers the parameters, the return envelope, and truncation handling, which is enough to call and interpret it. Missing only environmental context such as auth requirements or per-target scope.
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%, but the description compensates for all three parameters: label (with default __name__), match as an optional PromQL selector with an example, and target as the Prometheus config target with omit-for-default semantics. A syntax example for match would make this fully self-sufficient.
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: enumerate the distinct values of a label, with the clarifying default that __name__ yields all metric names. The mention of a PromQL selector and a Prometheus target implicitly separates it from the Loki siblings, but that differentiation is never made explicit.
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 rather than spelled out — the agent can infer this is for enumerating label values, and the truncation note gives remediation guidance. There is no explicit when-to-use/when-not statement or named alternative (e.g. vs loki_label_values or series_metadata).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dashboardsARead-only
[READ] Grafana dashboards (optionally filtered by a title query).
Args: query: Optional title substring to search for. target: Grafana target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The '[READ]' prefix merely restates the readOnlyHint=true annotation, adding no information beyond structured data. No behavioral context is disclosed about result size, pagination, ordering, or what happens when the target is unreachable.
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 purpose sentence is front-loaded and the Args block is compact with no filler. It is slightly verbose for a two-parameter list tool but every line is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with no output schema and only two optional parameters, the description covers both inputs and the default-target behavior. Return-value shape is not described, but that is acceptable given the tool's simplicity.
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 burden, and it does reasonably well: it defines 'query' as an optional title substring and 'target' as a Grafana target name from config, with the extra guidance to omit it for the default. This meaningfully compensates 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?
States a specific verb ('list') and resource ('Grafana dashboards') with a scope qualifier (optional title filtering), which cleanly separates it from siblings like get_dashboard, update_dashboard, and delete_dashboard. An agent can select it 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?
There is no when-to-use guidance, no mention of when to prefer get_dashboard or list_folders, and no stated prerequisites or exclusions. The only routing information is implicit in the parenthetical filter note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasourcesBRead-only
[READ] Configured Grafana datasources (id, uid, name, type, default).
Args: target: Grafana target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is already declared in annotations, and the '[READ]' prefix merely restates it, so no credit there. It does add value by disclosing the fields returned, which matters since there is no output schema, but it omits any auth or scoping behavior. Adequate given annotations carry 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-loaded with the resource and returned fields, then a compact Args block. Every line earns its place; the only minor redundancy is the '[READ]' tag duplicating an annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple parameterless list tool with no output schema, listing the returned fields plus the target argument's default behavior covers what an agent needs. Annotations handle the read-only safety profile, leaving little 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% and the schema only names 'Target' with no description, so the description carries the burden and does so: it defines target as 'Grafana target name from config' and clarifies default behavior ('omit for the default'). With only one param, this is solid compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (Grafana datasources) and even enumerates the returned fields (id, uid, name, type, default). It is clear, but it does not distinguish itself from related siblings like datasource_health, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage guidance is the parameter note 'omit for the default,' which explains the target argument but not when to choose this tool over datasource_health or other status tools. There is no explicit when-to-use or when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_foldersBRead-only
[READ] Grafana folders.
Args: target: Grafana target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, and the '[READ]' tag merely restates that. No return shape, pagination, ordering, or scope behavior is disclosed, so the description adds essentially nothing behavioral beyond the structured annotation.
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 'Args:' block is direct and the tag is front-loaded, with no wasted prose. The one gap is that the '[READ]' marker duplicates the annotation rather than contributing 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 single-parameter list tool with annotations covering the safety profile and no output schema, the definition is adequate but thin — it lacks any indication of return contents or how it relates to the dashboard/datasource list siblings.
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 load — and it does: 'Grafana target name from config; omit for the default' explains both the source and the default semantics of the sole parameter, which the bare 'Target' schema field does not.
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 verb 'list' plus the resource 'Grafana folders' clearly states what the tool does, so an agent can identify it. However, it does nothing to distinguish itself from adjacent list tools such as list_dashboards or list_datasources beyond the resource name.
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 '[READ]' tag implies a safe retrieval operation but there is no statement of when to use this versus list_dashboards (e.g. to resolve folder UIDs before dashboard queries) and no exclusions or prerequisites. Usage is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rulesARead-only
[READ] All recording + alerting rules, optionally filtered by type.
Args: rule_type: Filter by "alerting" or "recording"; omit for both. target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| rule_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is already provided by annotations, and the '[READ]' marker merely echoes it. The description adds the useful default behavior for 'target' (omit for the default), but says nothing about return volume, pagination, or what a filtered vs unfiltered result looks like.
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?
Short and front-loaded, with the one-line summary first and per-parameter notes after. There is minor redundancy between 'optionally filtered by type' in the summary and the rule_type line below it.
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 no-output-schema list tool with annotations covering the read-only profile: the description is adequate on inputs but silent on return shape, ordering, or empty-result behavior. Adequate but with a visible gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and it delivers: rule_type's accepted values ('alerting' or 'recording') are documented and the target parameter's default-fallback semantics are explained. It does not clarify whether target matches a config key or a URL/label.
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'), resource ('recording + alerting rules') and scope ('optionally filtered by type'), with a '[READ]' marker. It is clearly distinguishable from siblings like firing_alerts or list_silences, though it does not explicitly name a sibling it is not (e.g. rule_health).
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 explains parameter usage ('omit for both', 'omit for the default') but never says when to reach for this tool versus rule_health, alertmanager_alerts, or firing_alerts. Usage is implied rather than stated with conditions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_silencesBRead-only
[READ] Alertmanager silences (active, pending, expired).
Args: target: Prometheus target name from config (its Alertmanager); omit for default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the [READ] prefix is redundant but confirmatory. The description does add value by enumerating the silence states returned (active, pending, expired) and noting the default-target fallback, but says nothing about pagination, filtering, or result size.
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 [READ] marker and the resource/states in one line, then the single argument. The simple 'Args:' block is slightly raw formatting but wastes little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the definition covers the resource, the returned states, and the argument semantics adequately. Only filtering/pagination behavior is left unstated, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the load, and it does: it explains that 'target' is a Prometheus target name from config referring to its Alertmanager, and that omitting it uses the default. This meaningfully exceeds what the bare string schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (Alertmanager silences) and enumerates the statuses returned (active, pending, expired). An agent can identify it clearly, though it never names its sibling alternatives (create_silence, expire_silence) to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no named alternatives. It does not say when to reach for this versus create_silence or expire_silence, nor when a silence listing is relevant, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_targetsARead-only
[READ] Active scrape targets, optionally filtered by health (up/down).
Args: health: Filter by health state ("up" or "down"); omit for all. target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| health | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the '[READ]' prefix merely restates it. The description adds the filtering behavior but says nothing about result size, pagination, or ordering for a potentially large target list. With annotations covering the safety profile, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The summary line is front-loaded and the Args block is terse with one line per parameter. No filler text, though the '[READ]' tag duplicates the annotation and earns 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?
There is no output schema, so the description should signal what comes back (target list shape, health fields, pagination). For a simple two-optional-parameter read tool this is close to sufficient, but the return contract is left entirely implicit.
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 burden and mostly succeeds: it explains that health accepts only 'up' or 'down' (values absent from the schema, which is a bare anyOf string/null), and that target is a Prometheus target name from config with a default when omitted. This adds real meaning beyond the schema for both parameters.
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 ('Active scrape targets') plus the optional filter, which is enough to distinguish it from write tools like reload_prometheus_config. It does not, however, differentiate itself from close siblings such as target_scrape_health, dropped_targets, or target_scrape_health_analysis, which an agent could easily confuse it with.
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 implies usage ('omit for all') but never states when to pick this tool over siblings like dropped_targets or target_scrape_health. No prerequisites, exclusions, or alternative routing are provided, so the agent must infer the selection from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_error_burst_rcaARead-only
[READ][analysis] Root-cause an error burst: current window vs baseline, per stream.
Pulls error streams for the current window (now-hours..now) and an equal-length
baseline window (now-2*hours..now-hours), then classifies each burst as a new
error signature, a volume spike, or a single-instance burst — with a cause +
action. If the baseline window had no logs at all (retention or ingestion gap),
streams are classified no_baseline rather than new: an empty baseline is
not evidence of a regression. Advisory heuristic; verify against the raw logs.
Args: selector: A Loki stream selector to scope the analysis (e.g. '{app="api"}'). hours: Window length in hours for both current and baseline (capped). loki_target: Loki target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| selector | Yes | ||
| loki_target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses the window mechanics (now-hours..now vs now-2*hours..now-hours), the three classification outcomes (new signature, volume spike, single-instance burst), the no_baseline edge case and its rationale, and the advisory-heuristic caveat. This is rich behavioral 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?
Front-loaded with the core purpose, then structured procedure, edge-case handling, and an Args block. Every sentence carries information, though the unpacked window arithmetic is slightly verbose.
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?
No output schema exists, so the description must convey what the tool returns, and it does: per-stream classifications with a cause + action, plus explicit no_baseline handling. For a 3-param analytical tool with read-only annotations, nothing material to 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?
With 0% schema description coverage the description must compensate, and it does: selector is defined as a Loki stream selector with a concrete example, hours as the shared window length for both windows (and noted as capped), and loki_target as a config name defaulting to omit. Minor gap: the actual cap value and hour granularity are not specified, but the semantics are otherwise well covered.
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 opens with a specific verb+resource ('Root-cause an error burst: current window vs baseline, per stream') that clearly distinguishes it from siblings like log_volume_analysis, loki_query, and firing_alert_rca. An agent can tell what it does and how it differs 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?
It gives a clear triggering context (root-causing an error burst) and even a caveat about verification against raw logs, but it never names alternatives such as log_volume_analysis or loki_query, nor states explicit when-not-to-use conditions. Clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_volume_analysisBRead-only
[READ][analysis] Top streams by volume + high-cardinality (high-churn) label warnings.
Ranks the highest-volume streams under the selector, flags labels with many distinct values as cardinality-explosion risks, and adds a retention hint from Loki index stats when available.
Args: selector: A Loki stream selector to scope the analysis (e.g. '{namespace="prod"}'). hours: Lookback window in hours (capped at the tool's max lookback). loki_target: Loki target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| selector | Yes | ||
| loki_target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description is consistent with a read-only analysis. It adds some behavioral context beyond annotations: the hours window is capped at the tool's max lookback, and a retention hint is returned only when Loki index stats are available. No pagination, result-size, or failure behavior is disclosed.
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 type/analysis tags, then a compact paragraph on what it returns, then a structured Args list. Every sentence carries information; sizing is appropriate for the tool's complexity.
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 no output schema, the description does describe what is produced: ranked high-volume streams, high-cardinality label warnings, and a retention hint. Combined with full per-parameter documentation, an agent has enough to invoke it correctly, though return shape/limits remain unspecified.
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 document all three args. It clarifies the selector scopes the analysis (with a concrete example), that hours is a lookback window capped at a max, and that loki_target comes from config with a default when omitted.
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 concrete verb+resource: it ranks top streams by volume, flags high-cardinality labels, and adds a retention hint. The [READ][analysis] tag and the specific output set distinguish it from generic Loki tools like loki_query. However, it doesn't explicitly name which sibling it replaces or contrasts with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no named alternative. An agent can infer this is for volume/cardinality investigation, but nothing tells it to prefer this over loki_query, loki_labels, or log_error_burst_rca.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loki_labelsARead-only
[READ] Distinct Loki label names present in the lookback window.
Args: hours: Lookback window in hours (capped at the tool's max lookback). target: Loki target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the [READ] tag adds little. The description does add one genuine behavioral constraint — the hours window is capped at the tool's max lookback — and notes target defaults to config. No return-shape or volume/rate context beyond that.
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 in one line, followed by a compact Args block. No filler sentences; sizing is appropriate for a two-parameter read 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?
For a simple read-only listing tool with no output schema and readOnlyHint already set, the description covers what the tool returns (distinct label names), the window semantics, and target selection. Only the max-lookback value and return format remain unstated, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and does so for both params: hours is the lookback window (with the cap caveat) and target is a config target name that can be omitted for the default. Both parameters gain meaning the bare schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Distinct Loki label names present in the lookback window.' That clearly separates it from the sibling loki_label_values (which returns values for a label), even though the sibling is never named. Clear, but no explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this is the tool for enumerating label names in a time window, but there is no 'when to use this vs loki_label_values or loki_query' guidance and no exclusions. Adequate minimum, with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loki_label_valuesARead-only
[READ] Distinct values of one Loki label (bounded).
Args: name: Label name to enumerate (e.g. 'app', 'namespace'). hours: Lookback window in hours (capped at the tool's max lookback). target: Loki target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| hours | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the [READ] tag is redundant. The description does add real context beyond the annotation: results are 'bounded' and the hours window is 'capped at the tool's max lookback.' Return shape and pagination/truncation behavior remain unspecified, so it lands at adequacy rather than richness.
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 purpose sentence is front-loaded in one line, followed by a compact Args block; every line carries information. Minor overhead is the '[READ]' tag already covered by annotations.
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 3-parameter read-only tool with no output schema, the description covers purpose, all parameters, and the bounding/cap constraints. Only the result shape and whether values are truncated are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all parameter meaning — and it largely does: 'name' is a label name with concrete examples ('app', 'namespace'), 'hours' is a lookback window with a cap caveat, and 'target' is a config-defined Loki target with 'omit for the default'. It compensates well for the empty schema descriptions, missing only the default value for hours.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: enumerating distinct values of one Loki label, with a [READ] tag marking it non-mutating. It implies a difference from siblings like loki_labels (which would list label names) and label_values (the Prometheus counterpart), but never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Distinct values of one Loki label' — an agent can infer this is for value discovery on a known label — but there is no explicit when-to-use, when-to-use-something-else, or prerequisite guidance, and no routing against loki_labels or label_values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loki_queryARead-only
[READ] Bounded LogQL query_range passthrough (validation-gated).
The query MUST carry a stream selector (e.g. '{app="api"}') — an unbounded query with no selector is rejected. Lookback is capped and the line count is clamped.
Args: logql: A LogQL query with a stream selector (e.g. '{job="api"} |= "error"'). hours: Lookback window in hours (capped at the tool's max lookback). limit: Max log lines to return (clamped to the tool's max line limit). target: Loki target name from config; omit for the default.
Returns an envelope with returned/limit/truncated. If
truncated is true the result is partial — re-run with a higher limit.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| limit | No | ||
| logql | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it discloses real operational behavior: the stream-selector validation gate, a capped lookback, a clamped line limit, and truncation semantics with the recommended remediation. That is exactly the extra context 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 Args, then Returns in clearly labeled blocks; no sentence is filler. The truncation caveat is placed where an agent will act on it.
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 no output schema, the description supplies the return envelope (returned/limit/truncated) and interprets the truncated flag, and it covers every input parameter plus the hard validation constraint. Nothing needed to invoke or interpret the call 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 whole burden — and it does: logql (with a concrete example and the selector requirement), hours (lookback, capped), limit (max lines, clamped), and target (config name, omit for default). All four parameters are explained with 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?
The opening line states a specific verb and resource — a bounded LogQL query_range passthrough — plus the two distinguishing traits (validation-gated, bounded). It is immediately separable from siblings like loki_tail_errors or log_volume_analysis, which are curated analyses rather than a raw query passthrough.
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 the gating condition (a stream selector is mandatory; unbounded queries are rejected) and follow-up guidance (re-run with a higher limit when truncated). It does not, however, name when to prefer this over sibling log tools or state any exclusions, 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.
loki_tail_errorsARead-only
[READ] Canned error-level read for a stream selector (error line-filter).
Args: selector: A Loki stream selector (e.g. '{app="api"}' or 'app="api"'). hours: Lookback window in hours (capped at the tool's max lookback). limit: Max log lines to return (clamped to the tool's max line limit). target: Loki target name from config; omit for the default.
Returns an envelope with returned/limit/truncated. If
truncated is true the result is partial — re-run with a higher limit.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| limit | No | ||
| target | No | ||
| selector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, so safety is covered. The description goes further by disclosing runtime behavior the annotations cannot: hours are capped at a max lookback, limit is clamped to a max line limit, and a truncated envelope signals a partial result that should be re-run with a higher limit. That truncation disclosure is the kind of operational context agents need.
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 a one-line purpose tagged [READ], then organized Args and Returns sections. Every sentence carries information; the only mild redundancy is the [READ] tag duplicating readOnlyHint.
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 no output schema, the description compensates by describing the return envelope (returned/limit/truncated) and the action to take when truncated. Combined with per-parameter semantics, an agent has what it needs to call and interpret the tool, leaving only default values unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and largely does: it gives selector syntax examples, and explains that hours is a lookback capped at a max, limit is clamped, and target selects a named Loki target with default fallback. All four params gain meaning, though exact defaults (hours=1, limit=100) are left to the 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: an error-level read of a Loki stream, with the phrase 'error line-filter' clarifying it returns only error lines. It is distinguishable from loki_query in practice, but it never names that sibling explicitly, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'canned' implies a convenience shortcut for a common case (grabbing recent error logs), which lets an agent infer when to reach for it over the generic loki_query. However, there is no explicit when-to-use statement and no exclusion or alternative named, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
observability_overviewARead-only
[READ] Platform-aware health snapshot for the target.
Prometheus: firing-alert count + scrape up/down + rules erroring. Grafana: dashboard / datasource / folder counts.
Args: target: Target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read, and the '[READ]' tag merely restates it. The description does add useful context beyond annotations: the platform-aware scope and the exact categories counted per platform. It does not say what happens when one platform (Prometheus or Grafana) is unreachable or unconfigured, nor how errors are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short blocks with the purpose front-loaded, platform coverage clearly grouped, and arguments last. Nothing is padded; the only near-redundancy is the '[READ]' tag that mirrors the annotation, but it costs a single token.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only rollup with one optional parameter and no output schema, the description covers purpose, per-platform coverage, and argument semantics. The remaining gap is the shape of the returned snapshot (per-platform keys, partial-failure behavior), which is minor given the annotation already asserts a safe read.
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 single parameter has no schema description, so the description must carry the semantics — and it does: 'Target name from config; omit for the default' tells the agent where valid values come from and what omission does. It stops short of naming the default target or showing a config example, keeping it at 4 rather than 5.
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 (health snapshot) plus the exact resources it rolls up, enumerating the metrics per platform: firing-alert count, scrape up/down, rule errors, and Grafana dashboard/datasource/folder counts. This enumeration distinguishes it from narrow siblings such as firing_alerts, datasource_health, and list_dashboards, which cover only one slice.
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 implies a first-pass overview use case but never says when to prefer it over the many specific siblings (firing_alerts, rule_health, datasource_health, etc.) or when to drill down instead. It only gives guidance for the target argument ('omit for the default'), leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pending_alertsARead-only
[READ] Pending (not-yet-firing) Prometheus rule alerts, by severity.
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this is a safe read, and the '[READ]' prefix merely restates that. The description adds some value by signaling results are organized 'by severity' and that omitting target falls back to a default, but discloses nothing about empty results, pagination, or how pending state is determined.
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?
Very short and front-loaded: the scope sentence comes first, followed by a compact Args block. The only waste is the '[READ]' prefix, which duplicates readOnlyHint and earns no 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 single-optional-parameter read tool with annotations covering the safety profile and no output schema, the definition supplies what an agent needs: what is returned (pending, non-firing alerts), how they are arranged (by severity), and how to pick a target. Only minor gaps remain around empty-result handling.
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% and the single 'target' parameter has no schema description at all, so the description carries the burden — and it does, explaining the parameter is a Prometheus target name from config and that omission selects the default. It stops short of describing valid naming formats or error behavior for an unknown target.
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 names a specific resource ('Prometheus rule alerts') and pins down the exact state with the parenthetical 'pending (not-yet-firing)', which effectively separates it from the sibling firing_alerts. It doesn't explicitly name that sibling or state a verb, falling just short of full sibling routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'pending (not-yet-firing)' qualifier, so an agent can infer this is the pre-firing counterpart to firing_alerts, but there is no explicit when-to-use/when-not-to-use guidance or named alternative. The only direct instruction is 'omit for the default' on the target.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prometheus_config_statusARead-only
[READ] Running-config fingerprint + size (never the raw YAML/secrets).
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint; the description adds meaningful behavioral context by asserting the tool returns a fingerprint and size and never the raw YAML or secrets, which tells the agent what it will and won't receive. It still omits auth requirements and how the fingerprint is computed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact lines with the read-only marker and the secrecy guarantee front-loaded; every clause earns its place and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and one optional param, the description covers the essentials: what is returned (fingerprint + size), what is withheld (YAML/secrets), and what the param means. Missing only when to reach for it relative to reload_prometheus_config.
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 single property has no description, so the description carries the burden. It does explain that 'target' is a Prometheus target name from config and that omitting it selects the default, which is genuinely useful given the null default.
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 ([READ] config status) and pins down the payload precisely: a running-config fingerprint plus size. It implicitly distinguishes itself from the mutation sibling reload_prometheus_config by flagging [READ], though it never names it.
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 only argument guidance ('omit for the default'), not when to call this versus reload_prometheus_config or prometheus_tsdb_status. No conditions, prerequisites, or alternative routing are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prometheus_tsdb_statusBRead-only
[READ] TSDB head cardinality stats + the top metrics by series count.
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this is a safe read, so the '[READ]' prefix is largely redundant. The description does add value by naming the returned content (cardinality stats and top metrics by series count), which is useful since no output schema exists, but it omits cost, cardinality-explosion risk, or default-target behavior details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short lines with the resource/return summary front-loaded and the parameter note after. The 'Args:' boilerplate is slightly mechanical but there is no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with annotations covering safety, the description is adequate: it says what is read and how to pick a target. It stops short of explaining the scale of the output (how many top metrics, ordering) or when this status view is preferable to related tools, which leaves moderate gaps given there is no 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 coverage is 0%, so the description must carry the parameter, and it does: 'target: Prometheus target name from config; omit for the default.' This explains both the meaning of the value and the semantics of omitting it, matching the schema's null default.
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 resource (TSDB head cardinality) and a specific output (top metrics by series count), which is more concrete than generic status tools like prometheus_config_status. However, it does not explicitly name how it differs from close siblings such as series_metadata or label_values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites, and no routing to an alternative tool. The '[READ]' tag and the target note only describe the call, not the situation in which this tool is the right choice over series_metadata or observability_overview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
range_queryARead-only
[READ] Evaluate a PromQL expression over a time range.
Args: query: A PromQL expression. start: Range start (RFC-3339 or unix timestamp). end: Range end (RFC-3339 or unix timestamp). step: Resolution step (e.g. '60s', '5m'). target: Prometheus target name from config; omit for the default.
Returns an envelope with returned/limit/truncated. If
truncated is true the result is partial — narrow the selector or raise
the limit rather than treating it as complete.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| step | No | 60s | |
| query | Yes | ||
| start | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description adds real value beyond that: the [READ] tag, the envelope shape (returned/limit/truncated), and the critical semantic that truncated=true means partial results. Minor flaw: it advises 'raise the limit' though no limit parameter exists in the schema, which could mislead.
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, then uses compact Args/Returns sections; every line earns its place. The 'raise the limit' sentence introduces a small inconsistency that costs a bit of clarity.
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 no output schema, the description appropriately explains the return envelope and truncation semantics, and it fully covers the untitled parameters. The only gap is the dangling reference to a limit that cannot be set through the documented parameters.
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 all five parameters including formats (RFC-3339 or unix timestamp), a step example ('60s', '5m'), and target's default-omission behavior.
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 (Evaluate) and resource (PromQL expression over a time range), which an agent can readily separate from the range-less sibling instant_query. It does not explicitly name that sibling, so the differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use/when-not guidance or named alternatives; the range-vs-instant distinction against instant_query must be inferred from the tool name and 'over a time range'. It does give useful post-call guidance on what to do when results are truncated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reload_prometheus_configADestructive
[WRITE][risk=medium] Hot-reload the Prometheus config (POST /-/reload). No undo.
Records the pre-reload config hash. Rollback = re-apply the prior config file.
Args: dry_run: If True, preview (reports the current config hash) without reloading. target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=true, so the description is not the sole source of the safety profile. It nonetheless adds real value beyond them: it flags risk=medium, states "No undo", and discloses that the pre-reload config hash is recorded with rollback via re-applying the prior file.
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 operation type and risk tag, then covers rollback before listing args. The args block is docstring-styled but every line earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema, zero-required-param mutation tool, the description supplies the missing pieces: mutability/risk, reversibility, and per-parameter semantics. What an agent needs to invoke it correctly is present, though it could name a sibling for pre-checks.
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 parameter meaning, and it does: it explains that dry_run previews without reloading (reporting the current config hash) and that target selects a Prometheus target name with omission meaning the default. Both parameters are clarified 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 and resource ("Hot-reload the Prometheus config") plus the underlying endpoint (POST /-/reload). It is clearly differentiable from siblings like prometheus_config_status, which only reports state rather than triggering a reload.
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 (the tool reloads config) and dry_run is offered as a safe preview, but there is no explicit when-to-use-vs-alternatives guidance. It never mentions prometheus_config_status as the read-only alternative for inspecting config state before reloading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rule_healthARead-only
[READ] Rule-evaluation health summary + the list of erroring rules.
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds value by disclosing what the call returns (a health summary and the erroring rules), but it says nothing about auth, scope of evaluation, or limits beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight lines: the [READ] marker and purpose are front-loaded, followed by a single documented argument. Every sentence earns its place with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter read tool with no output schema, the description covers purpose, the single argument, and the shape of the return value. Minor gaps remain around scope and error behavior, but nothing essential to invoking 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 must carry the parameter meaning, and it does: 'target: Prometheus target name from config; omit for the default.' The implicit default behavior is clarified, though no format or example values are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Rule-evaluation health summary' plus 'the list of erroring rules.' This distinguishes it from the plain list_rules and datasource_health siblings. It does not, however, explicitly name a sibling to route against, keeping it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The [READ] tag implies a read-only operation, but there is no explicit when-to-use versus alternatives such as list_rules or prometheus_config_status. No prerequisites or conditions for calling it are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
series_metadataARead-only
[READ] Series (label-set) metadata for a PromQL selector.
Args: match: A PromQL series selector (e.g. 'up{job="node"}'). start: Optional range start (RFC-3339 or unix timestamp). end: Optional range end (RFC-3339 or unix timestamp). target: Prometheus target name from config; omit for the default.
Returns an envelope with returned/limit/truncated. If
truncated is true the result is partial — narrow the selector or raise
the limit rather than treating it as complete.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| match | Yes | ||
| start | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and the '[READ]' prefix aligns, so the safety profile is consistent rather than contradicted. The description adds genuine value beyond annotations by disclosing the return envelope (returned/limit/truncated) and warning that truncated=true means partial results that must not be treated as complete.
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, then uses structured Args and a Returns paragraph. Every sentence earns its place, including the truncation warning, with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the missing return-value envelope and truncation semantics, plus full parameter documentation for a 0%-coverage schema. Nothing needed to call 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 must carry the burden, and it documents all four parameters: match as a PromQL selector with a concrete example, start/end as RFC-3339 or unix timestamps, and target as a config name defaulting when omitted. It does not explain default time-range behavior when start/end are absent, leaving a small 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 (retrieve) and resource (series/label-set metadata) scoped to a PromQL selector, which clearly separates it from sibling query tools like instant_query, range_query, and label_values. An agent can identify the tool's role 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 gives truncation-handling guidance ('narrow the selector or raise the limit'), which is useful operational context, but it never states when to choose this tool over alternatives such as label_values or instant_query. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
target_scrape_healthBRead-only
[READ] Up/down scrape-health summary plus the list of unhealthy targets.
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read, and '[READ]' merely restates it. The description does add useful value by disclosing the return content (up/down summary plus unhealthy target list), but says nothing about scope, freshness, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the read marker and the output summary, then a minimal Args block. No wasted prose, though the '[READ]' prefix is slightly redundant against the annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single optional-param tool with no output schema, the description covers the input and gives a rough sense of the return. It stops short of describing the summary format or how unhealthy targets are surfaced, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must carry the single parameter's meaning, and it does: 'target' is a Prometheus target name from config, and omitting it falls back to a default. That explains both the value source and the default semantics 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 and resource: an up/down scrape-health summary plus the list of unhealthy targets. This distinguishes it from the more analytical sibling target_scrape_health_analysis, though the description never names that sibling to make the routing explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this versus target_scrape_health_analysis, list_targets, or dropped_targets. The only guidance offered is the parameter default ('omit for the default'), which is param behavior, not tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
target_scrape_health_analysisBRead-only
[READ][analysis] Rank down/erroring scrape targets and classify each cause.
Args: target: Prometheus target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The [READ] tag and readOnlyHint annotation already establish the safety profile, so the bar is lower. The description adds what the analysis actually does (ranking and cause classification), which is useful, but says nothing about output shape or limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two terse lines with a front-loaded [READ][analysis] tag indicating mode and category. Every element earns its place, though the args block is minimal rather than rich.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single optional read-only param with no output schema, the description covers purpose and parameter meaning but omits sibling differentiation and any hint of return structure, leaving the agent to infer how it relates to target_scrape_health.
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% and the schema only supplies a bare 'Target' title with default null, so the description carries the load: it identifies the param as a Prometheus target name from config and explains that omission yields the default. That is meaningful semantics beyond the 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+scope: it ranks down/erroring scrape targets and classifies each cause. This is clear and substantive. However, it does not distinguish itself from the near-identical sibling 'target_scrape_health' (nor dropped_targets/list_targets), which the agent needs to route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage note is 'omit for the default' on the target arg. There is no guidance on when to pick this tool over the very similarly named target_scrape_health sibling, nor any context about prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_applyADestructive
[WRITE][risk=medium] Apply a recorded undo by dispatching its inverse tool.
The inverse runs through its own governed tool, so its real risk tier is recorded there too. Pass dry_run=True to preview the inverse call without executing it. A token can only be applied once.
Args:
undo_id: The undoId from undo_list (or an _undo_id in a write result).
dry_run: If True, preview the inverse tool + params without running it.
target: Passed through to the inverse tool when it accepts a target.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| dry_run | No | ||
| undo_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation risk is covered structurally. The description adds real value beyond them: the medium risk tier, the fact the inverse runs through its own governed tool, and the crucial constraint that a token can only be applied once (reinforcing non-idempotency).
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 a [WRITE][risk=medium] tag, a one-line purpose, then a clean Args block. Every sentence earns its place; only the bracketed meta-tag is slightly noisy.
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, non-idempotent tool with no output schema, the description covers purpose, arg sources, preview mode, and the single-use constraint. Minor gaps remain on what happens if a token is expired or already consumed, but it is largely self-sufficient.
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 burden, and it documents all three parameters: undo_id (its source), dry_run (preview behavior), and target (passed through to the inverse tool only when accepted). This meaningfully compensates for 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 ("Apply a recorded undo by dispatching its inverse tool") and distinguishes itself from the sibling undo_list by being the action that consumes a token produced elsewhere. An agent can tell exactly what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: undo_id comes from undo_list or an `_undo_id` in a write result, and dry_run=True is recommended to preview before executing. There is no explicit when-not guidance, but the guidance present is specific and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_listARead-only
[READ] List recorded, not-yet-applied undo tokens (most recent first).
Each entry names the original tool, the inverse tool that undo_apply
would run, and a human note. Use the undoId with undo_apply.
truncated is measured (one extra row is fetched), not guessed from a
length coincidence — when it is true, re-run with a higher limit.
Each entry carries effectVerified. False means the original write
lost its response, so the change it reverses is PROBABLE, not confirmed —
check the live state before applying, and do not report the result as a
restore of a state that may never have been reached.
Args: limit: Max rows to return (default 50). target: Unused (undo state is host-local); accepted for CLI uniformity.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true, but the description goes well beyond: it explains that truncated is measured rather than guessed and prescribes re-running with a higher limit, and it defines the effectVerified field as distinguishing PROBABLE from confirmed reversals with an explicit caveat against over-reporting. That is substantive behavioral disclosure.
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 and the undo_apply handoff, then the truncated and effectVerified semantics. The 'measured, not guessed from a length coincidence' aside is slightly wordy but still earns its place by justifying the flag's reliability.
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 no output schema, the description nonetheless describes the return shape (original tool, inverse tool, human note, truncated, effectVerified) and covers both parameters plus the safety caveat for unverified effects. Nothing an agent needs to call or interpret this 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?
Schema description coverage is 0%, so the description carries the full burden and does: limit is documented as max rows with default 50, and target is explained as unused/host-local and accepted only for CLI uniformity — a genuinely valuable disclosure no schema field provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List recorded, not-yet-applied undo tokens'), adds ordering ('most recent first'), and distinguishes the tool from its sibling undo_apply by framing this as the reader and that as the applier. An agent can identify it 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 routes the agent: 'Use the undoId with undo_apply', and adds a conditional rule — when effectVerified is false, check live state before applying. Clear operating context, though it gives no explicit when-not-to-use or alternative for listing vs any other discovery mechanism.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_dashboardADestructive
[WRITE][risk=medium] Update a Grafana dashboard. Captures the prior model for undo.
The dashboard model must include its uid. The current model is fetched
first and stashed so the harness records a restore undo.
Args: dashboard: Full dashboard model (must include "uid"). overwrite: Overwrite the existing dashboard version (default True). dry_run: If True, preview without updating. target: Grafana target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| dry_run | No | ||
| dashboard | Yes | ||
| overwrite | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing a fetch-then-stash undo mechanism ('Captures the prior model for undo', 'stashed so the harness records a restore undo') and the uid prerequisite. This tells the agent the operation is reversible, which the destructiveHint=true annotation alone cannot convey.
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 write/risk tags and the core action, then lists args compactly. The undo behavior is stated twice ('Captures the prior model for undo' and 'stashed so the harness records a restore undo'), a minor redundancy in an otherwise tight definition.
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 4-param mutation of a nested dashboard object with no output schema, the description covers the critical mechanics (uid requirement, undo capture, dry_run, overwrite). It does not address permission/authorization needs or failure behavior, and the nested dashboard model's internal structure is only partially sketched.
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 params: dashboard (full model, must include uid), overwrite (default True, overwrites existing version), dry_run (preview only), and target (Grafana target name from config, omit for default). Each parameter's meaning is clarified 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 and resource ('Update a Grafana dashboard') and prefaces it with [WRITE][risk=medium] severity tags. Easily distinguished from siblings like get_dashboard, list_dashboards and delete_dashboard 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 operating context: the dashboard model must carry its uid, the prior model is fetched and stashed for undo, and dry_run lets you preview without updating. It does not explicitly name an alternative tool or spell out when-not to use it, but the write-vs-read boundary is unambiguous.
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.
39 tool updates
v0.7.0- First observed
alert_log_context - First observed
alert_noise_and_flap_analysis - First observed
alertmanager_alerts - First observed
create_annotation - First observed
create_silence - First observed
datasource_health - First observed
delete_dashboard - First observed
dropped_targets - First observed
expire_silence - First observed
firing_alert_rca - First observed
firing_alerts - First observed
get_dashboard - First observed
instant_query - First observed
label_values - First observed
list_dashboards - First observed
list_datasources - First observed
list_folders - First observed
list_rules - First observed
list_silences - First observed
list_targets - First observed
log_error_burst_rca - First observed
log_volume_analysis - First observed
loki_label_values - First observed
loki_labels - First observed
loki_query - First observed
loki_tail_errors - First observed
observability_overview - First observed
pending_alerts - First observed
prometheus_config_status - First observed
prometheus_tsdb_status - First observed
range_query - First observed
reload_prometheus_config - First observed
rule_health - First observed
series_metadata - First observed
target_scrape_health - First observed
target_scrape_health_analysis - First observed
undo_apply - First observed
undo_list - First observed
update_dashboard
TDQS
Scored across 39 tools
Most tools have clearly distinct purposes, well separated by backend (Prometheus/Loki/Grafana/Alertmanager) and by raw-read vs analysis. Minor overlaps exist in the scrape-health cluster (list_targets vs target_scrape_health vs target_scrape_health_analysis) and between loki_query and the canned loki_tail_errors, but the descriptions distinguish raw vs summarized vs analyzed views reasonably.
Names are consistently snake_case, with verb prefixes for mutations (create_/delete_/update_/expire_/reload_/undo_) and analysis-suffixed diagnostics. Many read/state tools are noun-phrases (firing_alerts, prometheus_tsdb_status, instant_query) rather than verb_noun, which is a minor deviation but internally predictable.
39 tools is heavy and well above the comfortable range, raising selection cost. However, the server legitimately spans four backends plus a cross-signal analysis layer and an undo/governance layer, so most tools do map to a real capability rather than being redundant.
Coverage is strong: full silence lifecycle (create/list/expire), alerts, rules, scrape targets, Loki queries, PromQL queries, dashboard read/update/delete, and a rollback layer. The notable gap is the absence of a create_dashboard tool (only update/delete exist), plus datasource/annotation operations are mostly read-only.
Maintenance
Related MCP Connectors
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
- SpanlyOAuthcom.spanly
MCP observability. Query live traffic, errors, duration, and alerts from your AI agent.
MCP-native AI SRE: ask what's broken in production, get a reviewed GitHub fix PR.
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
Related MCP Servers
- AlicenseAqualityAmaintenanceGoverned PostgreSQL DBA operations — slow-query, bloat, and blocking-lock RCA, index management, vacuum/analyze, and replication lag, with unbypassable audit logging (MCP + CLI), budget/runaway guards, dry-run, and undo/rollback.35MIT
- AlicenseAqualityAmaintenanceGoverned CI/CD operations for self-hosted GitLab and Gitea — pipeline-failure, runner, artifact-bloat, and stale-branch RCA, with unbypassable audit logging (MCP + CLI), budget/runaway guards, dry-run, and undo/rollback.28MIT
- AlicenseBqualityAmaintenanceGoverned MinIO object-storage operations — capacity, exposure-surface audit, lifecycle, and healing RCA, with guarded bucket writes, unbypassable audit logging (MCP + CLI), budget/runaway guards, dry-run, and undo/rollback.48MIT
- AlicenseAqualityAmaintenanceGoverned reverse-proxy operations for Traefik, Caddy, and HAProxy — backend-health, cert-expiry, 5xx, and route-conflict RCA, with unbypassable audit logging (MCP + CLI), budget/runaway guards, dry-run, and undo/rollback.28MIT