io.github.AIops-tools/olvm-aiops
OfficialThis server is a read-only AIOps layer for OLVM/oVirt engines that audits every call and provides health, capacity, inventory, and event answers over MCP/CLI.
Engine health: diagnose engine certificates, clock, backups, and overall health (
engine_health_rca)Host health: rank host problems, including in-progress states and guest-agent issues (
host_health_rca, plushost_list/host_get)Storage capacity: detect critical/low/blocked storage, over-commit, and domain status issues (
storage_capacity_rca, plusstorage_domain_list/storage_domain_get)VM health: identify non-responding, paused, HA-down, image-locked, or transitioning VMs (
vm_health_rca, plusvm_list/vm_get/vm_stats)Events and jobs: list recent warning-or-worse events with severity/paging/
after_index/since_minutes, and list long-running jobs by status (event_list,job_list)Inventory: list data centers, clusters, hosts, storage domains, and VMs with their status and key attributes (
datacenter_list,cluster_list, etc.)Governance & safety: every tool is audited to
~/.olvm-aiops/audit.db, with budget/runaway guards, risk tiers, and output sanitization/redactionUndo tooling: view and dry-run/apply recorded undo tokens (read-only release means these have nothing to undo yet) (
undo_list,undo_apply)
Click 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: proxmox-monitor
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. A user has since run the read-only tools against a small production engine with 8 hosts and an FC data domain, and their results matched the engine's own API — including a second run under a
ReadOnlyAdminaccount, where every read and all four diagnoses worked and the figures matched the Administration Portal. Not yet verified: iSCSI / Gluster domains, self-hosted engine deployments, engines without Keycloak, or engines past the scan limits. Seedocs/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_listBRead-only
[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?
readOnlyHint=true already establishes this as a safe read, and the '[READ]' prefix merely restates that. The description does add value by naming the fields exposed per cluster, but it says nothing about pagination, ordering, or what an empty result means.
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 content is front-loaded into one sentence followed by a tight Args block with no filler. Structure is appropriate for a two-parameter list tool, though the leading purpose clause reads slightly telegraphically.
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 partially compensates by naming the key per-cluster fields returned, and it covers both parameters fully. Missing only secondary details such as result ordering or pagination behavior for a simple read-only list.
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 parameter burden, and it does: it documents the limit range (1-1000) and default (100) plus the meaning and default fallback of target, details absent from the schema. It could still clarify units or ordering semantics for limit.
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 the resource (clusters) and the salient fields returned (compatibility version, CPU type, memory over-commit policy), which is more specific than a tautology. It does not distinguish itself from siblings like host_list or datacenter_list beyond the resource name, 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?
There is no when-to-use or when-not-to-use guidance and no named alternative. The only conditional behavior stated is for the `target` argument (omit to use the default), which is argument behavior rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
datacenter_listARead-only
[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?
Annotations only declare readOnlyHint, so the description carries the rest and does so well: it enumerates possible status values, mentions the compat version field, documents the limit range (1-1000) and default (100), and explains that `truncated` signals more rows exist. Only the pagination mechanics (how to fetch the next page) remain unstated.
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 resource, then a compact args block. Slight redundancy in restating `limit`'s default of 100, which the schema already carries, but overall the text is tight 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?
With no output schema, the description is responsible for conveying the return shape, and it does so by naming status and compat version plus the truncation flag. For a simple two-parameter read-only lister, nothing critical is missing beyond explicit next-page retrieval instructions.
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 largely does: `limit` gets a range and default plus the `truncated` interaction, and `target` is explained as an engine target name from config with an omit-for-default rule. Both parameters gain meaning beyond their bare type declarations.
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 the resource (data centers) and the specific attributes returned (status values like up/uninitialized/maintenance and compat version), so the agent knows exactly what it gets. It does not differentiate itself from siblings such as cluster_list or host_list, which sit in the same listing family.
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] prefix and the note that omitting `target` falls back to the configured default give implicit usage context, but there is no explicit when-to-use/when-not statement and no alternative tool is named. The agent must infer that this is the enumeration entry point for data centers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
engine_health_rcaARead-only
[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". Event 10803 (a storage-pool vdsm command
failed) names no host and lands here: its cause names the command, which is the
subject — not the engine — and its severity is the event's own. Event 2024 is a record
that someone ran unlock_entity.sh by hand: it is low, and whatever the unlocked
entity then did wrong is reported by its own event. 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?
Annotations only supply readOnlyHint=true; the description carries the real behavioral load. It enumerates what is read (health check, version, clock drift vs. this machine, summary counts), defines the event-inclusion rule (warning-or-worse events naming no host, VM or storage domain), and pre-empts two classification edge cases (10803, 2024) plus the severity semantics and rank ordering.
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 placement is correct — purpose and trigger first, args last — and most sentences do work. The two multi-line digressions on events 10803 and 2024 are precise but heavy for a tool description; they are defensible edge-case guidance rather than padding, yet they stretch the entry considerably.
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, and the description compensates by telling the agent what a finding is, that results are ranked worst-first, and that each signal should be quoted. It stops short of describing the return envelope or how the 'summary counts' are structured, which is the only remaining 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 coverage is 0%, so the description must compensate and does: events_limit is bounded 1-1000 (default 200), events_window_hours bounded 1-720 (default 24), and target is explained as 'Engine target name from config; omit to use the default', resolving the anyOf string/null ambiguity.
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 names a specific verb+scope: '[READ] Problems with the engine itself, ranked worst first, in one call.' The resource (engine, not host/VM/storage) and the ordering guarantee are stated, which separates it from host_health_rca, vm_health_rca and storage_capacity_rca without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger — 'call this first for "is anything wrong"' — and an explicit scope limit: these alerts 'appear in no other diagnosis,' so they cannot be recovered from the sibling RCA tools. That is routing guidance an agent can act on, even though the sibling tools are not named individually.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
event_listARead-only
[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?
Annotations only supply readOnlyHint=true; the description goes well beyond it by disclosing default sort order (newest first), the order inversion when after_index is used, the truncated/scanTruncated signalling semantics, and that SSO session ids in login events are redacted. These are non-obvious behaviors an agent must know to poll safely.
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 one-line purpose, then behavior, then parameters; every sentence carries information. The Args block restates parameter names, but at 0% schema coverage that repetition is load-bearing rather than 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?
With no output schema, the description still names the return signals an agent needs (index, order, truncated, scanTruncated) and gives the correct polling algorithm. Nothing required to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: limit range 1-1000 with default 100, the four legal min_severity values, since_minutes bounds 1-129600, target's meaning and default, and the interaction constraint on page.
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 (list), resource (engine events), and scope (at or above a severity, newest first). No sibling tool covers events, so there is no ambiguity to resolve against the other 16 tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains exactly when to use each mode: after_index for following new events (with the repeat-while-truncated loop), since_minutes for a rolling window, and page for older history. It also states a hard exclusion — page is not combinable with since_minutes or after_index — and that omitting target uses the default.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host_getARead-only
[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?
The '[READ]' tag and the annotation readOnlyHint=true agree, so the safety profile is clear. Beyond that the description adds only the target-default behavior ('omit to use the default'); it says nothing about error behavior when an id is unknown, pagination, or output shape.
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, front-loaded lines: the read scope comes first, then a compact Args block. Nothing is padded, though the host_id line adds 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 simple two-parameter read tool with no output schema and no nested objects, the description covers the resource, the id requirement, and the target default. An agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, and it does: target is explained as an engine target name from config with an omit-to-use-default rule, which is not derivable from the schema. host_id is documented only as 'Host id', which is essentially a restatement.
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 (retrieve one KVM host) and scopes it by id, so the agent knows exactly what it returns. The parenthetical '(see host_list)' cross-references the sibling, though it does not explicitly contrast the two (single host vs. listing).
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?
'(see host_list)' implies the agent should use host_list to discover ids before calling this tool, which is useful implicit routing. There is no explicit when-to-use/when-not guidance or statement of prerequisites beyond that pointer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host_health_rcaARead-only
[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. A failed
guest-agent call (event 10802, a command starting with VmLogon or VmLogoff whose
message names the guest agent) is a problem of a guest, not of the host that ran the
call: it is reported low and carries vmCandidates, the VMs the engine reports on
that host. The same command failing for another reason stays a host finding. The event names no
VM, so present those as candidates to check, never as the affected VM; if that
envelope has an error, or scanTruncated is true, say the candidate list is
incomplete. Every event-10802 finding reports one vdsm command rather than the host's
own state, so its cause names the command; do not restate it as "this host is
failing" unless the host's status, external status or flags say so. It also carries
relatedVmEvents: the VM-level failures the engine logged within windowSeconds on
this host, which is where the operation's own failure is recorded (vm_health_rca
reports that half). They are paired on time alone — say "possibly the same operation",
never that the host finding is about a named VM; an empty list means none was logged,
not that none was looked for. 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 only readOnlyHint=true in annotations, the description adds substantial behavioral context: in-progress installs/reboots are reported as in-progress not failed, alert 9000 is informational on hosts without fencing, event 10802 is scoped to the guest not the host, relatedVmEvents are paired on time alone, and an empty list means none was logged. This is exactly the kind of semantics annotations 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?
It is front-loaded with the purpose and every sentence carries interpretation content, but the middle is a dense wall of edge-case prose that could be broken into clearer structure. Length is largely justified by the absence of an output schema, though it borders on over-specified.
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 explains the returned finding fields (signal, cause, action, rank), the auxiliary fields (vmCandidates, relatedVmEvents, eventsOutsideWindow, scanTruncated), and how to interpret each. Nothing an agent needs to invoke or read results 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 does: it documents events_limit (range 1-1000, default 200), events_window_hours (range 1-720, default 24, older events counted in eventsOutsideWindow), and target (engine target name, omit for default). Ranges and the out-of-window side effect are meaningfully 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 first line states a specific resource and scope: 'What needs attention on KVM hosts, ranked worst first, in one call.' It also distinguishes itself from the sibling vm_health_rca, which is named as reporting the VM half. An agent can tell what this tool is and is not 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 clear context for when the tool applies (host-level health triage) and routes the VM half of an operation to vm_health_rca by name. However, it never explicitly states when to prefer this over siblings like host_get or engine_health_rca, so the selection guidance is contextual rather than an explicit when/when-not rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
host_listARead-only
[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?
Annotations only declare readOnlyHint=true, and the description adds real behavioral context beyond that: unreported fields are null rather than 0, and the 'truncated' flag signals when more rows exist. It does not cover auth/target-resolution behavior in depth, but the null-semantics disclosure is genuinely non-obvious and useful.
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 what the tool is and its field set, then a caveat, then a compact Args block. Every sentence adds information and the args are terse but complete.
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 key return behaviors (field list, null semantics, truncation signal) and the pagination contract. What's missing is only the response envelope shape, a minor gap for a list tool whose annotations already confirm it is 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 description coverage is 0%, so the description must carry all three parameters, and it does: limit with its 1-1000 range and default 100, search with the query language and literal examples ("status=up", "status!=up"), and target with its config-name meaning and default fallback. This fully compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('[READ] KVM hosts') and enumerates the returned fields (status, SPM role, memory, VM counts), which cleanly separates it from host_get (single host) and host_health_rca (diagnosis). An agent can distinguish it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: for "what is wrong with my hosts" use host_health_rca instead of reading this list yourself. That is a concrete when-not-use plus a named alternative, exactly the condition an agent needs to pick between the two tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_listARead-only
[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?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds the [READ] marker (redundant with the annotation) and enumerates the status values, but says nothing about result ordering, pagination, or what 'duration' measures for in-flight jobs.
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 one-line summary is front-loaded and the Args block is tight, with no filler. Formatting is functional though the block-style parameter list is slightly less scannable than inline 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 3-parameter read tool with no output schema and only a readOnlyHint, the description covers parameters well but omits return-shape context (e.g., what fields a job row carries, ordering, or truncation behavior at the 1000 limit). Adequate but with clear gaps.
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 largely does: it documents limit's range (1-1000) and default (100), the exact status enum values that the schema lacks, and target's default behavior. It stops short of explaining whether status is exact-match only across multiple values or any format nuances.
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 (engine jobs / long-running operations) and what the listing conveys (status and duration). It's clear what the tool does, though it doesn't explicitly contrast itself with any sibling (none of the siblings are job-related, so this is minor).
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 target parameter note ('omit to use the default') gives a small amount of invocation guidance, but there is no statement of when to use this tool versus alternatives or any prerequisites/exclusions. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_capacity_rcaARead-only
[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. A domain whose
thresholds are unset (the engine reports 0) is reported low with its measured free
space: nothing — not the engine, not this tool — will warn before it fills, and how
full is too full is not recorded anywhere to read. Over-commit
on its own is a planning limit, and its signal carries actual use next to it: do
not report an over-committed domain as short of space unless a low-space or
blocker finding says so. 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 only readOnlyHint declared in annotations, the description carries the behavioral load well: it discloses severity rules, that warning-or-worse events naming a domain get attached, that unattached domains are skipped, and the edge case where unset thresholds (engine reports 0) are reported low. These are substantive traits 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?
The core purpose is front-loaded, which is good, but the severity discussion is dense and some sentences (e.g., the 'nothing — not the engine, not this tool — will warn' clause) are convoluted and could be tightened. Roughly adequate but with clear verbosity.
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 must explain what findings look like — and it does, covering rank ordering, quoting signals, severity semantics, skipped domains, and the unset-threshold edge case. For a complex RCA tool this is complete enough to invoke and interpret 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 Args block fully compensates: events_limit 1-1000 (default 200), events_window_hours 1-720 (default 24), and target (engine target name from config, omit for default). All three parameters get meaning, bounds, and defaults that 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 and resource: storage-domain problems ranked worst-first in a single call, explicitly tagged [READ]. This is clearly distinguishable from storage_domain_list/get (raw listing) and engine_health_rca (different domain), so 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?
It gives rich interpretive guidance — severity mapping (critical below free-space blocker, medium below low-space warning, high for inactive/unknown/mixed domains) and exclusions (unattached domains are skipped; over-commit alone is not a space shortage). It lacks any explicit routing to a sibling alternative, keeping it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_domain_getARead-only
[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?
The readOnlyHint annotation already establishes this is a safe read, and the '[READ]' tag merely restates it. The description does add genuine context by noting the returned status is data-center-scoped and that target selection defaults from config, but it says nothing about failure behavior for a missing id or about target mismatch across data centers.
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 carrying the scope, followed by a tight two-item Args block. No filler, and the parameter notes each add information rather than restating the schema.
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 partially compensates by naming the payload ('one storage domain ... with its data-center-scoped status'), which tells the agent roughly what comes back. For a simple two-parameter read tool this is close to sufficient, with only error/empty-result behavior 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 must carry both parameters, and it largely does: domain_id is explained as a storage domain id sourced from storage_domain_list, and target is explained as an engine target name from config that defaults when omitted. Only the string format of domain_id (e.g., name vs. UUID) is left unspecified.
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 with an explicit scope qualifier: fetch exactly one storage domain by id, returning its data-center-scoped status. This distinguishes it cleanly from the sibling storage_domain_list, which the description also cross-references.
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: 'One storage domain by id (see storage_domain_list)' tells the agent to use the list tool to obtain ids, which is a soft routing hint. There is no explicit when-to-use/when-not statement, no mention of what happens for an unknown id, and no contrast with other read tools beyond the list sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_domain_listARead-only
[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?
Annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds genuinely useful behavior beyond that — status provenance via statusSource, deliberate nulls rather than guesses when statusErrors occur, and a truncated flag indicating more rows exist. No auth or rate-limit details, but the provenance semantics are a real value-add.
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 purpose, then the status-provenance caveat, then a compact Args block. Every sentence carries information — no filler, no repetition of the schema.
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 covers what is returned, the null-status edge case, and pagination via truncated. It could note how this differs from storage_domain_get, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full parameter burden, and it does: limit is documented with range 1-1000, default 100, and the truncated signal; target is explained as an engine target name from config with a default when omitted. Both parameters gain meaning not present in the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — listing storage domains — and enumerates the returned attributes (status, free/used/committed bytes and %). It implicitly contrasts with the sibling storage_domain_get by being a listing operation, but never names that sibling, so it falls short of explicit 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?
The '[READ]' tag and the listing framing imply usage, and the target arg hints at multi-engine contexts, but there is no explicit when-to-use guidance or routing to alternatives such as storage_domain_get or storage_capacity_rca.
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 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?
Annotations already declare destructive=true, idempotent=false, readOnly=false; the description adds that the inverse executes through its own governed tool and risk tier (audit behavior) and that tokens are single-use. Useful beyond the annotations, though it doesn't say what the inverse might mutate.
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 [WRITE][risk=medium] tag front-loads the mode and risk, and the body is tight. The Args block partially restates the schema titles, but each line adds semantics, so little 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?
No output schema, but the description explains the dispatch model, the dry-run preview path, and the one-time token constraint, which covers the essentials for a mutation tool. It could clarify failure behavior (e.g., applying an already-used token) to be 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?
Schema description coverage is 0%, so the description must carry the load, and it documents all three params: undo_id's source, dry_run's preview semantics, and target's pass-through role. The 'target' explanation ('when it accepts a target') is a bit thin but directionally complete.
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 ('apply') and resource ('a recorded undo') plus the mechanism (dispatching its inverse tool). This clearly distinguishes it from the sibling undo_list, which only enumerates tokens.
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 guidance: undo_id comes from undo_list or an _undo_id in a write result, use dry_run=True to preview, and a token can only be applied once. It stops short of saying when not to use it or when preview is mandatory, but the context is clear.
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.
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?
Annotations only declare readOnlyHint, yet the description discloses substantial behavior: an extra row is read so 'truncated' is measured rather than inferred, effectVerified=false means the reversed change is probable not confirmed, and it warns against reporting an unverified restore. This is well beyond what the annotation covers.
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 usage, then a non-obvious implementation note, then args. The paragraph on effectVerified is long but every clause carries decision-relevant 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?
No output schema exists, so the description supplies the return shape itself (original tool, inverse tool, human note, truncated, effectVerified) plus the truncation semantics. Nothing an agent needs to call and 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 must carry the burden — and it does: limit is documented with default 50 and a cap of 500 (the cap is absent from the schema), and target is explicitly marked unused and explained as CLI uniformity.
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') with ordering scope ('most recent first') and the [READ] marker. It is immediately distinguishable from its sibling undo_apply, which it names.
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 onward ('Use the undoId with undo_apply') and gives a conditional check before applying when effectVerified is false. It doesn't state an explicit when-not-to-use case for undo_list itself, but the workflow context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vm_getBRead-only
[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?
The '[READ]' tag merely restates the existing readOnlyHint=true annotation, so it adds no behavioral value. No information is given about error behavior, missing-VM handling, or what fields are returned.
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?
Brief and front-loaded with the operation, followed by a clean Args block. No filler sentences, though the parameter lines are terse to the point of being thin.
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-resource read with readOnlyHint annotations and no output schema, the description is largely sufficient to invoke correctly; only the return shape and id format remain 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 parameter meaning. It usefully documents that 'target' is an engine target name that defaults when omitted, but 'vm_id: VM id' is circular and adds nothing about format or source.
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: retrieves one VM by id, and the parenthetical '(see vm_list)' signals the sibling that handles the collection case. It is distinguishable from vm_list, though it gives no cue about vm_stats or vm_health_rca.
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 '(see vm_list)' pointer implies the list-vs-single distinction, but there is no explicit when-to-use guidance and no mention of the related read tools (vm_stats, vm_health_rca) that could serve similar lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vm_health_rcaARead-only
[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?
Annotations only declare readOnlyHint=true, so the description carries the behavioral burden and does so well: it discloses the ranking logic, that events are correlated one-finding-per-VM-and-code, and the superseding rule (VM started after the event, or engine reported back up and it is up now). It also notes eventsOutsideWindow behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the key claim ('VM problems ranked worst first, in one call') and every subsequent sentence carries information. It is dense and long, but the length is justified by the correlation rules; a small trim of the severity rubric would not hurt.
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 and this is a complex diagnostic tool, yet the description explains the finding model, ranking, event correlation, and every argument. An agent has enough to invoke it and interpret results without opening anything else.
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 compensate, and it does: events_limit (1-1000, default 200), events_window_hours (1-720, default 24, and how out-of-window events are surfaced), and target (engine target name from config, omittable for default). All three parameters are fully documented.
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, in one call — with an explicit read-only marker. It implicitly distinguishes itself from the sibling *rca tools (host_health_rca, engine_health_rca, storage_capacity_rca) by scoping to VMs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete severity rubric (high/medium/info/low) tied to VM states, and explicitly routes to an alternative: 'check storage_capacity_rca' for storage I/O errors. It also flags a false-positive case — 'Down VMs without HA are normal' — which is genuine when-not-to-alarm guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vm_listARead-only
[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?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuine behavioral context beyond that: the '[READ]' marker reinforces the non-mutating nature, and the note that 'truncated' says when more rows exist discloses pagination behavior an agent needs to detect incomplete results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the read marker and returned fields, then a compact Args block where every line adds distinct information. No filler or restatement of the tool name.
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 usefully enumerates returned fields and the truncation flag, and fully specifies inputs. The remaining gap is routing: it never mentions the sibling tools (vm_get, vm_stats) that an agent might otherwise confuse it with.
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 well: it documents the limit range (1-1000) and default (100), the 'truncated' signal, the search query language with two concrete examples, and the meaning of target plus the omit-to-use-default behavior. All three parameters gain semantics not present in 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 states a specific verb+resource ('[READ] VMs') and enumerates the fields returned (status, host, vCPUs, memory, HA flag), so an agent immediately knows this is a bulk inventory read. It doesn't explicitly distinguish itself from sibling vm_get, but the list/get naming convention makes the split reasonably 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?
Usage is implied rather than stated: 'target: omit to use the default' gives a real conditional, and the search examples show how to filter. However, there is no explicit guidance on when to pick vm_list over vm_get, vm_stats, or vm_health_rca, which is the primary selection risk among these siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vm_statsARead-only
[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?
Annotations already declare readOnlyHint=true, so the safety profile is covered and the '[READ]' prefix is partly redundant. The description adds that stats are 'current' (i.e. live, not historical), which is mild behavioral context, but says nothing about freshness, rate limits, permissions, or failure modes.
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 outcome, then a compact Args block; every sentence carries information and there is no filler. Slightly terse on vm_id but appropriately sized 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?
With no output schema, the description correctly carries the return-value burden by naming the metrics and noting 'with units'. What remains missing is the concrete response shape/format and any indication of whether values are instantaneous or averaged.
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 explain target meaningfully ('Engine target name from config; omit to use the default'), which goes beyond the bare schema title 'Target'. But vm_id is only restated as 'VM id' with no format or source guidance, leaving one of two params essentially 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?
States a specific verb+resource (read a VM's current statistics) and enumerates the returned metrics (memory, CPU %, network, disk), so the agent knows exactly what it gets. It does not differentiate itself from the nearby vm_get or vm_health_rca siblings, so it falls 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 and 'current statistics' framing imply a monitoring/observation use case, and the target arg note ('omit to use the default') gives some operational guidance. However, there is no explicit when-to-use versus vm_get or vm_health_rca, and no stated prerequisites.
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
List/get tools and the *_rca diagnostic tools are clearly separated, with explicit guidance in host_list and engine_health_rca pointing users to the RCA tool for 'what is wrong'. The four diagnostic aggregators (host, engine, storage, vm) have distinct scopes, though host_health_rca discussing VM candidates and vm_health_rca referencing storage creates minor cross-over.
Names follow a predictable resource_action snake_case pattern (host_list, vm_get, storage_domain_get, undo_apply). Verb choices vary (list, get, stats, health_rca, capacity_rca, apply) but the resource-first convention is consistent and readable throughout.
17 tools is reasonable for a platform spanning hosts, VMs, storage, datacenters, clusters, events, jobs plus diagnostics. Each tool maps to a distinct resource or diagnostic concern with little redundancy.
Read and diagnostic coverage is strong, but the surface is almost entirely read-only with no VM lifecycle, host maintenance, or other action tools, even though the undo framework implies write tools that generated the tokens but are not exposed here. Some resources also lack a get counterpart (cluster, datacenter, job).
Maintenance
Related MCP Connectors
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
Read-only AI/LLM cost tools with current MCP discovery and attributable Registry transport.
- 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.
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.52 npm1MIT- FlicenseNot gradedqualityCmaintenanceProvides read-only Proxmox cluster oversight and configuration compliance checks through MCP, covering health, inventory, storage, backups, snapshots, and updates.-
- FlicenseNot gradedqualityAmaintenanceProvides authenticated read-only access to VMware Cloud Foundation Operations inventory, metrics, alerts, report definitions, targets, and skills via Streamable HTTP, with a durable audit trail and an admin UI.-
- AlicenseBqualityCmaintenanceEnables read-only operational audits of schedulers, recurring job health, delivery failures, overdue runs, gateway/MCP health, and lock-file inventory without modifying inspected systems.11MIT