io.github.zw008/vmware-debug
Diagnostic incident-investigation assistant: correlates VMware events, manages case ledgers, plans evidence gathering, and grades hypotheses without touching vSphere.
Correlate pre-fetched events into timelines, spikes, and ranked hypotheses (
incident_timeline; case version:case_timeline).List recognised symptom categories with example keywords and suggested next checks (
list_symptom_categories).Open, list, inspect, and close investigation cases (
case_open,case_list,case_get,case_close).Get a step-by-step evidence-fetch plan for a case, including unavailable sources (
case_plan).Record retrieved facts and gaps, with source, query, and time basis (
case_submit_evidence,case_record_gap).Register and read hypotheses; status is computed from evidence and gaps (
case_hypotheses).Recompute conclusion grades from the ledger (
case_grade) and check what strength this environment can reach (case_readiness,case_knowledge).All writes stay in a local
$OPS_HOMEcase ledger; no VMware system is modified or contacted.
Provides diagnostic tools for VMware environments, correlating events and ranking hypotheses from logs and symptoms.
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.zw008/vmware-debugShow timeline for recent ESXi host failures"
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.
VMware Debug
Disclaimer: Community-maintained open-source project, not affiliated with, endorsed by, or sponsored by VMware, Inc. or Broadcom Inc. "VMware" and "vSphere" are trademarks of Broadcom. Source is publicly auditable under the MIT license.
The diagnostic brain of the VMware skill family. You bring the symptom (an error,
a log dump, a slow VM); this skill runs a systematic investigation, correlates
events from the other skills into one timeline, ranks root-cause hypotheses, and
tells you what to check next. It never touches vSphere — it connects to
nothing and never executes fixes; its only writes are to a local case ledger
under $OPS_HOME. Remediation is routed to vmware-aiops (single op) or
vmware-pilot (multi-step, gated), mirroring the vmware-harden → vmware-pilot
advisor/executor split.
See skills/vmware-debug/SKILL.md for the full
methodology, the event-envelope contract, and symptom routing.
MCP tools (14 — 7 read, 7 write)
The seven writes go to the local case ledger only; none reaches a VMware system.
Correlation — stateless, for a single look:
Tool | What |
| [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
| [READ] List recognised symptom categories + what to check for each |
Investigation ledger — for an incident you will reason about over time:
Tool | What |
| [WRITE] Define the event; returns a case id and the grade this environment can reach |
| [READ] What grade this environment can reach, per symptom category, before you start |
| [READ] Which knowledge formats are accepted, what is mounted, and which entries apply to a case |
| [READ] What to fetch next — skill, tool and purpose per step; recomputed from the case's current state |
| [READ] Cases, newest first |
| [READ] One case: scope, ledger sizes, grade history |
| [WRITE] Register a candidate explanation, or read the ledger of what supports and refutes each |
| [WRITE] Record one retrieved fact, with its source, query and time basis |
| [WRITE] Record what could not be retrieved, and how to close it |
| [WRITE] Correlate everything the case has collected into one timeline |
| [WRITE] Recompute the conclusion grade from the ledger and record it |
| [WRITE] Record the final grade, archive, and name what was left open |
Related MCP server: AI Incident Monitoring RCA MCP Server
Offline / Air-Gapped Install (from source)
This project uses the modern PEP 517 build system (hatchling), so there is no
setup.py by design — that is expected, not a missing file. If you cloned the
source and hit ERROR: File "setup.py" or "setup.cfg" not found ... editable mode currently requires a setuptools-based build, your pip is older than 21.3 and
cannot do an editable (-e) install with a non-setuptools backend. Editable
mode is a developer convenience, not needed to run the tool — do one of:
# From the source tree — a normal (non-editable) install builds a wheel:
pip install . # NOT pip install -e .
# ...or upgrade pip first, and editable works too:
pip install --upgrade pip && pip install -e .For a truly air-gapped host, build the wheels on a connected machine and copy them over — the target then needs no network:
# On a connected machine, collect this package + its dependencies as wheels:
pip wheel . -w dist # → dist/*.whl (or: uv build, for just this package)
# Copy dist/ to the air-gapped host, then install offline:
pip install --no-index --find-links dist vmware-debugLicense
MIT.
Available Tools
14 toolscase_closeA
[WRITE] Record the final grade and archive the case — step 08.
WHEN: when the investigation is finished, or is being handed over. Closing turns a working folder into a record other people rely on, so it computes and records the grade rather than accepting one.
RETURNS: {case_id, state, grade, open_gaps, path, note}. open_gaps
names anything still blocking a hypothesis at the moment of closing —
stated here rather than left in the file for someone to find.
GOTCHAS: a closed case is not closed again and its record is never rewritten. To reopen the question, open a new case that cites this one, so the original conclusion and whatever changed it both stay readable.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | Yes | The case to close (from case_open/case_list). There is no grade parameter — closing recomputes the grade from the ledger. An already-closed case is refused rather than closed again. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and idempotentHint=false. The description goes beyond by disclosing that the grade is computed from the ledger rather than accepted, that the return includes open_gaps, and that a closed case cannot be closed again and its record is never rewritten. This adds meaningful behavioral context about irreversibility and the computation logic, without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into concise, clearly labeled sections (purpose, WHEN, RETURNS, GOTCHAS), front-loaded with the core purpose. Every sentence provides useful information without redundancy. The format makes it easy for an agent to quickly grasp the tool's behavior and consequences.
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, trigger condition, output shape, and important gotchas (irreversibility, refusal of already-closed cases, and the alternative for reopening). For a simple single-parameter tool, this is comprehensive and leaves no critical gaps for an agent to make a correct call.
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 for case_id already provides a full description, including that there is no grade parameter and that closing recomputes the grade. The tool description repeats this ('no grade parameter — closing recomputes the grade from the ledger') but does not add new meaning. With 100% schema description coverage, the baseline of 3 is appropriate; the description adds no additional semantic insight.
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 'Record the final grade and archive the case — step 08' clearly states the action (record + archive), the target resource (case), and its position in the workflow. It distinguishes itself from siblings like case_grade (which computes grade without closing) and case_open by its finalizing, archiving role.
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 'WHEN' section explicitly states to use this tool when the investigation is finished or handed over. It also provides an alternative for reopening ('open a new case that cites this one'), clarifying that closing is a terminal action and not for ongoing work. This is clear usage guidance with both a positive trigger and an exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_getARead-onlyIdempotent
[READ] One case: its scope, its ledger sizes, and its grade history.
WHEN: to pick up an investigation, or to see why a case sits at the
grade it does. Returns counts and identifiers rather than the whole
ledger — read the case folder itself (the path from case_open) for
full evidence bodies.
RETURNS: {case_id, path, state, grade, opened_at, scope, evidence_count,
sources, gap_count, blocking_gaps, grade_history}. sources is the
distinct skills evidence came from, which is what corroboration is
counted in.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | Yes | The case id returned by case_open, or listed by case_list. An unknown id is an error, never an empty case. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context by stating that it returns aggregate counts and identifiers rather than full evidence bodies, and by listing exactly what fields are returned, including grade_history and blocking_gaps.
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 structured with READ/WHEN/RETURNS sections, front-loading the core purpose and use case. Every sentence adds value, and the return field list is provided in a compact, scannable format without unnecessary 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 one-parameter, read-only tool with rich annotations and no output schema, this description is complete. It explains what the tool returns, when to use it, and when to use an alternative, so an agent can correctly select and invoke it 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?
Schema description coverage is 100%, and the single parameter case_id is well documented in the schema, including the note that an unknown id is an error. The description does not add extra parameter semantics beyond the schema, which is acceptable given full schema 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?
The description opens with '[READ] One case' and immediately scopes the tool: 'its scope, its ledger sizes, and its grade history.' It clearly distinguishes itself from sibling tools by noting that it returns counts and identifiers rather than the whole ledger, so an agent can tell this apart from case_open, case_list, or case_timeline.
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 'WHEN' section gives explicit use cases: 'to pick up an investigation, or to see why a case sits at the grade it does.' It also provides a when-not and alternative: 'read the case folder itself (the path from case_open) for full evidence bodies,' which tells the agent exactly when case_get is insufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_gradeA
[WRITE] Compute and record the conclusion grade — steps 07/08.
WHEN: when you think the investigation has reached a conclusion, or to record where it stands before handing it over.
There is deliberately NO parameter for the grade. You cannot state a conclusion level; it is recomputed from the ledger on every call. If you disagree with the result, change the ledger — submit the evidence that is missing, or record the gap that is blocking it.
The levels: Candidate (a hypothesis exists); Probable (at least two INDEPENDENT sources agree — two calls to the same skill are one source — and nothing outstanding could overturn it); Confirmed (that, plus a decisive item: a direct hardware diagnostic, a version-checked knowledge-base entry, or a vendor SR, and no gap left open); Excluded (an observation that actually rules the hypothesis out — "we looked and found nothing" is a gap, not an exclusion). Exclusion is per hypothesis, counting only sources that falsify THAT hypothesis; the case is Excluded only when every registered one is. A hypothesis contradicted but not yet ruled out holds the case at Candidate. Otherwise the grade counts only evidence that falsifies nothing.
RETURNS: {grade, previous, direction, reasons, ceiling, ceiling_reasons,
rules_source, rules_origin, hypotheses}. hypotheses lists every
registered hypothesis as {id, status: open|excluded}. direction is
initial/up/down/unchanged — grades may go DOWN, and the history records
it when they do.
GOTCHAS: on a stock install ceiling is "probable", because Confirmed
needs a decisive source and there is neither a hardware-diagnostic
channel nor a knowledge library mounted yet. That is a real limit, not
a caution. Every grading is appended to conclusion.md and none is ever
rewritten.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | Yes | The case to grade (from case_open/case_list). This is the only parameter — see above for why there is no grade parameter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses rich behavioral traits beyond the annotations: the grade is recomputed from the ledger, there is deliberately no grade parameter, grades may go down, every grading is appended to conclusion.md and never rewritten, and stock-install ceiling is 'probable.' This goes far beyond the minimal annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but is well-structured with WHEN, RETURNS, and GOTCHAS sections, and the content is substantive. The unexplained 'steps 07/08' reference and the lengthy level definitions add some bulk, but the sections make it scannable and front-loaded with the core purpose.
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 single parameter and no output schema, the description is remarkably complete: it defines all grade levels, explains the ceiling edge case, details the return fields including direction and hypotheses, and notes the append-only recording behavior. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents case_id fully, including its source ('from case_open/case_list') and the absence of a grade parameter. The description reinforces this but does not add substantially new parameter-level meaning beyond what the schema covers, so the baseline 3 applies.
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: 'Compute and record the conclusion grade.' It also ties the action to workflow steps (07/08) and explains what the tool is not doing (accepting a grade parameter), which distinguishes it from evidence-submission and gap-recording 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 'WHEN' section explicitly states the invocation condition: when the investigation has reached a conclusion or before handover. It also gives alternative actions when the agent disagrees with the computed grade—'submit the evidence that is missing, or record the gap that is blocking it'—which routes the agent away from the wrong tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_hypothesesA
[WRITE] Register a candidate explanation, or read the ledger — step 06.
WHEN: as soon as you have a theory worth testing, and again to see where
each one stands. Pass statement to add one; omit it to just read.
Every hypothesis gets an id (H1, H2, …). Those ids are what case_record_gap(blocks=[...]) and case_submit_evidence(falsifies=[...]) refer to, and an id that was never registered is REFUSED rather than ignored — a dangling reference blocks nothing and falsifies nothing, which quietly reports a stronger case than you have.
RETURNS: {case_id, added, hypotheses, note}. Each entry carries its
status: refuted (ruled out by case_grade's rule), blocked (a gap is
in the way, with the gap id and how to close it), or open.
refuted_by lists every falsifying item; the first next step says when
more sources are needed. Status is computed from what points at the
hypothesis, never asserted.
GOTCHAS: refuted outranks blocked. Once an observation settles the question, a missing measurement no longer matters.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | Yes | The case whose hypothesis ledger this is (from case_open/case_list). | |
| statement | No | The candidate explanation, in one line. Pass it to register a new hypothesis, which is assigned the next id (H1, H2, …); omit it to read the ledger without changing it. There is no parameter for a hypothesis's status — status is computed from the evidence and gaps that point at it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only saying readOnlyHint=false, the description carries the behavioral burden and does it thoroughly: dangling ids are REFUSED, status is computed rather than asserted, statuses are listed, refuted outranks blocked, and return fields are described. This goes well beyond the annotation data.
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 organized with clear WHEN/RETURNS/GOTCHAS sections, front-loads the core purpose, and every sentence carries operational value. It is longer than average, but the tool's dual read/write behavior and cross-tool id semantics justify the length.
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?
Even without an output schema, the description states the return shape ({case_id, added, hypotheses, note}) and explains each status. It also covers edge behavior like dangling references and status precedence, so an agent has everything needed to call the tool correctly and interpret its results.
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 100%, so the schema already documents both parameters well. The description reinforces the statement param's dual mode and adds the useful note that status has no parameter, but most of this is already present in the schema, so the description adds only moderate extra meaning.
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-plus-resource: either register a candidate explanation or read the ledger. It clearly frames the dual read/write behavior and names the dependent tools (case_record_gap, case_submit_evidence) that consume hypothesis ids, making it easy to distinguish 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?
It gives an explicit WHEN ('as soon as you have a theory worth testing, and again to see where each one stands') and exact mode-switching guidance: pass statement to add, omit to read. This leaves an agent with no ambiguity about when and how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_knowledgeARead-onlyIdempotent
[READ] What the knowledge layer accepts, and what is mounted.
WHEN: when someone asks what can be added to make conclusions stronger, or when a case will not reach Confirmed and you need to say why in terms they can act on. This is the answer to "which knowledge formats do you take" — the first question anyone mounting a library asks.
RETURNS: {root, sections, entries, with_applies_to, by_source, unreadable, unsupported, formats, needs_conversion, note} — plus {applicable, decisive_here} when a case_id is given.
formats lists every extension read and how each carries its metadata:
Markdown front-matter, YAML/JSON whole-file, JSONL per line, CSV/TSV per
row, and plain text with a sibling .yaml. needs_conversion names the
ones that must become Markdown first (PDF, DOCX, PPTX, HTML).
GOTCHAS: an entry is decisive ONLY if its applies_to block was checked
against the case scope and passed — matching is by version
applicability, never by similarity, because an entry written for the
wrong build reads exactly like the right one. An entry with no
applies_to can support a hypothesis but can never make a case
Confirmed. A constraint the case scope cannot answer is not a match
either: silence is not a pass.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | No | Omit to describe the knowledge layer itself — what formats are read and what is mounted. Pass a case id and every mounted entry is additionally version-checked against THAT case's product_versions, adding `applicable` and `decisive_here` with the reason each entry did or did not qualify. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description exposes subtle behavior: matching is by version applicability, never similarity; an entry without applies_to can support but never Confirm; and unanswered constraints are not matches ('silence is not a pass'). These gotchas materially change how an agent should interpret 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?
The description is organized with [READ], WHEN, RETURNS, and GOTCHAS sections, front-loads the most important facts, and each sentence contributes either usage context, return shape, or an operational caveat. It is dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing return fields, format categories, conversion needs, and caveats about decisiveness. It also explains the optional case_id behavior and when the extra fields appear, making the tool safe to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents case_id at 100% coverage, but the description reinforces the effect of passing it and adds the decisive-here criteria and no-silence rule. This adds practical meaning beyond the schema's version-check wording.
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 the tool as the read-only view of the knowledge layer: 'What the knowledge layer accepts, and what is mounted.' It distinguishes case_knowledge from case tools like case_get or case_hypotheses by focusing on knowledge formats, mounting, and applicability rather than incident or case state.
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 WHEN: use it when someone asks what can be added to strengthen conclusions, when explaining why a case cannot reach Confirmed, or when mounting a knowledge library. It does not explicitly name sibling tools as alternatives or state when not to use it, so it falls just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_listARead-onlyIdempotent
[READ] List investigation cases, newest first.
WHEN: to find the id of a case you or someone else opened earlier. Returns the family list envelope {items, returned, limit, total, truncated, hint}; each item is {case_id, summary, state, grade, opened_at}. A case whose folder is damaged appears with state="unreadable" rather than vanishing from the list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum cases in the page, newest first (default 50). There is no offset — 'total' reports every case, so when truncated is true the only way to reach older ones is a larger limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/destructive annotations, the description discloses meaningful behavior: the envelope structure, pagination behavior (no offset, total reports every case, truncated implies older cases need larger limit), and the damaged-folder behavior where cases appear with state='unreadable' rather than disappearing. This is rich, non-obvious 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 well-structured: a [READ] flag, a one-line purpose, a 'WHEN' usage hint, and a concise return-shape summary. Every sentence contributes meaningful information with no wasted words.
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 one optional parameter and no output schema, the description fully covers the return envelope, item fields, ordering, pagination, and edge-case behavior. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the limit parameter is already fully documented including default, ordering, and offset behavior. The description adds no new parameter-specific meaning beyond what the schema already states, so baseline 3 is appropriate.
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?
Description states a specific verb ('List') and resource ('investigation cases') with an explicit ordering ('newest first'). It is clearly distinguishable from siblings like case_get and case_open, which operate on individual cases rather than listing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'WHEN' clause: use this tool to find the id of a case opened earlier. It does not name sibling alternatives or state when not to use it, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_openA
[WRITE] Open an investigation case — step 01, define the event.
WHEN: at the start of an incident you expect to reason about rather than glance at. For a one-off lookup use incident_timeline alone.
RETURNS: {case_id, path, state, grade, ceiling, ceiling_reasons, next}.
Read ceiling now — it is the best grade this install can reach at all.
GOTCHAS: writes only under $OPS_HOME, never to a VMware system, and never over an existing case.
| Name | Required | Description | Default |
|---|---|---|---|
| objects | No | Entities in scope, names or MoIDs ("vm-web01", "host-12"). Omit for a case not yet pinned to specific objects. | |
| summary | Yes | What is wrong, one line. case_plan reads it to infer the symptom category, so name the symptom in the estate's own words ("datastore latency on cluster-a"), not a diagnosis. | |
| window_end | No | Believed end, ISO-8601. Omit while still in progress. | |
| window_start | No | When the incident is believed to have started, ISO-8601. Omit if unknown — evidence gets fetched against it, so an invented window is worse than none. | |
| determined_by | Yes | HOW the scope was decided — "user report", "vCenter alarm 42". Required: a scope from a phone call and one from an alarm id support different conclusions, and nobody remembers which it was later. | |
| product_versions | No | Versions keyed by product — {"esxi": "8.0.3"} — plus "driver.<name>" / "firmware.<name>" entries. Knowledge-base entries are version-checked against this: one constraining a product absent here can support a hypothesis but never make the case Confirmed, since an unanswerable constraint is not a pass. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits: it is a write operation ([WRITE]), it returns a specific set of fields including a 'ceiling' that the agent is told to read, and it has explicit side-effect constraints in GOTCHAS: writes only under $OPS_HOME, never to a VMware system, and never over an existing case. Annotations confirm it is not read-only, not idempotent, and not destructive, and the description adds context beyond these flags (the write location and overwrite prohibition). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly organized into labeled sections (WRITE, WHEN, RETURNS, GOTCHAS). Each sentence earns its place: it covers purpose, usage, return shape, and side-effects in under 100 words. It front-loads the verb and resource, making it scannable for an agent. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, all documented in schema, no output schema) the description provides all necessary context: when to use it, what it returns, and critical side-effect constraints. The mention of 'ceiling' and the instruction to read it now prepares the agent for a key return value. The description is sufficient for correct invocation without requiring the agent to infer missing details.
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 100% description coverage, with each parameter providing meaningful semantics (e.g., summary is used by case_plan to infer symptom category, window_start warns against invented windows, determined_by explains why it is required). The tool description itself does not add any parameter-specific meaning, but the schema already does. According to the rubric, with high coverage the baseline is 3, and that is appropriate here.
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 '[WRITE] Open an investigation case — step 01, define the event.' It clearly states the action (open) and the resource (investigation case), and provides immediate differentiation from sibling incident_timeline by specifying it is for incidents to reason about rather than glance at. This is a specific, non-tautological statement of purpose.
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 an explicit 'WHEN:' section: 'at the start of an incident you expect to reason about rather than glance at. For a one-off lookup use incident_timeline alone.' It tells the agent exactly when to use this tool versus an alternative and sets expectations for the place in the workflow (step 01). This is clear, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_planARead-onlyIdempotent
[READ] What to fetch next for this case — step 02, recomputed each call.
WHEN: right after case_open, and again after each round of evidence. It is not a checklist: submit something and the next plan is shorter, lose a source and it routes around it.
RETURNS: {category, category_signals, steps, already_covered, held_back, unavailable, ceiling, note}. Steps are interleaved across evidence classes, so you get breadth before depth — corroboration is counted in distinct sources, which is what actually moves the grade. Each step is {evidence_class, skill, tool, purpose, objects, window, degraded} — call that skill's tool, then submit the result with case_submit_evidence.
GOTCHAS: unavailable is the important half. A source this install
cannot reach is listed there with how_to_supply rather than left out, so
the gap is visible now instead of when the conclusion refuses to firm
up. An empty steps is never silent — note says whether everything
reachable is already in, or whether nothing here can be reached.
category_signals names the words that chose the category, and any
category that also matched — check it first, since the rest runs off
that one word.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | Yes | The case to plan for (from case_open/case_list). | |
| category | No | Force the symptom class instead of inferring it. Exactly one of: storage, network, compute, ha_drs, configuration, accelerator, kubernetes, hardware, host_lifecycle, power_lifecycle, auth, platform, licensing, data_collection. Omit to infer, then read `category_signals` for the word that decided it. | |
| max_steps | No | How many steps to return, at least 1. The default of 6 is two rounds across three evidence classes — enough to reach the two independent sources a Probable grade costs, without handing a model a fourteen-item menu it will work through. Raise it when `held_back` says there is more for this category; a storage case has fourteen reachable tools. Below 1 is refused rather than obeyed, because an empty plan already means "nothing left to fetch". | |
| available_skills | No | Narrow to the skills actually installed, in either spelling ("monitor" or "vmware-monitor"). Omit to assume all of them, which can produce steps this install cannot run. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with strong annotations (readOnly, idempotent, non-destructive), the description adds substantial behavioral detail: recomputation, routing around lost sources, the meaning of unavailable, and the guarantee that empty steps is never silent. This exceeds what annotations alone 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?
The structured sections (WHEN, RETURNS, GOTCHAS) front-load the purpose and every sentence adds operational value. Despite length, it is tightly organized 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 plan-generating tool with no output schema, the description fully specifies the return fields, per-step shape, how to proceed, and edge cases. An agent has enough to select and invoke the tool 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 100%, and the schema already explains case_id, category, max_steps, and available_skills in detail. The description reinforces workflow context but adds no new parameter-level semantics, so the baseline of 3 is appropriate.
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 'What to fetch next for this case — step 02, recomputed each call,' stating a specific verb and resource. This clearly identifies it as a plan-generation tool, distinct from siblings like case_get or case_timeline which retrieve existing state.
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?
WHEN explicitly says to call right after case_open and after each evidence round, and describes how the plan updates after submissions. It stops short of naming alternative tools or explicit exclusion cases, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_readinessARead-onlyIdempotent
[READ] What strength of conclusion can this environment reach?
WHEN: before starting an investigation, or when a case will not go higher and you want to know whether that is fixable. Answering this first is worth far more than discovering it halfway through.
RETURNS: {classes, categories, unrecognised_skills, note}. A name that
matched no skill in the catalogue comes back in unrecognised_skills
rather than being absorbed into "not installed" — otherwise a typo reads
as advice to install something you already have. Per evidence class:
whether it is
available, through which tools, and if not, how_to_supply. Per
symptom category (storage, network, compute, ha_drs, configuration,
accelerator, kubernetes, hardware, host_lifecycle, power_lifecycle,
auth, platform, licensing, data_collection): a ceiling and the
independent_sources behind it. There is deliberately no single score —
"readiness 78%" cannot be acted on, "storage reaches Probable, hardware
reaches Candidate" can.
GOTCHAS: two classes served by the SAME skill count as one source, so two available classes do not always mean Probable. The hardware class is unavailable no matter what is installed — nothing in this family reaches below ESXi — and the knowledge class becomes available only when entries are mounted under $OPS_HOME/knowledge/.
| Name | Required | Description | Default |
|---|---|---|---|
| available_skills | No | The skills actually installed and configured, in either of the family's spellings — "monitor" and "vmware-monitor" name the same thing. Omit to assume all of them, which reports the ceiling imposed by the family itself rather than by this install. A name matching no catalogued skill comes back in `unrecognised_skills` rather than being read as "not installed". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by detailing the return object fields, the unrecognised_skills behavior, the deliberately absent single score, the same-skill-counts-as-one-source gotcha, and the hardware/knowledge class conditions. It also explains why the behavior exists (typo would otherwise read as 'not installed'), which is genuinely useful 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 well-structured with [READ], WHEN, RETURNS, and GOTCHAS sections, front-loading the purpose and usage before the detailed behavior. The length is justified by the absence of an output schema and the complexity of the edge cases, and every section 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?
With no output schema, the description carries the full burden of explaining return values and edge cases, and it does so thoroughly: object shape, per-class availability, per-category ceilings and independent sources, plus the critical gotchas. For a read-only analysis tool with one optional parameter, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes the single optional parameter at 100% coverage, so the baseline is 3. The description adds value by explaining that unmatched names surface in `unrecognised_skills` rather than being treated as 'not installed', and by clarifying that omission reports the family-intrinsic ceiling. This is meaningful extra semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with [READ] and frames the tool as assessing 'what strength of conclusion can this environment reach', which is a clear, specific purpose. It identifies the invocation context ('before starting an investigation') and the scope of the output, distinguishing it from the case_* siblings without needing to name them.
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?
An explicit WHEN block gives two concrete triggers: before starting an investigation, or when a case will not go higher and the agent wants to know if that is fixable. It does not explicitly name alternatives among the sibling tools, but the timing and purpose are clear enough to prevent obvious misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_record_gapA
[WRITE] Record something the investigation could NOT obtain.
WHEN: any time a fetch failed, was refused, returned nothing, or the data simply does not exist in this environment. This is the tool that keeps a case honest: an unrecorded gap makes it look better supported than it is.
RETURNS: {case_id, gap_id, grade, reasons}.
GOTCHAS: recording a gap does not punish the case for the evidence it does have — a missing confirmation caps the grade, it does not demote it. Writing gaps down is meant to be free.
| Name | Required | Description | Default |
|---|---|---|---|
| why | Yes | Why it could not be had — refused, unreachable, collected by nothing in this family, absent from this environment. | |
| what | Yes | The observation that could not be obtained — the thing you wanted, not the error you got. | |
| blocks | No | Hypothesis ids (H1, H2, …) this gap holds up; they must already exist via case_hypotheses. Empty is fine. | |
| case_id | Yes | The case this gap belongs to (from case_open/case_list). | |
| how_to_close | Yes | The next action that would close it, even outside this system ("open a vendor SR"). A gap with no stated next action reads like a to-do and gets skipped. | |
| could_falsify | No | Would OBTAINING this be able to prove the hypothesis WRONG? false (default) is the ordinary case — missing corroboration, capping the case below Confirmed. true means it could overturn the hypothesis, holding it at Candidate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' bare flags, the description discloses the write nature with '[WRITE]', the return shape {case_id, gap_id, grade, reasons}, and a key side-effect nuance: a recorded gap caps the grade but does not demote it. This meaningfully helps the agent predict consequences beyond what annotations alone provide. No contradiction with the annotations exists.
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 organized with WHEN, RETURNS, and GOTCHAS sections, front-loading the core action and keeping every line purposeful. It is concise without losing essential behavioral nuance.
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 mutating tool with no output schema, the description supplies the return fields and the critical grade-cap behavior. Combined with the fully documented input schema, an agent has everything needed to invoke the tool correctly and understand its consequences.
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 100% and each parameter already has rich semantic text, so the baseline is 3. The description adds little parameter-level meaning beyond the schema; its RETURNS line helps with output understanding but not with parameter semantics.
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: 'Record something the investigation could NOT obtain.' This clearly distinguishes it from sibling tools like case_submit_evidence, which record evidence the case does have, and case_grade, which grades the case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is provided: 'any time a fetch failed, was refused, returned nothing, or the data simply does not exist in this environment.' It does not explicitly name alternatives or when-not-to-use cases, but the context is clear enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_submit_evidenceA
[WRITE] Record one retrieved fact — steps 02/03 of the evidence loop.
WHEN: after every read-tool call you intend to reason from.
RETURNS: {case_id, evidence_id, payload_events, payload_note, grade, reasons} — the resulting grade, so you need no second call to see whether this changed anything, and what the payload was read as, so a summary submitted in place of a result is visible here rather than as a zero from case_timeline later.
GOTCHAS: a fetch that failed or came back empty goes to case_record_gap, not here.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | The exact parameters the tool was called with, so it can be re-run. Omit only if there genuinely were none. | |
| case_id | Yes | The case this fact belongs to (from case_open/case_list). Required. | |
| payload | No | The read tool's RAW result, not a summary. For its events to reach case_timeline it must be a list of event dicts, or carry them under 'items', 'events' or 'rows'. What was found comes back as payload_events/payload_note. | |
| summary | Yes | What this item shows, one line. | |
| falsifies | No | Hypothesis ids (H1, H2, …) this observation RULES OUT — the only route to Excluded; "we looked and found nothing" is a gap, not an exclusion. Ids must already exist via case_hypotheses; an unregistered id is refused and nothing is written. | |
| fetched_at | No | When the fetch happened, ISO-8601. Omit to stamp now — wrong for an item transcribed from earlier. | |
| window_end | No | End of the period the data covers, ISO-8601. | |
| source_tool | Yes | The tool within that skill, e.g. "get_events". Required, non-blank — "monitor said so" is not reproducible. | |
| time_source | No | Whose clock stamped it — "vcenter", "host" or "client". Recorded so a reader can judge whether two sources' timestamps compare; nothing in this release corrects for it. Null when unknown, never a guess. | |
| clock_skew_s | No | Known offset of that clock from UTC, in seconds. Recorded, likewise not applied. Null when unknown. | |
| source_skill | Yes | The skill that produced it, as the family spells it — "vmware-monitor", "vmware-aria", "vmware-log-insight". Required, non-blank. Two items from the SAME skill count as ONE source when corroboration is counted, so this string decides whether the case can reach Probable. Two reserved values name the knowledge layer instead: "knowledge-kb" and "knowledge-sr", the only sources that can be decisive. | |
| window_start | No | Start of the period the DATA COVERS, ISO-8601 — not when it was fetched. get_events(hours=24) run at 10:00 and at | |
| knowledge_entry_id | No | Which mounted knowledge entry this item IS. REQUIRED when source_skill is knowledge-kb or knowledge-sr — without it the entry's applies_to cannot be checked, so it counts as ordinary support and can never make the case Confirmed. case_knowledge lists what is mounted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is not read-only, and the description adds [WRITE] plus meaningful context: it returns the resulting grade, shows what the payload was read as, and explains that a summary submitted in place of a result will be visible rather than appearing as a zero later. This goes beyond the annotation flags in a useful way.
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 structured with labeled sections: [WRITE], WHEN, RETURNS, GOTCHAS. It is front-loaded with the core purpose and every sentence adds either usage guidance, return semantics, or an exclusion rule. 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?
Despite having 13 parameters and no output schema, the description covers the essential operational context: when to call it, what it returns, how the payload is interpreted, and where failures belong. Combined with the fully described schema, an agent has enough to invoke this tool 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 100%, so the baseline is 3. The description itself does not add much parameter-level detail beyond what the schema already provides, though it does contextualize the summary field's role in the return behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Record one retrieved fact — steps 02/03 of the evidence loop.' It also distinguishes itself from the sibling case_record_gap in the GOTCHAS section, so an agent can tell this is for successful evidence, not failed or empty fetches.
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 explicitly says WHEN to use it: 'after every read-tool call you intend to reason from.' It also gives an exclusion rule: a fetch that failed or came back empty goes to case_record_gap, not here. This is clear routing guidance with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_timelineA
[WRITE] Correlate everything this case has collected — steps 04/05.
WHEN: once evidence is in. Unlike incident_timeline, this takes no events: it reads the payloads already submitted, so the result is reproducible from the case folder alone months later, on a machine with access to nothing.
RETURNS: {event_count, window, binning, classification, spikes, spikes_total, hypotheses, evidence_without_events, evidence_without_events_detail, rejected, note} and writes timeline.md.
GOTCHAS: note distinguishes three states that all show zero events —
no evidence submitted at all, evidence that carried none, and a genuinely
quiet window — and names which items carried none, with what they held
instead. rejected names any row that could not be read, with the
evidence item it came from; dropping those silently would shrink the
picture the conclusion rests on. Submit a read tool's raw result as
payload for its events to reach here — a summary of the result carries
no rows, and case_submit_evidence says so at the time.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | How many ranked hypotheses come back (default 5). Spikes are capped separately at 20, true count in 'spikes_total'. | |
| case_id | Yes | The case whose submitted payloads are correlated (from case_open/case_list). Unlike incident_timeline this takes no events — everything comes from the case folder. | |
| bin_seconds | No | Time-bin width in seconds. Omit and it is chosen from event density (ladder 1..86400, finest width still averaging 4 events per bin); `binning` reports which was used. | |
| z_threshold | No | Standard deviations above the mean bin count that mark a spike (default 2.0). Under 3 bins, or a flat series, yields none at any threshold. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries the full behavioral burden. It discloses it writes timeline.md (consistent with readOnlyHint=false), explains the tool's reproducibility from the case folder alone, and details the `note` and `rejected` fields, including the three zero-event states and consequences of silent row drops. No annotation contradiction.
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?
Organized into clear sections (WHEN, RETURNS, GOTCHAS) with the core purpose front-loaded. Every sentence carries weight—no fluff—and the length is justified by the density of critical operational details.
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 correlation tool without an output schema, the description lists all return fields and explains nuanced behaviors (note, rejected, spike thresholds). It covers usage prerequisites, input expectations, and gotchas, making it self-sufficient for an agent to call accurately.
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 100%, so baseline is 3. The description adds meaningful context for `case_id` (source from case_open/case_list, contrast with incident_timeline) and clarifies expected payload format for events (though that's more usage than parameter-specific). Modest value over schema, but not extensive, warranting a 4.
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 '[WRITE] Correlate everything this case has collected — steps 04/05,' stating a specific verb, resource, and workflow step. It clearly distinguishes itself from incident_timeline by emphasizing it takes no events and reads submitted payloads, leaving no ambiguity about its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit WHEN guidance ('once evidence is in') and a direct contrast with incident_timeline ('Unlike incident_timeline, this takes no events'). It also gives actionable instructions on how to feed the tool ('Submit a read tool's raw result as `payload`') and cautions against using summaries (which carry no rows), fully covering when and how to use it vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
incident_timelineARead-onlyIdempotent
[READ] Correlate already-fetched VMware events into one incident view.
WHEN: use this after you've pulled events for an incident from the data-source skills (vmware-monitor get_events/get_alarms, vmware-aria list_alerts/list_anomalies, vmware-log-insight log_search/log_aggregate, vmware-nsx) — feed them here to find what correlates and where to look next. Not sure which events to pull? Run list_symptom_categories first. This tool does NOT fetch anything itself.
RETURNS: {event_count, window, binning, classification, spikes
(strongest anomalous bins), spikes_total, hypotheses (ranked
root-cause candidates, each with a suggested_check), next_checks (which
skill/tool to run next)}. Read binning for the resolution you were
given, and classification for how much of the stream matched nothing —
the ranking describes only the part that did.
GOTCHAS: read-only, stateless, no network — nothing is executed. Remediation routes to vmware-aiops (single fix) or vmware-pilot (multi-step). A malformed event returns {error, hint} naming the offending index.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | How many ranked hypotheses come back (default 5). Spikes are capped separately at 20, true count in 'spikes_total'. | |
| events | Yes | Event envelopes, each {ts, source, severity, entity, text, fields}. ts may be ISO-8601, epoch seconds or epoch millis and is required; severity is normalised onto critical/error/warning/ info/unknown, so vendor spellings (fatal, red, warn, yellow, notice, green) are accepted. An entry that cannot be normalised is refused with its index, not skipped. Keep each event's event_type in fields — vmware-monitor's get_events returns it, and the symptom classifier matches it alongside the message. On a modern EventEx the message is generic boilerplate and the eventTypeId is the only thing that says what happened, so dropping it turns a readable event into an uncategorized one. | |
| bin_seconds | No | Time-bin width in seconds. Omit and it is chosen from event density off the ladder 1/10/60/300/900/3600/21600/86400, taking the finest width still averaging 4 events per bin. | |
| z_threshold | No | Standard deviations above the mean bin count that mark a spike (default 2.0). Under 3 bins, or a flat series, yields none at any threshold — empty spikes is not "calm". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/destructive-safe, but the description adds concrete behavioral context beyond them: stateless, no network, nothing executed, malformed events return {error, hint} with the offending index. This is substantial added value rather than a restatement of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is organized into labeled sections (WHEN, RETURNS, GOTCHAS) with the core purpose front-loaded. Every sentence adds operational information; there is no filler or repetition of schema fields.
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 no output schema, the description fully covers return shape, binned resolution semantics, ranking interpretation, error behavior, and onward routing. Nothing an agent needs to call this tool correctly and interpret 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 coverage is 100%, but the description enriches parameters meaningfully: event normalization rules, required event_type retention, bin selection ladder, and the z_threshold flat-series caveat ('empty spikes is not calm'). These details materially change how an agent should populate and interpret parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Correlate already-fetched VMware events into one incident view.' It clearly differentiates itself from fetching tools by stating it does NOT fetch anything itself, and orients the agent toward sibling list_symptom_categories for prior steps.
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?
A dedicated WHEN section explicitly says to use this after pulling events from named data-source skills, and tells the agent what to do when unsure which events to pull (run list_symptom_categories first). It also routes remediation to specific siblings, leaving no ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_symptom_categoriesARead-onlyIdempotent
[READ] List the symptom categories vmware-debug recognises, each with example keywords and a suggested next check (which skill/tool to run). Takes no parameters. Use this when you don't yet know what to look at — it turns "something's wrong" into concrete investigation steps. Then gather the events those checks name and pass them to incident_timeline. Returns the family list envelope {items, returned, limit, total, truncated, hint}; each item is {category, example_keywords, suggested_check}. The routing table is a fixed constant, so truncated is always false and total exact — this is every category, not a page. Read-only; no network access.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description adds valuable context beyond that: 'Read-only; no network access' and explains that the routing table is a fixed constant, so truncated is always false and total exact. This tells the agent the result is deterministic and complete, not paginated—exactly what it needs to trust the output.
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 a single dense paragraph but front-loaded with the core purpose, then usage, then return format. Each sentence earns its place—there's no fluff. It's slightly longer than the minimum but the length is justified by the need to explain the deterministic nature and the follow-up step. Structure is logical and easily parsed.
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 tool with no parameters and no output schema, the description covers all necessary context: the purpose, the usage trigger, the exact return envelope with field names, and the note about total exactness. It even explains how to use the output (pass events to incident_timeline). An agent would have everything needed to call this tool correctly and interpret its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the description explicitly states 'Takes no parameters,' which matches the schema. Since there is nothing to elaborate, the description fully covers the parameter surface. No additional meaning is needed, and the description goes beyond by explaining the return envelope, though that's more behavioral than parameter-specific.
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 specific action (List) and resource (symptom categories) and elaborates on content: example keywords and a suggested next check. It clearly differentiates this from sibling incident_timeline by framing it as the initial triage step, so an agent can distinguish it without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger: 'Use this when you don't yet know what to look at.' It also gives a concrete follow-up flow—'gather the events those checks name and pass them to incident_timeline'—which tells the agent exactly when to use this tool and how it feeds into the broader investigation workflow.
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.
14 tool updates
v1.13.0- Changed
case_close1 field changed- changed
Input schema / titlePrevious value: -"_case_close_implArguments"New value: +"case_closeArguments"
- Changed
case_get1 field changed- changed
Input schema / titlePrevious value: -"_case_get_implArguments"New value: +"case_getArguments"
- Changed
case_grade1 field changed- changed
Input schema / titlePrevious value: -"_case_grade_implArguments"New value: +"case_gradeArguments"
- Changed
case_hypotheses1 field changed- changed
Input schema / titlePrevious value: -"_case_hypotheses_implArguments"New value: +"case_hypothesesArguments"
- Changed
case_knowledge1 field changed- changed
Input schema / titlePrevious value: -"_case_knowledge_implArguments"New value: +"case_knowledgeArguments"
- Changed
case_list1 field changed- changed
Input schema / titlePrevious value: -"_case_list_implArguments"New value: +"case_listArguments"
- Changed
case_open1 field changed- changed
Input schema / titlePrevious value: -"_case_open_implArguments"New value: +"case_openArguments"
- Changed
case_plan3 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Force the symptom class instead of inferring it. Exactly one of: storage, network, compute, ha_drs, configuration, accelerator, kubernetes, hardware, host_lifecycle, power_lifecycle, auth, platform. Omit to infer, then read `category_signals` for the word that decided it."New value: +"Force the symptom class instead of inferring it. Exactly one of: storage, network, compute, ha_drs, configuration, accelerator, kubernetes, hardware, host_lifecycle, power_lifecycle, auth, platform, licensing, data_collection. Omit to infer, then read `category_signals` for the word that decided it." - changed
Input schema / properties / max_steps / descriptionPrevious value: -"HAS NO EFFECT in this release — accepted but never forwarded to the planner, which always caps at 6. The result's note may still advise raising it; doing so changes nothing. Read `held_back` for how many steps were cut."New value: +"How many steps to return, at least 1. The default of 6 is two rounds across three evidence classes — enough to reach the two independent sources a Probable grade costs, without handing a model a fourteen-item menu it will work through. Raise it when `held_back` says there is more for this category; a storage case has fourteen reachable tools. Below 1 is refused rather than obeyed, because an empty plan already means \"nothing left to fetch\"." - changed
Input schema / titlePrevious value: -"_case_plan_implArguments"New value: +"case_planArguments"
- Changed
case_readiness1 field changed- changed
Input schema / titlePrevious value: -"_case_readiness_implArguments"New value: +"case_readinessArguments"
- Changed
case_record_gap1 field changed- changed
Input schema / titlePrevious value: -"_case_record_gap_implArguments"New value: +"case_record_gapArguments"
- Changed
case_submit_evidence1 field changed- changed
Input schema / titlePrevious value: -"_case_submit_evidence_implArguments"New value: +"case_submit_evidenceArguments"
- Changed
case_timeline1 field changed- changed
Input schema / titlePrevious value: -"_case_timeline_implArguments"New value: +"case_timelineArguments"
- Changed
incident_timeline2 fields changed- changed
Input schema / properties / events / descriptionPrevious value: -"Event envelopes, each {ts, source, severity, entity, text, fields}. ts may be ISO-8601, epoch seconds or epoch millis and is required; severity is normalised onto critical/error/warning/ info/unknown, so vendor spellings (fatal, red, warn, yellow, notice, green) are accepted. An entry that cannot be normalised is refused with its index, not skipped."New value: +"Event envelopes, each {ts, source, severity, entity, text, fields}. ts may be ISO-8601, epoch seconds or epoch millis and is required; severity is normalised onto critical/error/warning/ info/unknown, so vendor spellings (fatal, red, warn, yellow, notice, green) are accepted. An entry that cannot be normalised is refused with its index, not skipped. Keep each event's event_type in fields — vmware-monitor's get_events returns it, and the symptom classifier matches it alongside the message. On a modern EventEx the message is generic boilerplate and the eventTypeId is the only thing that says what happened, so dropping it turns a readable event into an uncategorized one." - changed
Input schema / titlePrevious value: -"_incident_timeline_implArguments"New value: +"incident_timelineArguments"
- Changed
list_symptom_categories1 field changed- changed
Input schema / titlePrevious value: -"_list_symptom_categories_implArguments"New value: +"list_symptom_categoriesArguments"
14 tool updates
v1.11.1- Added
case_close - Added
case_get - Added
case_grade - Added
case_hypotheses - Added
case_knowledge - Added
case_list - Added
case_open - Added
case_plan - Added
case_readiness - Added
case_record_gap - Added
case_submit_evidence - Added
case_timeline - Changed
incident_timeline5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / bin_seconds / descriptionAdded value: +"Time-bin width in seconds. Omit and it is chosen from event density off the ladder 1/10/60/300/900/3600/21600/86400, taking the finest width still averaging 4 events per bin." - added
Input schema / properties / events / descriptionAdded value: +"Event envelopes, each {ts, source, severity, entity, text, fields}. ts may be ISO-8601, epoch seconds or epoch millis and is required; severity is normalised onto critical/error/warning/ info/unknown, so vendor spellings (fatal, red, warn, yellow, notice, green) are accepted. An entry that cannot be normalised is refused with its index, not skipped." - added
Input schema / properties / top_n / descriptionAdded value: +"How many ranked hypotheses come back (default 5). Spikes are capped separately at 20, true count in 'spikes_total'." - added
Input schema / properties / z_threshold / descriptionAdded value: +"Standard deviations above the mean bin count that mark a spike (default 2.0). Under 3 bins, or a flat series, yields none at any threshold — empty spikes is not \"calm\"."
- Changed
list_symptom_categories1 field changed- added
Input schema / additionalPropertiesAdded value: +false
2 tool updates
v1.8.8- First observed
incident_timeline - First observed
list_symptom_categories
TDQS
Scored across 14 tools
Tools are mostly distinct: case lifecycle tools, evidence submission, gap recording, and timeline correlation each have clear purposes. Minor potential confusion exists between case_timeline and incident_timeline, and between case_hypotheses and case_submit_evidence, but descriptions clarify the boundaries well.
The consistent `case_` prefix and snake_case naming provide predictability. However, the second element mixes nouns (timeline, hypotheses, readiness) with verbs (open, close, list, get), and two tools (incident_timeline, list_symptom_categories) don't follow the prefix pattern. Still readable and mostly coherent.
14 tools is well within the ideal range for an investigation-focused server. Each tool serves a distinct function in the case lifecycle or incident correlation, with no obvious redundancy. The count feels appropriate for the breadth of the domain.
The tool surface covers the full investigation workflow: case creation, planning, evidence submission, gap recording, hypothesis management, grading, closing, and post-hoc retrieval. It also handles readiness assessment and knowledge mounting. No critical operations are missing within the server's stated scope.
Maintenance
Related MCP Connectors
Discover software problems, analyze evidence, and create implementation-ready Build plans.
- causelyOAuthapp.causely
Causal reasoning for reliability: root cause, blast radius, and service health for agents.
Triage failing GitHub Actions jobs and see what self-heal repaired, in natural language.
Search log events, investigate anomalies, and manage cases in your Knowledge Grid tenant.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables natural language interaction with VMware SDDC Manager and vCenter APIs through MCP tools, allowing users to query workload domains, VMs, clusters, and more.MIT
- FlicenseNot gradedqualityBmaintenanceProvides telemetry tools for retrieving recent logs and system metrics to support root-cause analysis of infrastructure incidents. Enables autonomous incident triage with grounded verification and human-in-the-loop remediation.1-
- AlicenseNot gradedqualityCmaintenanceMCP server that diagnoses ML model regressions by correlating drift reports, eval runs, and deploy logs, providing evidence-cited incident reports through a set of investigation tools.1MIT
- FlicenseNot gradedqualityAmaintenanceEnables users to investigate infrastructure incidents in plain English, correlate observability and deploy data with runbooks, and get evidence-backed root-cause proposals with approval-gated remediation.5-