io.github.AIops-tools/olvm-aiops
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@io.github.AIops-tools/olvm-aiopsWhat's wrong with my hosts?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
OLVM AIops
Disclaimer: Community-maintained open-source project. Not affiliated with, endorsed by, or sponsored by Oracle or the oVirt project. "Oracle", "Oracle Linux" and "oVirt" are trademarks of their owners. MIT licensed.
AI-powered operations for Oracle Linux Virtualization Manager (OLVM) and
oVirt 4.5, over the engine REST API, with a built-in governance harness —
an audit log that MCP and CLI calls both write to, a token/runaway budget guard,
and descriptive risk tiers. Built for teams that run OLVM (often next to another
hypervisor platform) and want an agent to answer "what needs attention?" with
evidence from the engine, not guesses. Built on httpx and the MCP SDK, not on the
pycurl-based engine SDK.
Read-only in this release: inventory, health, capacity and diagnosis. Engine actions are asynchronous — the engine answers
completelong before a VM or host reaches its target state — so write tools are held back until each can confirm its own outcome. Do NOT use for XCP-ng — use xcpng-aiops. Do NOT use for Proxmox VE — use proxmox-aiops.
What this tool does, and does not, decide
It reads an OLVM / oVirt engine accurately and records every call. It does
not decide what an agent may change — that belongs to the engine account you
connect it with. Give that account a read-only role (such as ReadOnlyAdmin) and
the engine itself enforces it.
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 ~/.olvm-aiops/audit.db.
Running a smaller / local model? See agent-guardrails.md for what the tool already guarantees and a ready-made system prompt for the rest.
Related MCP server: oVirt MCP Server
What it answers
Question | Tool | CLI |
Is the engine itself healthy — certificates, backups, clock? |
|
|
What is wrong with my hosts? |
|
|
Is storage about to stop the engine creating disks? |
|
|
Why is this VM paused / not responding? |
|
|
What happened recently? What is new since I last looked? |
|
|
What long-running operations failed? |
|
|
Inventory |
|
|
17 MCP tools: 15 reads and diagnoses, plus the harness's undo_list /
undo_apply (which have nothing to undo in a read-only release).
Each diagnosis ranks findings worst first; every finding carries the measured
signal, a cause, an action and an explicit rank. Transient states are not
reported as failures: a host the engine is installing or rebooting is "in
progress", alert 9000 on a host without fencing hardware is informational, and an
event the host, VM or data center has since recovered from is marked superseded.
Events older than 24 hours (events_window_hours) are history, not findings, and
every warning-or-worse event inside the window lands in exactly one diagnosis —
engine-wide alerts such as certificate expiry and missing backups included.
Built from a live engine, not from the docs
Every read was written against, and every fixture captured from, a live Oracle Linux Virtualization Manager 4.5.5-1.73.el9 engine with Keycloak enabled. Things that engine does, which this tool accounts for:
counts, sizes and flags arrive as JSON strings, timestamps as epoch-ms numbers;
an attached storage domain has no status in
/storagedomains— status is read from each data center's storage-domain collection;/jobsrefuses anysearchand returns jobs oldest first, so jobs are sorted here;the
timesearch on events is unusable (formats return all or nothing), whilefrom=<index>is an exact cursor — henceafter_indexand a client-sidesince_minutes;the cursor sorted newest first returns the newest events above it and skips the rest, so
after_indexreads oldest first;/ovirt-engine/services/healthanswers without a login, and a data center's old status alerts stay in the log after it recovers;login events print the SSO session id, which is redacted before events are returned.
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 olvm-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 olvm-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/olvm-aiops
openclaw skills info olvm-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 olvm-aiops
olvm-aiops init # wizard: engine URL, username with profile, CA file, encrypted password
olvm-aiops doctor # verify config, encrypted store, login and engine version
olvm-aiops host health # first diagnosisinit writes ~/.olvm-aiops/config.yaml (non-secret connection details) and
stores the password encrypted in ~/.olvm-aiops/secrets.enc. Example:
targets:
- name: engine1
url: https://olvm-engine.example.com # the Administration Portal origin (FQDN)
username: admin@ovirt@internalsso # admin@internal on engines without Keycloak
ca_file: /etc/pki/olvm-engine-ca.pem # engine CA; keeps verify_ssl on
timeout: 30 # seconds per request; raise for busy enginesThe username includes its profile. Engine-setup enables Keycloak by default since
4.5.1, which makes the admin admin@ovirt@internalsso; engines without Keycloak use
admin@internal. Download the engine CA from
https://<engine>/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA
and connect by FQDN — the engine certificate does not cover its IP address.
For non-interactive use (MCP server, CI, cron) export the master password so the store can be unlocked without a prompt:
export OLVM_AIOPS_MASTER_PASSWORD='your-master-password'Where 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.
MCP client config
{
"mcpServers": {
"olvm-aiops": {
"command": "uvx",
"args": ["--from", "olvm-aiops", "olvm-aiops-mcp"],
"env": { "OLVM_AIOPS_MASTER_PASSWORD": "your-master-password" }
}
}
}Env-block caveat: MCP clients launch the server with a minimal environment — your shell profile's exports are not inherited. Put
OLVM_AIOPS_MASTER_PASSWORD(and, if you use them,OLVM_AIOPS_HOME/OLVM_AIOPS_CONFIG/OLVM_AUDIT_APPROVED_BY) in theenvblock above, or the encrypted store cannot be unlocked and every tool returns a teaching error.
Managing secrets
olvm-aiops secret set engine1 # prompts hidden for the account password
olvm-aiops secret list # names only, values never shown
olvm-aiops secret rm engine1
olvm-aiops secret rotate-password # re-encrypt under a new master password
olvm-aiops secret migrate # import a legacy plaintext .env, then retires itA legacy plaintext env var OLVM_<TARGET_NAME_UPPER>_PASSWORD is still honoured
as a fallback with a deprecation warning (migrate with olvm-aiops secret migrate).
Governance
Every MCP tool passes through @governed_tool, and every CLI command calls the MCP tool of the
same name. It records; it does not authorize.
Audit — every call (tool, params with secrets redacted, result, status, duration, risk tier, and any operator-supplied approver/rationale) lands in
~/.olvm-aiops/audit.db(relocate withOLVM_AIOPS_HOME).Budget / runaway guard — a safety backstop, not an authorization gate: cumulative call and wall-time caps plus a tight-loop circuit breaker (
OLVM_MAX_TOOL_CALLS,OLVM_MAX_TOOL_SECONDS,OLVM_RUNAWAY_MAX).Risk tier — a descriptive label on the audit row derived from
risk_level; it gates nothing.Output hygiene — all engine-returned text is sanitized and bounded before it reaches the agent; SSO session ids in login events are redacted.
支持范围 / Supported scope
Area | Read | Write |
Engine | health diagnosis (health check, clock, certificates, backups) | — |
Hosts | list / get / health diagnosis | — |
Storage domains | list / get (data-center-scoped status, capacity) / capacity diagnosis | — |
VMs | list / get / statistics / health diagnosis | — |
Data centers, clusters | list | — |
Events, jobs | list (severity, paging, | — |
缺功能?(Missing something?) Coverage is intentionally focused. Open an issue or PR at github.com/AIops-tools/OLVM-AIops — feature requests, contributions, and comments are all welcome.
Scope & caveats
Verification status: every read and all four diagnoses were run end to end against a live OLVM 4.5.5 engine with one KVM host, an NFS data domain and one VM. Not yet verified: production-scale engines, iSCSI / FC / Gluster domains, multi-host clusters, self-hosted engine deployments, or engines without Keycloak. See
docs/VERIFICATION.md.Engine only: no direct host (vdsm) access. Hosts, storage and VMs are seen the way the engine sees them.
No writes in this release. Start/stop/migrate, maintenance and snapshots are planned once each write can confirm its own outcome rather than the engine's immediate
complete.
Not for
XCP-ng (use xcpng-aiops), Proxmox VE (use proxmox-aiops), other hypervisors, NAS/storage appliances, backup suites, container clusters, or network devices.
License
Available Tools
17 toolscluster_listA
[READ] Clusters with compatibility version, CPU type and memory over-commit policy.
Args: limit: Rows to return, 1-1000 (default 100). target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It includes the [READ] marker, implying a safe read operation, and lists the data fields. However, it does not disclose potential errors, authentication requirements, or any side effects—though for a simple list tool these may be minimal. It adds some context but not rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded: the [READ] marker and purpose appear first, followed by a clearly separated Args section. Every sentence adds value, with 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 simple list tool with two optional parameters and no output schema, the description is sufficient. It states what is returned, how to limit results, and how to specify a target. It lacks details on ordering or any additional filters, but these are not critical for a basic enumeration tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only types and defaults, with no descriptions. The description compensates by explaining the limit range (1-1000, default 100) and the target's meaning (engine target from config, omit for default). This adds meaningful semantics beyond the schema, though it does not elaborate on the format or constraints 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?
The description clearly states the tool lists clusters and specifies the fields returned (compatibility version, CPU type, memory over-commit policy). It is distinct from sibling tools like datacenter_list and host_list, so the purpose is unambiguous.
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 provides no guidance on when to use this tool versus alternatives. It does not mention that this is the appropriate tool for enumerating clusters, nor does it suggest other tools for different scenarios (e.g., host_list for hosts). No exclusions or alternative references are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
datacenter_listA
[READ] Data centers with status (up, uninitialized, maintenance…) and compat version.
Args:
limit: Rows to return, 1-1000 (default 100); truncated says when more exist.
target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden itself. It states [READ], indicating a non-mutating operation, and explicitly discloses the `truncated` signal when more rows exist. It does not cover every edge case (e.g., error behavior or ordering), but for a simple read/list tool it adds meaningful 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?
The description is compact and front-loaded: the read marker and returned content appear first, followed by a tight two-item Args list. Every sentence carries information with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two optional parameters, no output schema, and no annotations, the description covers the parameters and key output indicators (status, compat version, truncated). It is adequate to call correctly, though it stops short of fully specifying the response shape or explicit use cases.
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 description fully compensates by explaining both parameters: `limit` gets a row count range, default, and the `truncated` consequence; `target` gets source and default behavior. This adds substantial meaning beyond the bare integer/string schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as data centers and the returned content (status, compat version) with a [READ] marker, making it distinguishable from list tools for clusters, hosts, VMs, and storage domains. It lacks an explicit 'List all data centers' verb phrase, but the intent is not ambiguous.
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 offers no explicit when-to-use versus alternatives guidance, no exclusions, and no mention of sibling tools. Usage context is only implied by the tool name and the resource name; the parameter notes are about arguments, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
engine_health_rcaA
[READ] Problems with the engine itself, ranked worst first, in one call.
Reads the engine's health check, its version, its clock against this machine and its summary counts, plus warning-or-worse events that name no host, VM or storage domain: engine or CA certificate expiry, missing or failed engine backups, a cluster failing its HA reservation. Those alerts appear in no other diagnosis, so call this first for "is anything wrong". Report findings in rank order and quote their signal.
Args: events_limit: Recent warning-or-worse events to correlate, 1-1000 (default 200). events_window_hours: Ignore events older than this many hours, 1-720 (default 24). target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| events_limit | No | ||
| events_window_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses what it reads (health check, version, clock, counts, specific event types), how it reports (rank order, quoting signal), and that it is a read operation (prefixed with [READ]). It doesn't mention side effects, permissions, or error conditions, but for a read-only diagnostic these are minor omissions given the detail provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a crisp purpose line, a detailed but scoped explanation of what it reads, a usage directive, then parameter details. Every sentence adds value, and the key purpose is front-loaded. It is long but not padded; the structure aids parsing.
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?
Despite having no output schema, the description explains what the tool returns (findings in rank order with signal quotes) and why it's needed (unique alerts). All parameters are covered, and the usage priority is stated. For a complex RCA tool, this is complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly. Each parameter is explained with purpose, range, and default: events_limit for 'correlation', events_window_hours for 'ignore events older', and target for choosing from config. This far exceeds the schema's bare type/default info.
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 and resource: 'Problems with the engine itself' and 'Reads the engine's health check...' It clearly distinguishes from siblings like host_health_rca and vm_health_rca by focusing on engine-specific alerts that 'appear in no other diagnosis.' The scope is unambiguous and the tool's unique role is 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?
It gives explicit when-to-use guidance: 'call this first for "is anything wrong"' and explains that its alerts are exclusive ('appear in no other diagnosis'). This sets priority and differentiates from other RCA tools, even though it doesn't name them directly. The instruction to report in rank order also guides invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
event_listA
[READ] Engine events at or above a severity, newest first.
To follow new events, pass the highest index you have already seen as
after_index: events after it come back OLDEST first (order), so repeat with the
highest index returned while truncated is true and nothing is skipped.
since_minutes keeps events from the last N minutes and sets scanTruncated when
older ones in the window may be missing. SSO session ids in login events are
redacted.
Args:
limit: Rows to return, 1-1000 (default 100); truncated says when more exist.
min_severity: One of normal, warning, error, alert (default normal).
page: Older pages of events (not combinable with since_minutes or after_index).
after_index: Only events with a higher index than this, oldest first.
since_minutes: Only events from the last N minutes (1-129600).
target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| target | No | ||
| after_index | No | ||
| min_severity | No | normal | |
| since_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses ordering inversion when using after_index, truncation semantics, scanTruncated caveats, and redaction of SSO session IDs. The [READ] marker also signals non-mutating behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized: a one-line purpose, a short usage paragraph for the non-obvious cursor behavior, then a terse Args list. Every sentence adds needed operational detail without 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?
Despite having no output schema and no annotations, the description is complete enough for an agent to call the tool correctly. It defines all parameters, explains repeated-call pagination semantics, and warns about missing events and redacted fields.
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 explain every parameter, and it does. The Args block covers all six parameters with ranges, defaults, enum values, and combinability constraints such as page not being combinable with since_minutes or after_index.
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 clearly identifies the operation as reading engine events, the resource involved, and the key filtering/ordering behavior: severity threshold and newest-first ordering. This distinguishes it from the sibling tools, none of which list engine events.
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 concrete usage guidance for following new events with after_index, using since_minutes for recent events, and using page for older pages, including an explicit incompatibility between page and the other modes. It does not name alternative tools, but the provided context is sufficient given the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host_getB
[READ] One KVM host by id (see host_list).
Args: host_id: Host id. target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| host_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. The '[READ]' prefix signals a read operation, but the description does not disclose behavior such as error cases, whether the host must exist, what fields are returned, or any side effects. It adds only the scoping to a single host by id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the '[READ]' marker and the core purpose. The Args section is compact and useful. It earns its place, though the 'see host_list' reference is slightly terse.
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 get-by-id tool with two parameters and no output schema, the description is mostly adequate. It lacks details about return value shape, error behavior, and any prerequisites, but the tool's simplicity and the sibling list help an agent infer context. A bit more behavioral context would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains host_id as 'Host id' and target as 'Engine target name from config; omit to use the default', which adds meaning beyond the schema's bare titles. However, it does not explain how host_id is formatted or how target selection works in practice.
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 ('get') and resource ('one KVM host by id'), and references host_list as the sibling for listing. It is clear what the tool does, though it does not explicitly differentiate from other get-style siblings like storage_domain_get or vm_get 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 description implies usage by saying 'see host_list' and by naming the host_id argument, but it does not explicitly state when to use this tool versus alternatives. It provides minimal context: use this to fetch a single host by id, while host_list is for listing. No exclusions or alternative conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host_health_rcaA
[READ] What needs attention on KVM hosts, ranked worst first, in one call.
Combines host status and status detail, reinstall/update flags and recent
warning-or-worse events that name a host. Each finding has signal (what was
measured), cause, action and rank. Hosts that the engine is installing or
rebooting are reported as in progress, not failed; alert 9000 (power management
not verifiable) is informational on hosts without fencing hardware. Report
findings in rank order and quote their signal.
Args: events_limit: Recent warning-or-worse events to correlate, 1-1000 (default 200). events_window_hours: Ignore events older than this many hours, 1-720 (default 24); older ones are counted in eventsOutsideWindow. target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| events_limit | No | ||
| events_window_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it excels. It explicitly states that hosts being installed/rebooted are 'reported as in progress, not failed', and that alert 9000 is 'informational on hosts without fencing hardware.' It also instructs to 'Report findings in rank order and quote their signal,' covering output expectations. These are non-obvious behaviors that an agent must know to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: a one-sentence purpose statement, a compact behavioral note, and a concise parameter list. Every sentence adds value; there is no fluff. The key purpose is front-loaded, and the parameter details are clearly separated. It is appropriately sized 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?
The description is complete for an agent to use the tool correctly. It defines the output contract (each finding has signal, cause, action, rank), explains special cases (in-progress vs failed, informational alert), and documents all parameters. Although there is no output schema, the description provides sufficient detail on return semantics. It also mentions 'eventsOutsideWindow' implicitly, covering the window behavior. Nothing essential 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 fully compensate. It does: the 'Args' block explains each parameter with its range, default, and purpose (e.g., 'events_limit: Recent warning-or-worse events to correlate, 1-1000 (default 200)'). This adds significant semantic meaning beyond the bare schema types and defaults, making the tool safely callable.
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 clearly states the tool's purpose: 'What needs attention on KVM hosts, ranked worst first, in one call.' It names the resource (KVM hosts), the verb (needs attention), and the ranking. It distinguishes itself from sibling tools like host_list (simple listing) and host_get (single host) by emphasizing the composite, prioritized RCA output. It also stands apart from other RCA tools (engine, storage, vm) by explicitly scoping to KVM hosts.
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 when to use this tool: when you need a consolidated health assessment of KVM hosts in one call, combining status, events, and reinstall/update flags. It does not explicitly name alternatives or exclusions, but the 'in one call' phrasing and the composite nature strongly signal it's the go-to for host-level RCA. Given the presence of sibling RCA tools, a more explicit comparison would have pushed this to 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host_listA
[READ] KVM hosts with status, SPM role, memory and VM counts.
A field the engine did not report is null, never 0. For "what is wrong with my hosts" use host_health_rca instead of reading this list yourself.
Args:
limit: Rows to return, 1-1000 (default 100); truncated says when more exist.
search: Engine query language, e.g. "status=up" or "status!=up".
target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses a key behavioral trait: 'A field the engine did not report is null, never 0.' It also discloses pagination/truncation behavior via the limit parameter description. It doesn't mention auth or rate limits, but for a read-only list tool, the disclosed null semantics and truncation behavior are valuable and go beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the purpose is in the first line, the alternative tool is named early, and the Args section is terse but informative. Every sentence 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 list tool with 3 optional parameters and no output schema, the description covers the key semantics: null handling, truncation, search syntax, and target selection. It doesn't describe the output structure, but since there is no output schema, a brief note on what fields are returned is present in the first line. It is complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: it explains limit's range and default, defines search as 'Engine query language' with examples, and explains target as 'Engine target name from config; omit to use the default.' This adds meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: '[READ] KVM hosts with status, SPM role, memory and VM counts.' It distinguishes itself from sibling host_health_rca by explicitly saying that tool is for 'what is wrong with my hosts.' This is specific and differentiates from 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?
The description explicitly says when to use this tool vs alternatives: 'For "what is wrong with my hosts" use host_health_rca instead of reading this list yourself.' It also explains the search parameter with examples, giving clear context for when to use it. This is explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_listA
[READ] Engine jobs (long-running operations) with status and duration.
Args: limit: Rows to return, 1-1000 (default 100). status: Only one status: started, finished, failed, aborted, unknown. target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The [READ] tag clearly signals a non-mutating operation, which is useful since no annotations are provided. The description also conveys that jobs are long-running operations and that results include status and duration. However, it does not disclose return structure details beyond those two fields, pagination behavior beyond limit, or error/edge-case behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the read intent, followed by a clean parameter list. Every line adds useful information and there is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All parameters are explained and the core purpose is clear, making the tool callable. But with no output schema and no annotations, the description only minimally describes returned fields and does not explain result ordering, required permissions, or how to route to sibling tools. The gaps are not severe for a simple read-only list, but the description is not fully 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?
With 0% schema description coverage, the description fully compensates by documenting all three parameters. It gives a range and default for limit, enumerates the valid status values, and explains that target comes from configuration and defaults when omitted. This is strong semantic value beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies Engine jobs as the resource and states that the output includes status and duration. It is more specific than generic 'list jobs' and is distinguishable from sibling list tools like vm_list or host_list. The lack of an explicit 'list' verb is minor because the tool name and [READ] marker make the operation clear.
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 provides no guidance about when to use job_list instead of related tools such as event_list or undo_list. It does not state any exclusions, prerequisites, or alternative tool suggestions. An agent must infer usage context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_capacity_rcaA
[READ] Storage-domain problems ranked worst first, in one call.
Critical when free space is below the engine's critical blocker (the engine then refuses new disks and snapshots); medium below the low-space warning, or when thin disks are committed beyond capacity while space is low (low on its own); high when an attached domain is inactive, unknown or mixed. Warning-or-worse events naming a storage domain (for example "deactivated by system") are attached to it. Unattached domains such as the default image repository are skipped. Report findings in rank order and quote their signal.
Args: events_limit: Recent warning-or-worse events to correlate, 1-1000 (default 200). events_window_hours: Ignore events older than this many hours, 1-720 (default 24). target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| events_limit | No | ||
| events_window_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that it is a read operation (prefixed '[READ]'), explains the ranking logic (critical/medium/high thresholds), specifies exclusions (unattached domains), and notes that findings are reported in rank order with their signals. This is substantial, though it does not mention potential rate limits or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear one-liner, followed by a compact explanation of the ranking logic and then a structured Args list. It is a bit long, but every sentence adds value; no fluff or repetition. The structure aids scannability.
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?
The description covers the tool's purpose, ranking criteria, input parameters, exclusions, and reporting style. Without an output schema, it does not detail the exact return format, but it states that findings are ranked and quoted, which is sufficient for an agent to call it correctly. The context is complete for a read-only RCA tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides zero descriptions for its three parameters, but the description's 'Args' section fully documents each one: events_limit (range and default), events_window_hours (range and default), and target (with omission guidance). This completely compensates for the schema gap and adds clarity beyond the bare property 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 description opens with a precise statement: 'Storage-domain problems ranked worst first, in one call.' It clearly identifies the verb (rank) and the resource (storage-domain problems), and goes on to explain the ranking criteria in detail, distinguishing it from simple list/get tools like storage_domain_list.
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 the tool's analytical nature and its input parameters, but it never explicitly contrasts it with alternatives such as storage_domain_list or event_list. The use case is implied by the RCA context, but no direct guidance is given on when to prefer this over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_domain_getA
[READ] One storage domain by id, with its data-center-scoped status.
Args: domain_id: Storage domain id (see storage_domain_list). target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| domain_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden, and it does lead with '[READ]', signaling a non-mutating operation. It also adds the data-center-scoped status nuance, but it does not describe return format, failure behavior, authentication needs, or other side effects. This is adequate but minimal for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, starts with the purpose, and uses a tightly formatted Args block. Every sentence is necessary and no redundant phrasing is present.
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-record fetch tool with two parameters and no output schema, this description is essentially complete. The only minor gap is absence of any statement about what fields are returned or error conditions, but the low complexity and read-only nature make this acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 0% description coverage, so the description must compensate, and it does explain both parameters. 'domain_id' is clarified as a storage domain id and cross-referenced to storage_domain_list; 'target' is explained as an Engine target name from config, with the default behavior noted. This adds meaningful guidance beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('get'), the resource ('storage domain'), the selector ('by id'), and a specific qualifier ('data-center-scoped status'). This differentiates it from the sibling storage_domain_list, which lists many domains, and the 'One storage domain by id' phrasing makes the selection criterion 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?
The usage context is clear: you fetch a single storage domain by id, and you can obtain an id via storage_domain_list. However, it never explicitly contrasts when to use this vs alternatives or states exclusions, so the guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_domain_listA
[READ] Storage domains with status and capacity (free, used, committed bytes and %).
The status of an attached domain comes from its data center (statusSource);
it is null — not guessed — when that could not be read (statusErrors).
Args:
limit: Rows to return, 1-1000 (default 100); truncated says when more exist.
target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral disclosure. It explicitly explains the status behavior (null when data center read fails, with statusErrors), and mentions the `truncated` flag for pagination. This adds valuable context beyond the bare schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly written with no filler. It front-loads the operation and result, then devotes exactly two sentences to the parameters. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a list tool with two parameters and no output schema, the description covers the essential behavioral nuances (status source, null handling, truncation). It does not describe the output structure, but that is not required without an output schema, and the tool is simple enough that the agent can call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates. It explains `limit` (range, default, and that `truncated` indicates more rows) and `target` (engine target from config, omit for default). This is far richer than the bare schema types and defaults.
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 '[READ] Storage domains with status and capacity', naming the exact resource and operation. It distinguishes itself from the sibling storage_domain_get by implying a list operation, and adds specific detail (free, used, committed bytes and %) that clarifies the return scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a list operation but does not explicitly contrast it with storage_domain_get or other siblings. There is no when-to-use or when-not-to-use guidance, leaving the agent to infer that it is for listing domains rather than fetching a single one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_applyA
[WRITE][risk=medium] Apply a recorded undo by dispatching its inverse tool.
The inverse runs through its own governed tool, so it is audited under its own risk tier. 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?
With no annotations, the description carries the full burden and does so well. It openly marks the operation as '[WRITE][risk=medium]', explains that the inverse tool runs under its own governance and risk tier, warns that a token can only be applied once, and mentions dry_run to preview without executing. This goes beyond a simple 'apply' and discloses key behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear summary line, a brief paragraph of important caveats, and an Args list. Every sentence adds value, and it is appropriately front-loaded with the [WRITE] and risk indicator.
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?
The description covers purpose, parameters, and behavior comprehensively. However, it does not mention what the tool returns (e.g., the inverse tool's result or a success/failure status). With no output schema, a brief note on return value would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only titles with 0% description coverage, so the description must explain each parameter. It does: undo_id is sourced from undo_list or _undo_id, dry_run previews the inverse call, and target is passed through conditionally. This adds substantial meaning 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?
The description clearly states the tool's purpose: 'Apply a recorded undo by dispatching its inverse tool.' This distinguishes it from sibling tool undo_list, which lists recorded undos, and other write tools. The verb and resource are specific, leaving no ambiguity.
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 provides usage context by noting the undo_id source ('from undo_list or an _undo_id in a write result') and the dry_run preview option. It does not explicitly name alternatives or exclusions, but the context makes it clear when to use this tool versus listing undos.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_listA
[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.
One extra row is read so truncated is measured rather than guessed from
the row count matching the limit; when it is true, older tokens exist.
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, capped at 500). 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?
With no annotations provided, the description takes full responsibility and reveals key behaviors: it is a read ([READ]), uses a truncated detection mechanism (one extra row), explains the effectVerified flag meaning, and notes that the target parameter is unused. This goes beyond simple listing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a header, entry details, and an args section. It is informative without being overly verbose, though the explanation of effectVerified could be slightly condensed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and two parameters, the description covers all essential aspects: purpose, parameters, usage, and behavioral traits. It mentions the fields in each entry (undoId, original tool, etc.), making it complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description compensates by explaining both parameters: limit with default and cap (50–500), and target as unused for CLI uniformity. This adds meaning beyond the schema's type/default information.
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 clearly states the tool's purpose: listing undo tokens that are recorded but not yet applied, in order (most recent first). It specifies it is a read operation and distinguishes it from sibling tools like undo_apply.
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 tells users to use the returned undoId with undo_apply and explains the effectVerified flag for safe usage. However, it does not explicitly mention when to avoid using this tool or provide comparisons to other list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vm_getA
[READ] One VM by id (see vm_list).
Args: vm_id: VM id. target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| vm_id | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It includes '[READ]' which signals a non-mutating operation, and states it retrieves one VM. However, it does not mention error behavior (e.g., not found), permissions, or any side effects. The read hint is valuable but limited; it adds some transparency but not 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?
The description is concise and well-structured. It front-loads the purpose and uses an Args section for parameters. Every sentence adds value without redundancy. The format is clean and scannable, making it easy for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (single fetch by id) and no output schema, the description is adequate but not complete. It covers the parameters and the read nature, but does not specify the return format, error handling (e.g., missing VM), or pagination (not applicable). For a basic get tool, this is acceptable, but additional notes on error cases would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must explain parameters. It does so: vm_id is 'VM id' (minimal but accurate) and target is described as 'Engine target name from config; omit to use the default.' This adds meaning beyond the schema by explaining the source and default behavior of target. The vm_id explanation is trivial but acceptable given its name.
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 clear verb+resource: 'One VM by id'. It distinguishes itself from vm_list by explicitly scoping to a single VM and referencing vm_list for the listing case. This makes the tool's purpose unambiguous and differentiates it from 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?
The description indicates when to use this tool: to retrieve one VM by id, and points to vm_list for the alternative (listing). While it does not explicitly list when not to use it, the reference to vm_list provides a clear contrast. It is not exhaustive but sufficient for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vm_health_rcaA
[READ] VM problems ranked worst first, in one call.
High for VMs stuck not_responding/unknown, paused (often storage I/O errors or a full domain — check storage_capacity_rca), or down with high availability; medium for image_locked; info for VMs mid-transition; low for config changes waiting for a restart. Recent warning-or-worse events naming a VM are attached to it, one finding per VM and code; an event is superseded (info) when the VM started after it, or when the engine reported it back up and it is up now. Down VMs without HA are normal. Report findings in rank order and quote their signal.
Args: events_limit: Recent warning-or-worse events to correlate, 1-1000 (default 200). events_window_hours: Ignore events older than this many hours, 1-720 (default 24); older ones are counted in eventsOutsideWindow. target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| events_limit | No | ||
| events_window_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses read-only behavior via '[READ]', explains the ranking logic, supersession rules, and the meaning of 'Down VMs without HA are normal', which prevents misinterpretation. It does not cover auth or rate limits, but for a read-only RCA tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a leading summary, a severity explanation, and an args section. It is longer than minimal but every sentence adds value, and the structure aids readability. The front-loaded summary allows quick comprehension.
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 tool with 3 optional parameters, no output schema, and no annotations, the description fully explains the expected output (ranked findings, quoted signals) and the interpretation logic. It is complete enough for an agent to invoke correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides detailed semantics for all three parameters that the schema only lists as names. It explains ranges, defaults, and the effect of each (e.g., events_window_hours controls ignored events and counts them in eventsOutsideWindow). This is high-value beyond the schema, especially given the 0% schema description coverage.
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 ('VM problems ranked worst first') and clearly distinguishes it from sibling tools like storage_capacity_rca, host_health_rca, and engine_health_rca by scoping to VMs and providing a ranking. The '[READ]' prefix immediately signals a non-mutating operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names an alternative (storage_capacity_rca) for a specific scenario (storage I/O errors or full domain), and explains severity levels that guide when to investigate. It does not explicitly contrast with host_health_rca or engine_health_rca, but the VM-specific scope is clear, and the description implies its usage for VM health triage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vm_listA
[READ] VMs with status, host, vCPUs, memory and high-availability flag.
Args:
limit: Rows to return, 1-1000 (default 100); truncated says when more exist.
search: Engine query language, e.g. "status=up" or "cluster=Default".
target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. The [READ] prefix discloses read-only behavior, and the description goes beyond the schema by explaining the 1-1000 limit range, the default of 100, and the `truncated` indicator that signals pagination or response limits. It does not mention auth, rate limits, or performance, but for a simple list operation the key behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct and well-structured: a one-line purpose statement followed by a clean, aligned argument list with defaults and examples. Every sentence adds value, and no unnecessary detail is included.
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 list tool with no output schema, the description states the resource, the fields returned, the pagination behavior via `truncated`, and all parameter semantics. It omits minor aspects like ordering, error behavior, or explicit output shape, but the essential calling contract is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero description coverage, but the description fully compensates: it gives the limit range and default, explains the `truncated` flag, illustrates the search engine query language with concrete examples, and describes what the target parameter means and its default behavior. This is far richer than the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation (reading VMs) and enumerates the returned fields (status, host, vCPUs, memory, HA flag), so an agent knows what it physically does. It differentiates from vm_get and vm_stats by indicating a plural list of VMs, but it does not explicitly name alternatives or contrast with siblings, so it stops short of a full 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 description contains no guidance on when to select vm_list over its sibling tools such as vm_get, vm_stats, or host_list. It only explains the individual parameters and provides search examples, but never states the intended use case, exclusions, or when an alternative is more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vm_statsC
[READ] A VM's current statistics: memory, CPU %, network and disk usage, with units.
Args: vm_id: VM id. target: Engine target name from config; omit to use the default.
| Name | Required | Description | Default |
|---|---|---|---|
| vm_id | Yes | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It includes a '[READ]' marker implying read-only, but discloses nothing about authentication, rate limits, side effects, or error behavior. This is a significant gap for a tool that likely has operational implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the purpose, and uses a clean structure with an args section. Every sentence contributes value, 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?
The description mentions the returned metrics (memory, CPU %, network, disk) but lacks usage guidance and behavioral context. Without annotations or an output schema, an agent has limited understanding of when to use this tool or what errors or edge cases to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description gives brief explanations for both parameters: vm_id is 'VM id' (minimal, tautological) and target is 'Engine target name from config; omit to use the default' (adds config context and default behavior). Since schema coverage is 0%, this partially compensates, but vm_id could be more descriptive.
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 clearly states the tool reads a VM's current statistics (memory, CPU %, network, disk) with units, using a specific verb and resource. It doesn't explicitly differentiate from siblings like vm_get or vm_health_rca, but the purpose is unambiguous.
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 is provided on when to use this tool versus alternatives such as vm_get, vm_list, or vm_health_rca. The agent is left to infer the appropriate context, and no exclusions or conditions are mentioned.
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.
17 tool updates
v0.1.0- First observed
cluster_list - First observed
datacenter_list - First observed
engine_health_rca - First observed
event_list - First observed
host_get - First observed
host_health_rca - First observed
host_list - First observed
job_list - First observed
storage_capacity_rca - First observed
storage_domain_get - First observed
storage_domain_list - First observed
undo_apply - First observed
undo_list - First observed
vm_get - First observed
vm_health_rca - First observed
vm_list - First observed
vm_stats
TDQS
Scored across 17 tools
Every tool targets a distinct resource and action: list/get tools expose raw state, RCA tools provide ranked diagnosis for a specific entity type, and event/job/undo tools cover cross-cutting concerns. Even the four RCA tools are clearly separated by entity—engine, host, storage, VM—and their descriptions explicitly tell agents which one to use for which question.
All tool names follow a consistent lowercase snake_case `entity_action` pattern: `host_list`, `host_get`, `vm_stats`, `engine_health_rca`, `undo_apply`. The RCA variants all share the `_rca` suffix, and list/get pairs are uniform across hosts, storage domains, and VMs, making the naming scheme highly predictable.
At 17 tools, the count is slightly above the ideal sweet spot but justifiable given the server covers multiple entity types, raw inventory reads, per-entity diagnostics, events, jobs, stats, and undo bookkeeping. Each tool fills a clear role; only a few entity-specific get/list variations make it feel a bit heavy.
The toolset provides strong read and diagnostic coverage across the core oVirt/OLVM domains: data centers, clusters, hosts, storage, VMs, events, jobs, stats, and health RCA. Minor gaps exist—such as no detailed cluster/storage/VM health breakdowns beyond RCA and no broader write operations—but these are workarounds an agent can usually route around using existing tools.
Maintenance
Related MCP Connectors
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
- ZopDev MCPOAuthdev.zop
Cloud cost, inventory and governance on AWS/Azure/GCP. Read-only by default, optional scoped writes
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Read-only finance and operations controls for AI agents with evidence and safe next actions.
Related MCP Servers
AlicenseAqualityDmaintenanceRead-only MCP server that allows AI assistants to query and monitor KVM Fleet devices, audit logs, and console sessions through the official REST API.59 npm1MIT- FlicenseNot gradedqualityCmaintenanceEnables management of oVirt / Red Hat Virtualization environments via AI assistants, supporting VM lifecycle, power operations, snapshots, and infrastructure queries.-
- FlicenseAqualityCmaintenanceRead-only MCP server that exposes Kubernetes platform state (tenants, pods, SLOs, ArgoCD applications, chaos schedules, and catalog services) to AI agents, enabling natural language queries about cluster health and configuration.6-
- FlicenseNot gradedqualityCmaintenanceProvides read-only Proxmox cluster oversight and configuration compliance checks through MCP, covering health, inventory, storage, backups, snapshots, and updates.-