Skip to main content
Glama
vmware-skills

VMware-Monitor

VMware Monitor

Author: Wei Zhou, VMware by Broadcom — wei-wz.zhou@broadcom.com This is a community-driven project by a VMware engineer, not an official VMware product. For official VMware developer tools see developer.broadcom.com.

English | 中文

Read-only VMware vCenter/ESXi monitoring — 8 tools, code-level safety. No destructive operations exist in this codebase.

Why a separate repository? VMware Monitor is fully independent from VMware-AIops. Safety is enforced at the code level: no power off, delete, create, reconfigure, snapshot-create/revert/delete, clone, or migrate functions exist in this codebase. Not just prompt constraints — zero destructive code paths.

ClawHub Skills.sh Claude Code Marketplace License: MIT

Companion Skills

Skill

Scope

Tools

Install

vmware-aiops ⭐ entry point

VM lifecycle, deployment, guest ops, clusters

31

uv tool install vmware-aiops

vmware-storage

Datastores, iSCSI, vSAN

11

uv tool install vmware-storage

vmware-vks

Tanzu Namespaces, TKC cluster lifecycle

20

uv tool install vmware-vks

vmware-nsx

NSX networking: segments, gateways, NAT, IPAM

31

uv tool install vmware-nsx-mgmt

vmware-nsx-security

DFW microsegmentation, security groups, Traceflow

20

uv tool install vmware-nsx-security

vmware-aria

Aria Ops metrics, alerts, capacity planning

18

uv tool install vmware-aria

Works with Claude Code, Cursor, Codex, Gemini CLI, Trae, and 30+ AI agents:

# Via Skills.sh
npx skills add zw008/VMware-Monitor

# Via ClawHub
clawhub install vmware-monitor

PyPI Install (No GitHub Access Required)

# Install via uv (recommended)
uv tool install vmware-monitor

# Or via pip
pip install vmware-monitor

# China mainland mirror (faster)
pip install vmware-monitor -i https://pypi.tuna.tsinghua.edu.cn/simple

Claude Code Plugin Install

# Add marketplace
/plugin marketplace add zw008/VMware-Monitor

# Install plugin
/plugin install vmware-monitor

# Use the skill
/vmware-monitor:vmware-monitor

Capabilities (Read-Only)

Architecture

User (Natural Language)
  ↓
AI CLI Tool (Claude Code / Gemini / Codex / Aider / Continue / Trae / Kimi)
  ↓ Reads SKILL.md / AGENTS.md / rules
  ↓
vmware-monitor CLI (read-only)
  ↓ pyVmomi (vSphere SOAP API)
  ↓
vCenter Server ──→ ESXi Clusters ──→ VMs
    or
ESXi Standalone ──→ VMs

Version Compatibility

vSphere Version

Support

Notes

8.0 / 8.0U1-U3

✅ Full

pyVmomi 8.0.3+

7.0 / 7.0U1-U3

✅ Full

All read-only APIs supported

6.7

✅ Compatible

Backward-compatible, tested

6.5

✅ Compatible

Backward-compatible, tested

1. Inventory

Feature

vCenter

ESXi

Details

List VMs

Name, power state, CPU, memory, guest OS, IP

List Hosts

⚠️ Self only

CPU cores, memory, ESXi version, VM count, uptime

List Datastores

Capacity, free/used, type (VMFS/NFS), usage %

List Clusters

Host count, DRS/HA status

List Networks

Network name, associated VM count

2. Health & Monitoring

Feature

vCenter

ESXi

Details

Active Alarms

Severity, alarm name, entity, timestamp

Event/Log Query

Filter by time range, severity; 50+ event types

Hardware Sensors

Temperature, voltage, fan status

Host Services

hostd, vpxa running/stopped status

Monitored Event Types:

Category

Events

VM Failures

VmFailedToPowerOnEvent, VmDiskFailedEvent, VmFailoverFailed

Host Issues

HostConnectionLostEvent, HostShutdownEvent, HostIpChangedEvent

Storage

DatastoreCapacityIncreasedEvent, SCSI high latency

HA/DRS

DasHostFailedEvent, DrsVmMigratedEvent, DrsSoftRuleViolationEvent

Auth

UserLoginSessionEvent, BadUsernameSessionEvent

3. VM Info & Snapshot List (Read-Only)

Feature

Details

VM Info

Name, power state, guest OS, CPU, memory, IP, VMware Tools, disks, NICs

Snapshot List

List existing snapshots with name and creation time (no create/revert/delete)

4. Scheduled Scanning & Notifications

Feature

Details

Daemon

APScheduler-based, configurable interval (default 15 min)

Multi-target Scan

Sequentially scan all configured vCenter/ESXi targets

Scan Content

Alarms + Events + Host logs (hostd, vmkernel, vpxd)

Log Analysis

Regex pattern matching: error, fail, critical, panic, timeout

Structured Log

JSONL output to ~/.vmware-monitor/scan.log

Webhook

Slack, Discord, or any HTTP endpoint

Daemon Management

daemon start/stop/status, PID file, graceful shutdown

5. Safety Features

Feature

Details

Code-Level Isolation

Independent repository — zero destructive functions in codebase

Audit Trail

All queries logged to ~/.vmware-monitor/audit.log (JSONL)

Password Protection

.env file loading with permission check (warn if not 600)

SSL Self-signed Support

disableSslCertValidation — only for ESXi with self-signed certs in isolated labs; production should use CA-signed certificates

Prompt Injection Protection

vSphere event messages and host logs are truncated, sanitized, and wrapped in boundary markers

Webhook Data Scope

Sends monitoring summaries to user-configured URLs only — no third-party services by default

Production Recommended

AI agents can misinterpret context and execute unintended destructive operations — real-world incidents have shown AI-driven tools deleting production databases and entire environments. VMware-Monitor eliminates this risk: no destructive code paths exist. Use VMware-AIops only in dev/lab environments

What's NOT Included (By Design)

These operations do not exist in this repository:

  • ❌ Power on/off, reset, suspend VMs

  • ❌ Create, delete, reconfigure VMs

  • ❌ Create, revert, delete snapshots

  • ❌ Clone or migrate VMs

  • _double_confirm, _show_state_preview, _validate_vm_params

For these operations, use the full VMware-AIops repository.


Related MCP server: VMWare MCP

Common Workflows

Daily Health Check

  1. Check alarms: vmware-monitor health alarms --target prod-vcenter

  2. Review recent events: vmware-monitor health events --hours 24 --severity warning

  3. List hosts: vmware-monitor inventory hosts — check connection state and memory usage

Investigate a Specific VM

  1. Find the VM: vmware-monitor inventory vms --power-state poweredOff

  2. Get details: vmware-monitor vm info problem-vm

  3. Check related events: vmware-monitor health events --hours 48

Set Up Continuous Monitoring

  1. Configure webhook in ~/.vmware-monitor/config.yaml

  2. Start daemon: vmware-monitor daemon start

  3. Daemon scans every 15 min, sends alerts to Slack/Discord


Troubleshooting

Alarms returns empty but vCenter shows alarms

The get_alarms tool queries triggered alarms at the root folder level. Some alarms are entity-specific — try checking events instead: vmware-monitor health events --hours 1 --severity info.

"Connection refused" error

  1. Run vmware-monitor doctor to diagnose

  2. Verify target hostname/IP and port (443) in config.yaml

  3. For self-signed certs: set disableSslCertValidation: true

Events returns too many results

Use severity filter: --severity warning (default) filters out info-level events. Use --hours 4 to narrow the time range.

VM info shows "guest_os: unknown"

VMware Tools not installed or not running in the guest. Install/start VMware Tools for guest OS detection, IP address, and guest family info.

Doctor passes but commands fail with timeout

vCenter may be under heavy load. Try targeting a specific ESXi host directly instead of vCenter, or increase connection timeout in config.yaml.


Supported AI Platforms

Platform

Status

Config File

AI Model

Claude Code

✅ Native Skill

skills/vmware-monitor/SKILL.md

Anthropic Claude

Gemini CLI

✅ Extension

gemini-extension/GEMINI.md

Google Gemini

OpenAI Codex CLI

✅ Skill + AGENTS.md

codex-skill/AGENTS.md

OpenAI GPT

Aider

✅ Conventions

codex-skill/AGENTS.md

Any (cloud + local)

Continue CLI

✅ Rules

codex-skill/AGENTS.md

Any (cloud + local)

Trae IDE

✅ Rules

trae-rules/project_rules.md

Claude/DeepSeek/GPT-4o

Kimi Code CLI

✅ Skill

kimi-skill/SKILL.md

Moonshot Kimi

MCP Server

✅ MCP Protocol

mcp_server/

Any MCP client

Python CLI

✅ Standalone

N/A

N/A

Platform Comparison

Feature

Claude Code

Gemini CLI

Codex CLI

Aider

Continue

Trae IDE

Kimi CLI

Cloud AI

Anthropic

Google

OpenAI

Any

Any

Multi

Moonshot

Local models

Ollama

Ollama

Skill system

SKILL.md

Extension

SKILL.md

Rules

Rules

SKILL.md

MCP support

Native

Native

Via Skills

Third-party

Native

Free tier

60 req/min

Self-hosted

Self-hosted

MCP Server Integrations

The vmware-monitor MCP server works with any MCP-compatible agent or tool. Ready-to-use configuration templates are in examples/mcp-configs/. All 8 tools are read-only — code-level enforced safety.

Agent / Tool

Local Model Support

Config Template

Integration Guide

Goose

✅ Ollama, LM Studio

goose.json

Guide

LocalCowork

✅ Fully offline

localcowork.json

Guide

mcp-agent

✅ Ollama, vLLM

mcp-agent.yaml

Guide

VS Code Copilot

vscode-copilot.json

Guide

Cursor

cursor.json

Continue

✅ Ollama

continue.yaml

Guide

Claude Code

claude-code.json

Fully local operation (no cloud API required):

# Aider + Ollama + vmware-monitor (via AGENTS.md)
aider --conventions codex-skill/AGENTS.md --model ollama/qwen2.5-coder:32b

# Any MCP agent + local model + vmware-monitor MCP server
# See examples/mcp-configs/ for your agent's config format

Installation

Step 0: Prerequisites

# Python 3.10+ required
python3 --version

# Node.js 18+ required for Gemini CLI and Codex CLI
node --version

Step 1: Clone & Install Python Backend

git clone https://github.com/zw008/VMware-Monitor.git
cd VMware-Monitor
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

Step 2: Configure

mkdir -p ~/.vmware-monitor
cp config.example.yaml ~/.vmware-monitor/config.yaml
# Edit config.yaml with your vCenter/ESXi targets

Set passwords via .env file (recommended):

cp .env.example ~/.vmware-monitor/.env
chmod 600 ~/.vmware-monitor/.env
# Edit and fill in your passwords

Security note: Prefer .env file over command-line export to avoid passwords appearing in shell history. config.yaml stores only hostnames, ports, and a reference to the .env file — it does not contain passwords or tokens. All secrets are stored exclusively in .env (chmod 600). Webhook notifications are disabled by default; when enabled, payloads contain no credentials, IPs, or PII — only aggregated alert metadata sent to user-configured URLs only. We recommend using a least-privilege read-only vCenter service account.

Password environment variable naming convention:

VMWARE_{TARGET_NAME_UPPER}_PASSWORD
# Replace hyphens with underscores, UPPERCASE
# Example: target "home-esxi" → VMWARE_HOME_ESXI_PASSWORD
# Example: target "prod-vcenter" → VMWARE_PROD_VCENTER_PASSWORD

Step 3: Connect Your AI Tool

Choose one (or more) of the following:


Option A: Claude Code (Marketplace)

Method 1: Marketplace (recommended)

In Claude Code, run:

/plugin marketplace add zw008/VMware-Monitor
/plugin install vmware-monitor

Then use:

/vmware-monitor:vmware-monitor
> Show me all VMs on esxi-lab.example.com

Method 2: Local install

# Clone and symlink
git clone https://github.com/zw008/VMware-Monitor.git
ln -sf $(pwd)/VMware-Monitor ~/.claude/plugins/marketplaces/vmware-monitor

# Register marketplace
python3 -c "
import json, pathlib
f = pathlib.Path.home() / '.claude/plugins/known_marketplaces.json'
d = json.loads(f.read_text()) if f.exists() else {}
d['vmware-monitor'] = {
    'source': {'source': 'github', 'repo': 'zw008/VMware-Monitor'},
    'installLocation': str(pathlib.Path.home() / '.claude/plugins/marketplaces/vmware-monitor')
}
f.write_text(json.dumps(d, indent=2))
"

# Enable plugin
python3 -c "
import json, pathlib
f = pathlib.Path.home() / '.claude/settings.json'
d = json.loads(f.read_text()) if f.exists() else {}
d.setdefault('enabledPlugins', {})['vmware-monitor@vmware-monitor'] = True
f.write_text(json.dumps(d, indent=2))
"

Restart Claude Code, then:

/vmware-monitor:vmware-monitor

Option B: Gemini CLI

# Install Gemini CLI
npm install -g @google/gemini-cli

# Install the extension from the cloned repo
gemini extensions install ./gemini-extension

# Or install directly from GitHub
# gemini extensions install https://github.com/zw008/VMware-Monitor

Then start Gemini CLI:

gemini
> Show me all VMs on my ESXi host

Option C: OpenAI Codex CLI

# Install Codex CLI
npm i -g @openai/codex
# Or on macOS:
# brew install --cask codex

# Copy skill to Codex skills directory
mkdir -p ~/.codex/skills/vmware-monitor
cp codex-skill/SKILL.md ~/.codex/skills/vmware-monitor/SKILL.md

# Copy AGENTS.md to project root
cp codex-skill/AGENTS.md ./AGENTS.md

Then start Codex CLI:

codex --enable skills
> List all VMs on my ESXi

Option D: Aider (supports local models)

# Install Aider
pip install aider-chat

# Install Ollama for local models (optional)
# macOS:
brew install ollama
ollama pull qwen2.5-coder:32b

# Run with cloud API
aider --conventions codex-skill/AGENTS.md

# Or with local model via Ollama
aider --conventions codex-skill/AGENTS.md \
  --model ollama/qwen2.5-coder:32b

Option E: Continue CLI (supports local models)

# Install Continue CLI
npm i -g @continuedev/cli

# Copy rules file
mkdir -p .continue/rules
cp codex-skill/AGENTS.md .continue/rules/vmware-monitor.md

Configure ~/.continue/config.yaml for local model:

models:
  - name: local-coder
    provider: ollama
    model: qwen2.5-coder:32b

Then:

cn
> Check ESXi health and alarms

Option F: Trae IDE

Copy the rules file to your project's .trae/rules/ directory:

mkdir -p .trae/rules
cp trae-rules/project_rules.md .trae/rules/project_rules.md

Trae IDE's Builder Mode reads .trae/rules/ Markdown files at startup.

Note: You can also install Claude Code extension in Trae IDE and use .claude/skills/ format directly.


Option G: Kimi Code CLI

# Copy skill file to Kimi skills directory
mkdir -p ~/.kimi/skills/vmware-monitor
cp kimi-skill/SKILL.md ~/.kimi/skills/vmware-monitor/SKILL.md

Option H: MCP Server (Smithery / Glama / Claude Desktop)

The MCP server exposes VMware read-only monitoring as tools via the Model Context Protocol. Works with any MCP-compatible client (Claude Desktop, Cursor, etc.).

After uv tool install vmware-monitor, start the MCP server with one command (v1.5.15+):

# Recommended — single command, no network re-resolve
vmware-monitor mcp

# With a custom config path
VMWARE_MONITOR_CONFIG=/path/to/config.yaml vmware-monitor mcp

Claude Desktop config (claude_desktop_config.json):

{
  "mcpServers": {
    "vmware-monitor": {
      "command": "vmware-monitor",
      "args": ["mcp"],
      "env": {
        "VMWARE_MONITOR_CONFIG": "/path/to/config.yaml"
      }
    }
  }
}
# Run without installing (requires PyPI access each launch)
uvx --from vmware-monitor vmware-monitor mcp

# Legacy entry point (still works, kept for backward compatibility)
vmware-monitor-mcp

Behind a corporate TLS proxy? uvx may fail with invalid peer certificate: UnknownIssuer. Use the recommended vmware-monitor mcp form above (no network needed), or set UV_NATIVE_TLS=true.

Install via Smithery:

npx -y @smithery/cli install @zw008/VMware-Monitor --client claude

Option I: Standalone CLI (no AI)

# Already installed in Step 1
source .venv/bin/activate

vmware-monitor inventory vms --target home-esxi
vmware-monitor health alarms --target home-esxi
vmware-monitor vm info my-vm --target home-esxi

Update / Upgrade

Already installed? Re-run the install command for your channel to get the latest version:

Install Channel

Update Command

ClawHub

clawhub install vmware-monitor

Skills.sh

npx skills add zw008/VMware-Monitor

Claude Code Plugin

/plugin marketplace add zw008/VMware-Monitor

Git clone

cd VMware-Monitor && git pull origin main && uv pip install -e .

uv

uv tool install vmware-monitor --force

Check your current version: vmware-monitor --version


Chinese Cloud Models

For users in China who prefer domestic cloud APIs or have limited access to overseas services.

DeepSeek

export DEEPSEEK_API_KEY="your-key"
aider --conventions codex-skill/AGENTS.md \
  --model deepseek/deepseek-coder

Qwen (Alibaba Cloud)

export DASHSCOPE_API_KEY="your-key"
aider --conventions codex-skill/AGENTS.md \
  --model qwen/qwen-coder-plus

Local Models (Aider + Ollama)

For fully offline operation — no cloud API, no internet, full privacy.

brew install ollama
ollama pull qwen2.5-coder:32b
ollama serve

aider --conventions codex-skill/AGENTS.md \
  --model ollama/qwen2.5-coder:32b

CLI Reference

# Diagnostics
vmware-monitor doctor                   # Check environment, config, connectivity
vmware-monitor doctor --skip-auth       # Skip vSphere auth check (faster)

# MCP Config Generator
vmware-monitor mcp-config generate --agent goose        # Generate config for Goose
vmware-monitor mcp-config generate --agent claude-code  # Generate config for Claude Code
vmware-monitor mcp-config list                          # List all supported agents

# Inventory
vmware-monitor inventory vms [--target <name>]
vmware-monitor inventory vms --limit 10 --sort-by memory_mb   # Top 10 VMs by memory
vmware-monitor inventory vms --power-state poweredOn           # Only powered-on VMs
vmware-monitor inventory hosts [--target <name>]
vmware-monitor inventory datastores [--target <name>]
vmware-monitor inventory clusters [--target <name>]

# Health
vmware-monitor health alarms [--target <name>]
vmware-monitor health events [--hours 24] [--severity warning]

# VM Info (read-only)
vmware-monitor vm info <vm-name>
vmware-monitor vm snapshot-list <vm-name>

# Scanning & Daemon
vmware-monitor scan now [--target <name>]
vmware-monitor daemon start
vmware-monitor daemon stop
vmware-monitor daemon status

Configuration

See config.example.yaml for all options.

Section

Key

Default

Description

targets

name

Friendly name

targets

host

vCenter/ESXi hostname or IP

targets

type

vcenter

vcenter or esxi

targets

port

443

Connection port

targets

verify_ssl

false

SSL certificate verification

scanner

interval_minutes

15

Scan frequency

scanner

severity_threshold

warning

Min severity: critical/warning/info

scanner

lookback_hours

1

How far back to scan

notify

log_file

~/.vmware-monitor/scan.log

JSONL log output

notify

webhook_url

Webhook endpoint (Slack, Discord, etc.)


Project Structure

VMware-Monitor/
├── .claude-plugin/                # Claude Code marketplace manifest
│   └── marketplace.json
├── plugins/                       # Claude Code plugin
│   └── vmware-monitor/
│       ├── .claude-plugin/
│       │   └── plugin.json
│       └── skills/
│           └── vmware-monitor/
│               └── SKILL.md       # Read-only monitoring skill
├── skills/                        # Skills index (npx skills add)
│   └── vmware-monitor/
│       └── SKILL.md
├── vmware_monitor/                # Python backend (read-only only)
│   ├── config.py                  # YAML + .env config
│   ├── connection.py              # Multi-target pyVmomi
│   ├── cli.py                     # Typer CLI (read-only commands only)
│   ├── ops/
│   │   ├── inventory.py           # VMs, hosts, datastores, clusters
│   │   ├── health.py              # Alarms, events, sensors
│   │   └── vm_info.py             # VM info, snapshot list (read-only)
│   ├── scanner/                   # Log scanning daemon
│   └── notify/                    # Notifications (JSONL + webhook)
├── gemini-extension/              # Gemini CLI extension
│   ├── gemini-extension.json
│   └── GEMINI.md
├── codex-skill/                   # Codex + Aider + Continue
│   ├── SKILL.md
│   └── AGENTS.md
├── trae-rules/                    # Trae IDE rules
│   └── project_rules.md
├── kimi-skill/                    # Kimi Code CLI skill
│   └── SKILL.md
├── mcp_server/                    # MCP server (read-only tools only)
│   └── server.py
├── .agents/skills/                # Agent orchestration
│   └── vmware-monitor/
│       └── AGENTS.md
├── smithery.yaml                  # Smithery marketplace config
├── RELEASE_NOTES.md
├── config.example.yaml
└── pyproject.toml

Skill

Scope

Tools

Install

vmware-monitor

Read-only monitoring, alarms, events

8

uv tool install vmware-monitor

vmware-aiops

VM lifecycle, deployment, guest ops, clusters

33

uv tool install vmware-aiops

vmware-storage

Datastores, iSCSI, vSAN

11

uv tool install vmware-storage

vmware-vks

Tanzu Namespaces, TKC cluster lifecycle

20

uv tool install vmware-vks


Troubleshooting & Contributing

If you encounter any errors or issues, please send the error message, logs, or screenshots to zhouwei008@gmail.com. Contributions are welcome!

License

MIT

Available Tools

32 tools
active_sessionsA
Read-onlyIdempotent

[READ] Currently authenticated vCenter/ESXi sessions (who is logged in).

Returns the list envelope with a real total; each row has user_name, full_name, login_time, last_active, ip_address, user_agent (which client — e.g. Aria's adapter shows VMware vim-java), call_count, kind (user/service) and a current flag for this skill's own session. vCenter's own solution users (vpxd-extension-<machine id> and similar) are folded by default and counted in service_sessions. Requires the Sessions privilege; low-privilege accounts get a single explanatory row instead of a traceback.

Use this to attribute a change to a person — pair it with active_tasks, which names the user who started each task. Read-only — terminating a session is not supported here.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax session rows to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).
include_serviceNoList vCenter's own solution-user sessions too. On a lab vCenter they were 24 of 33 sessions.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, but the description adds substantial behavioral context: it requires the Sessions privilege, low-privilege accounts get a single explanatory row instead of a traceback, vCenter solution users are folded by default and counted in service_sessions, and it explicitly says terminating a session is not supported. These details go well beyond the annotations and give the agent a clear model of the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat long but every sentence adds value: purpose, return fields, privilege behavior, folding details, and usage pairing with active_tasks. It is front-loaded with the purpose and then provides necessary context. It could be trimmed slightly (e.g., the list of fields is detailed but helpful), but it is well-structured and not redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, the description comprehensively covers the return envelope, row fields, privilege requirements, error fallback, and pairing with a sibling. It also implicitly addresses the limit parameter via the schema. Nothing an agent needs to correctly call this tool is missing; the description is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters (limit, target, include_service) are already fully documented in the schema. The description does not add extra parameter semantics beyond what the schema provides; it only mentions include_service implicitly through the folding behavior. Given the high coverage, a baseline of 3 is appropriate, and the description does not need to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Currently authenticated vCenter/ESXi sessions (who is logged in).' It clearly states what the tool returns and distinguishes itself from the sibling active_tasks by explicitly naming it and its different focus. The read-only nature is also stated, so an agent knows exactly what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use it: 'Use this to attribute a change to a person — pair it with active_tasks, which names the user who started each task.' This gives a concrete use case and points to an alternative, making it clear how to choose between the two. It also notes privilege requirements and the fallback behavior for low-privilege accounts, further guiding appropriate invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

active_tasksA
Read-onlyIdempotent

[READ] In-flight (and optionally just-completed) vCenter tasks.

Answers "why is the cluster busy?". Returns the list envelope {items, returned, limit, total, truncated, hint} with a real total; each row has name, entity, state, progress_pct, start_time, user, an active flag and error (for failed recent tasks), running/queued first. vCenter keeps only a short recent-task window, so an old task may simply be gone rather than absent.

Use this before blaming load: a migration or clone in flight explains pressure that host_performance shows. Pair with active_sessions to see who started it. Read-only — cancelling a task belongs to vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax task rows to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).
include_recentNoAlso include recently completed/failed tasks (default True).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, and the description adds substantial context beyond those: the exact response envelope with a real total, row fields including error for failed tasks, running/queued ordering, and the vCenter short-recent-task-window caveat. This enriches the agent's mental model of what the tool does and what could go wrong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence earns its place: purpose, output shape, caveat, usage guidance, and cancellation boundary. It is front-loaded with the core purpose and then adds operational context without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 detailing the return envelope and row contents. It covers the tool's safety profile, its relationship to sibling tools, and the important vCenter retention caveat, making the tool fully actionable for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents limit, target, and include_recent. The description adds contextual meaning around the returned envelope and the 'optionally just-completed' behavior, but it does not need to add parameter-level details; the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('[READ] In-flight... vCenter tasks') and a precise resource, and immediately frames the tool's purpose with 'Answers "why is the cluster busy?"'. It differentiates from siblings by explicitly comparing to host_performance and active_sessions, so an agent can select 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'Use this before blaming load' and explains that an in-flight migration/clone explains pressure shown by host_performance. It also provides an exclusion by noting that cancelling a task belongs to vmware-aiops, and recommends pairing with active_sessions to see who started the task.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

certificate_statusA
Read-onlyIdempotent

[READ] Per-host ESXi management certificate expiry.

An expired ESXi cert drops host management — this surfaces it before the outage. Returns the list envelope with a real total; each row has host, not_after, days_until_expiry and an expiring flag, soonest first. Host certificates only — the vCenter appliance's own certificate is not covered.

Use this alongside license_status and ntp_status for a platform-hygiene sweep. Renewing a certificate is a write this skill cannot do; use vmware-aiops or vCenter directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax host rows to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).
warn_daysNoFlag certs expiring within this many days (default 30).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only/idempotent/non-destructive; the description adds non-obvious behavior: the list envelope has a real total, rows are sorted soonest-first, and only host certs are covered. It also confirms renewal is outside the tool's capability, reinforcing the read-only contract.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than strictly necessary (the outage-motivation sentence is not required for invocation), but it is front-loaded with the essential read/resource and every other sentence carries either return-format or routing information. Slight trimming would make it a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 the returned row fields, sort order, scope limitation, and read-only boundary. Together with the fully documented schema, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (limit, target, warn_days) are already documented in the schema. The description adds no new parameter-level detail beyond mentioning the expiring flag, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with '[READ] Per-host ESXi management certificate expiry', a specific verb plus resource. It names the precise returned signal (expiring, days_until_expiry) and explicitly disclaims vCenter appliance coverage, leaving no ambiguity about scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Positions the tool as part of a platform-hygiene sweep alongside license_status and ntp_status, and explicitly states what it cannot do (renew certificates) with a pointer to vmware-aiops or vCenter. This gives an agent clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cluster_health_summaryA
Read-onlyIdempotent

[READ] One-glance health rollup for every cluster — "is anything on fire?".

Start here for single-vCenter triage. Batches hosts, VM power state, live CPU/memory pressure and alarms per cluster, scores each "ok"/"warn"/ "critical", and ranks the anomalies into top_issues. Use this instead of stitching list_all_clusters + list_esxi_hosts + get_alarms yourself.

Returns {totals, top_issues, issues_total, clusters, snapshot, customization_hint} — not the list envelope. Lead with top_issues (worst first), show clusters as context, always echo customization_hint last. Point-in-time — no trending. top_issues includes datastores thin-provisioned past 100% of capacity (kind capacity, scope datastore), attributed to the cluster of a host that mounts them; datastore_capacity has the full table. Alarm issues carry condition_now and acknowledged_days. Only a cleared alarm (its condition is read to be false now) ranks after live issues; an unknown one is not re-checked and keeps its severity rank, however long ago it was acknowledged — report it as possibly still live.

Then drill into what top_issues names with vm_investigation_bundle, host_investigation_bundle or datastore_investigation_bundle; use cross_vcenter_attention to cover every target at once. Acting on a finding belongs to vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNoCap ``top_issues`` (default 10; 0 omits it). ``issues_total`` is the pre-cap count.
targetNovCenter/ESXi target from config (default if omitted).
include_vmsNoRoll up VM counts (default True); False skips that pass.
cluster_filterNoCase-insensitive substring; only matching clusters show (None = all, plus a standalone-hosts row).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is consistent ('[READ]'). It adds substantial behavioral context beyond annotations: the return is 'not the list envelope', it is 'Point-in-time — no trending', and it details the ranking semantics (cleared alarms rank after live issues; unknown alarms keep severity rank and are reported as possibly still live). 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place — purpose is front-loaded in the first line, followed by usage, return format, ranking behavior, and downstream tool routing. The density is justified by the tool's complexity, though it could be trimmed slightly without losing essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 full burden of explaining return values: it lists the fields ({totals, top_issues, issues_total, clusters, snapshot, customization_hint}) and how to present them, plus the inclusion rule for thin-provisioned datastores and alarm condition fields. Nothing an agent needs to call it correctly or interpret results is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 some value by explaining how top_n caps top_issues and that issues_total is the pre-cap count, and how include_vms affects the rollup. However, most parameter meaning is already fully covered by the schema descriptions, so the description doesn't dramatically compensate beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb-resource pair ('health rollup for every cluster') and the goal ('is anything on fire?'). It explicitly differentiates from siblings by saying 'Use this instead of stitching list_all_clusters + list_esxi_hosts + get_alarms yourself,' so an agent can tell it apart from the list/detail tools without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('Start here for single-vCenter triage') and names alternatives ('Then drill into what top_issues names with vm_investigation_bundle, host_investigation_bundle or datastore_investigation_bundle; use cross_vcenter_attention to cover every target at once'). Also gives exclusion guidance ('Acting on a finding belongs to vmware-aiops'), covering when NOT to act with this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cluster_last_apply_resultA
Read-onlyIdempotent

[READ] Result of the last vLCM remediation (apply) on one cluster (REST).

When to use: after a patch/remediation, to confirm the last apply succeeded and when it finished. Use cluster_patch_compliance for current drift; use this for the outcome of the most recent apply.

What it returns: {available, cluster, status, end_time, note, fields}, read defensively. A cluster never remediated may return a "not found" teaching error; a 503 yields available: False (mid-patch, retry).

Gotchas: cluster is the cluster MoID (e.g. domain-c123) — see list_all_clusters. Read-only. Endpoint and field parse verified against a live VCF 9.1 vCenter.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNovCenter target from config (default if omitted).
clusterYesCluster MoID (e.g. domain-c123).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only, idempotent, and non-destructive, and the description adds substantial behavioral detail beyond that: the return shape, defensive reading behavior, the 'not found' teaching error for never-remediated clusters, and the 503 mid-patch retry semantics. It also notes endpoint/field verification against a live VCF 9.1 vCenter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured under clear headings, is front-loaded with the core read intent, and every sentence earns its place. It packs usage timing, return shape, error behavior, and a cross-tool pointer without unnecessary padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully compensates by enumerating the return fields and expected error cases. It also covers when to retry, how to interpret the MoID, and the read-only nature, making it complete for an agent to call the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. The description adds extra meaning by explaining that 'cluster' is the cluster MoID and pointing to list_all_clusters for discovery, which goes beyond the schema's 'Cluster MoID' text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 statement: it returns the result of the last vLCM remediation (apply) on one cluster via REST. It clearly distinguishes itself from the sibling cluster_patch_compliance by stating this is for the apply outcome, not current drift.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: use after a patch/remediation to confirm the last apply succeeded and when it finished. It names the alternative cluster_patch_compliance and tells the agent exactly when to use that instead, so the agent can select correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cluster_patch_complianceA
Read-onlyIdempotent

[READ] vLCM software (patch) compliance for one cluster (vSphere Automation REST).

When to use: to check whether a cluster's hosts match their assigned software image/baseline before or after a patch cycle. Complements host_memory_tiering (that is per-host hardware; this is per-cluster lifecycle state).

What it returns: {available, cluster, status, hosts_total, non_compliant_hosts, scan_time, note, fields}. available: False means vCenter answered 503 — it is likely mid-patch (vSphere has no maintenance-ETA endpoint; retry shortly), not an error. Endpoint and field parse verified against a live VCF 9.1 vCenter (see note).

Gotchas: cluster must be the cluster MoID (e.g. domain-c123), which the REST API requires — get it from list_all_clusters, not the display name. Read-only: reports compliance only; it never runs a remediation.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNovCenter target from config (default if omitted).
clusterYesCluster MoID (e.g. domain-c123).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnlyHint/idempotentHint annotations by explaining that available: False indicates a 503 from vCenter, likely mid-patch, and should be retried rather than treated as failure. It also explicitly states the tool is read-only and never runs remediation, and notes verification against a live VCF 9.1 vCenter. This gives the agent actionable behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with labeled sections: purpose, when to use, return behavior, and gotchas. It is front-loaded with the core purpose and maintains focus without redundant filler. Each section adds operational value, and the length is appropriate given the absence of an output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 covers return fields, an important error/retry condition, a crucial MoID prerequisite, and the tool's non-destructive scope. Combined with the annotations and 100% schema coverage for parameters, the agent has sufficient context to select and invoke the tool correctly in a patch-compliance workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds meaningful value by specifying that 'cluster' must be a cluster MoID such as domain-c123, not a display name, and directs the agent to list_all_clusters for the correct value. It also explains the requirement originates from the REST API, which clarifies parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource: '[READ] vLCM software (patch) compliance for one cluster.' It goes further than a generic statement by explaining what compliance means: checking whether hosts match their assigned image/baseline. It also distinguishes itself from sibling host_memory_tiering by noting per-cluster lifecycle state instead of per-host hardware.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides 'When to use' guidance: check before or after a patch cycle. It also contrasts with host_memory_tiering to help route selection. It gives a concrete prerequisite for the cluster parameter ('get it from list_all_clusters, not the display name'), though it does not enumerate exclusions or alternatives beyond that single sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cross_vcenter_attentionA
Read-onlyIdempotent

[READ] "What needs attention now?" across EVERY configured vCenter — one list.

Start here when the estate has more than one vCenter. Rolls every configured target's cluster-health summary into one globally ranked top_issues list (worst first, each tagged with its vcenter) plus a per-target rollup. Use this instead of calling cluster_health_summary once per target and merging yourself. Returns a rollup, not the list envelope; lead with top_issues.

Degrades gracefully: an unreachable target is listed under unreachable with a reason and the rest still aggregate. Point-in-time — no trending. Overlap is removed by identity: a host reached through a vCenter and as its own ESXi target counts once (hardware UUID), a datastore seen through both is one issue with the other view's figure under also_seen_via (datastore URL), and totals separates vcenters, esxi_targets and unidentified_targets. Then drill in with vm_investigation_bundle, host_investigation_bundle or datastore_investigation_bundle against the vcenter the issue names.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNoCap the merged top_issues list (default 10); ``issues_total`` is the pre-cap count.
cluster_filterNoCase-insensitive cluster substring applied to every target (None = all clusters).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations already declaring readOnlyHint and idempotentHint, the description goes far beyond them by disclosing distinctive behaviors: graceful degradation for unreachable targets, point-in-time semantics (no trending), deduplication identity rules, and the rollup return shape (lead with top_issues). This is substantial added context beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries operational value: scope, return shape, degradation behavior, deduplication rules, and follow-up tools. It is front-loaded with the top-line purpose and alternatives, making the key decision information immediately visible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 compensates thoroughly: it names the primary output fields (top_issues, unreachable, also_seen_via, totals), explains scope and exclusions (no trending, one vCenter tag), and routes to sibling investigation tools. No critical behavioral or return-shape information seems missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters with full coverage, including defaults and filtering semantics. The description adds no parameter-level meaning beyond what the schema already states, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with an explicit READ verb and a clear resource: "What needs attention now? across EVERY configured vCenter — one list." It distinguishes itself from cluster_health_summary by stating it aggregates all targets into a single ranked list, so an agent can immediately tell this is the estate-wide aggregate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use instructions: "Start here when the estate has more than one vCenter" and directs the agent away from the alternative: "Use this instead of calling cluster_health_summary once per target and merging yourself." It also points to drill-in tools (vm_investigation_bundle, host_investigation_bundle, datastore_investigation_bundle), which is actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

datastore_capacityA
Read-onlyIdempotent

[READ] Per-datastore capacity with thin-provisioning over-commit.

Returns the list envelope with a real total: capacity_gb, free_gb, committed_gb, provisioned_gb, used_pct, overcommit_pct, riskiest first. Adds the risk signal list_all_datastores lacks — overcommit_pct over 100% means more space is promised to VMs than physically exists, so a thin datastore can fill up while still showing free space. Point-in-time.

Whose figure: view (vCenter / ESXi host / unknown) and view_note. Provisioned space is summed by the endpoint over the VMs it has registered on the datastore, so a vCenter and a directly-reached ESXi host can report different provisioned_gb for one datastore — each row's vm_count says how many VMs the figure covers, and vms_not_connected names those reported as orphaned/inaccessible/disconnected (None = could not be read).

Use this for the capacity view, then datastore_investigation_bundle to drill into a specific datastore's hosts, VMs and alarms. Reclaiming space (delete snapshots, storage vMotion) belongs to vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax datastore rows to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds substantial behavioral context beyond this: 'Point-in-time.' explains the snapshot nature; it details how provisioned_gb is summed and may differ between vCenter and ESXi; it clarifies the meaning of overcommit_pct >100% and the vm_count/vms_not_connected fields. This significantly enriches the agent's understanding of what to expect, especially the inconsistency between views.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is longer than average, it is well-structured with distinct sections: purpose, return fields, caveats about view differences, and usage routing. Every sentence adds value—no filler. It front-loads the core purpose and then layers caveats and alternatives logically. The structure aids comprehension and efficient scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, the description covers all essential aspects: return fields and their meaning, the key risk signal, the view-dependent inconsistency, and the recommended follow-up tool. It also notes the point-in-time nature and what is not covered. An agent has enough to correctly invoke the tool and interpret results. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (limit and target) already have clear descriptions in the schema. The tool description does not add additional parameter-level detail beyond what the schema provides. The baseline of 3 is appropriate because the schema carries the burden, and the description focuses on output and usage rather than parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear purpose: 'Per-datastore capacity with thin-provisioning over-commit.' It explicitly differentiates from list_all_datastores by noting it adds the risk signal overcommit_pct, which is a concrete distinction from a sibling. The verb and resource are specific, and the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Use this for the capacity view, then datastore_investigation_bundle to drill into a specific datastore...' and clearly states what belongs elsewhere ('Reclaiming space ... belongs to vmware-aiops'). It also explains the data source caveat (vCenter vs ESXi view), which helps an agent choose the right tool. This is clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

datastore_investigation_bundleA
Read-onlyIdempotent

[READ] "What is happening around this datastore?" — one correlated drill-down.

Use this instead of stitching list_all_datastores + datastore_capacity + get_alarms + get_events yourself. Returns one correlated bundle (not the list envelope): capacity / free space / accessibility, the hosts that mount it, a rollup of the VMs it backs, alarms across datastore/host, and a merged event timeline. All reads are batched. Explain it in operational language; do not dump it raw. Per-datastore latency is not included.

Reach for it after cluster_health_summary flags storage pressure. Point-in-time snapshot — no trending. Freeing space (deleting snapshots, storage vMotion) belongs to vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoEvent-timeline look-back window in hours (default 24).
targetNovCenter/ESXi target from config (default if omitted).
datastore_nameYesExact datastore name; unknown names return a teaching error. Get it from list_all_datastores or datastore_capacity first.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only, but the description adds substantial behavioral detail: batched reads, correlated bundle vs list envelope, point-in-time snapshot semantics, output presentation guidance, and the caveat that per-datastore latency is omitted. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, output components, available alternatives, exclusions, and trigger context are each covered once. The [READ] tag and front-loaded purpose make the definition scannable despite its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex bundle tool with no output schema, the description fully carries the return semantics, including what is and is not included. It also positions the tool within the workflow relative to cluster_health_summary and remediation tools, so an agent has enough context to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 datastore_name, hours, and target fully. The description reinforces the exact-name requirement and suggests where to source the name, but adds little new parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete question and states it is a 'one correlated drill-down' for a datastore, listing exactly what the bundle contains (capacity, free space, hosts, VM rollup, alarms, event timeline). It differentiates itself from the individual list/get tools by explicitly naming the stitching alternative, and from sibling investigation bundles by the resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a direct when-to-use instruction ('Reach for it after cluster_health_summary flags storage pressure') and names the alternative manual composition it replaces. Exclusions are explicit: no trending, no remediation, and per-datastore latency is not included, with remediation routed to vmware-aiops.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alarmsA
Read-onlyIdempotent

[READ] Get active/triggered alarms across the VMware inventory.

Returns the list envelope with a real total. Each alarm carries suggested_actions naming the companion skill and tool for remediation, who acknowledged it and when (acknowledged_by / acknowledged_at), and condition_now: holds (live), cleared (vCenter still shows it but its state condition is false now — a stale alarm; see condition_note), or unknown (event/metric-based or unreadable — never guessed). The envelope's stale_alarms counts the cleared ones. An expired-vCenter-license alarm is re-checked against this vCenter's own license assignment. object_label names alarms about the vCenter appliance itself (e.g. "vCenter appliance 192.168.60.16") that sit on the inventory root; entity_name stays the object vmware-aiops resolves. Do not report a cleared alarm as a live problem; do not report an unknown one as resolved. Empty items with truncated False means there genuinely are no active alarms — never report "no data" otherwise.

Use this for the raw alarm list; prefer cluster_health_summary when you want alarms folded into a whole-cluster verdict. Then drill into the flagged object with vm_investigation_bundle or host_investigation_bundle.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax alarms to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/idempotent/non-destructive behavior. The description adds substantial context beyond that: condition_now states (holds/cleared/unknown) with precise definitions, stale_alarms counting, the vCenter license re-check, and the object_label/entity_name distinction. It also warns against misreporting cleared or unknown alarms.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: each caveat prevents a real misuse, such as reporting cleared alarms as live problems or 'no data' when empty items with truncated=False means genuinely no alarms. It is front-loaded with the main purpose and then organized by output semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though there is no output schema, the description supplies essential return structure: the list envelope, total, stale_alarms count, alarm fields, and empty-items semantics. Combined with the full parameter schema and annotations, nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 does not add much detail about limit or target beyond what the schema already provides, though its rich output semantics are not parameter-related.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with '[READ] Get active/triggered alarms across the VMware inventory' — a specific verb+resource that clearly distinguishes it from sibling cluster_health_summary. It also states it returns a list envelope with a real total and alarm condition semantics, so the agent knows exactly what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this for the raw alarm list; prefer cluster_health_summary when you want alarms folded into a whole-cluster verdict. Then drill into the flagged object with vm_investigation_bundle or host_investigation_bundle.' This gives clear when-to-use, when-not-to-use, and alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_eventsA
Read-onlyIdempotent

[READ] Get recent vCenter/ESXi events filtered by severity.

Returns the list envelope, newest first. Up to 5000 events in the window are read; when more matched, read_truncated is true and read_note says how far back the read got — the oldest events were not examined, so narrow hours before concluding nothing happened earlier in the window.

Severity is this skill's own ranking where it has one, and otherwise vCenter's published event catalogue. An event neither can rank comes back with severity "unknown" (it is returned, not filtered out) and is counted in the envelope's unclassified, with classification_note explaining. An empty items alongside a non-zero unclassified does NOT mean the window was quiet — read the note before reporting all-clear.

Use this for an inventory-wide event sweep. When you already know the object, prefer vm_investigation_bundle / host_investigation_bundle instead: they return the same events correlated with that object's state in one call. ESXi syslog lines are not events — use host_log_scan for those.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoWindow end, ISO 8601; defaults to now.
hoursNoHow many hours back to query (default 24). Ignored when both start and end are given; with end alone, how far back from end.
startNoWindow start, ISO 8601 (e.g. "2026-09-03T12:00:00Z"; no zone = UTC). Use it to ask about a specific day rather than the last N hours.
targetNovCenter/ESXi target from config (default if omitted).
severityNoMinimum severity: "critical", "warning", or "info".warning
include_routineNoList routine login/logout session events too. By default they are folded and counted in ``routine_folded`` — one local agent's logins can outnumber everything else in a window.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations (readOnlyHint, idempotentHint, destructiveHint) by disclosing truncation behavior (up to 5000 events, read_truncated, read_note), severity classification rules (own ranking vs vCenter catalogue, 'unknown' severity returned not filtered), and the crucial caveat that an empty items list with non-zero unclassified does not mean silence. This is exactly the kind of behavioral context agents need and is fully consistent with 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although the description is long, every sentence earns its place: it front-loads the one-line purpose with the [READ] tag, then covers truncation, severity semantics, all-clear caveats, and alternative tools in a logical order. The density is justified by the tool's complexity and the need to prevent misinterpretation, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must explain the return envelope, and it does: newest-first ordering, truncation flags, severity classification, and unclassified counts. Combined with the annotations and 100% parameter schema coverage, the definition equips an agent with everything needed to call the tool correctly, interpret results, and decide when to switch to a sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3, and the description adds meaningful parameter-related guidance: it explains how 'hours' interacts with truncation (narrow it before concluding nothing happened earlier) and clarifies the semantics of severity as a minimum threshold with potential 'unknown' outcomes. This goes beyond the schema's simple descriptions, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific verb (get), resource (vCenter/ESXi events), and filter (by severity), and immediately distinguishes itself from siblings by naming vm_investigation_bundle / host_investigation_bundle and host_log_scan as alternatives for different use cases. An agent can tell exactly what this tool does and what it does not do without inspecting other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('inventory-wide event sweep') and when to prefer alternatives ('when you already know the object, prefer vm_investigation_bundle / host_investigation_bundle'), and it warns that ESXi syslog lines are not events, pointing to host_log_scan. It also gives practical guidance on interpreting truncation and unclassified results, leaving no ambiguity about selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_host_sensorsA
Read-onlyIdempotent

[READ] Get hardware sensor status (temperature, voltage, fan, ...) for all hosts.

Returns the list envelope with a real total; each row has host, sensor_name, type, reading, unit and status (green/yellow/red). No rows for a host is not "hardware is fine": every connected host that reports no sensors is listed in hosts_without_sensors with cim_server_running / cim_server_policy (the CIM Server, sfcbd-watchdog, supplies the sensors; null = not read), and sensors_note says what that means — quote it.

Use this for physical hardware only — for CPU/memory load use host_performance, and follow up on a red sensor with host_investigation_bundle to see the alarms and events around that host.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax sensor rows to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive, so the bar is met by adding meaningful context. The description adds crucial behavior beyond annotations: no rows does not mean healthy; hosts without sensors appear in hosts_without_sensors with cim_server_running/cim_server_policy, and sensors_note must be quoted. This is exactly the kind of subtle behavior an agent needs to avoid misinterpreting results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries essential information: the scope, the return envelope, the non-obvious no-sensors semantics, the quote instruction, and explicit sibling routing. It is front-loaded with the core purpose and then adds necessary detail without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 explaining the envelope, field list, hosts_without_sensors structure, and the CIM server dependency. It also covers routing to related tools, leaving little ambiguity for an agent deciding to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 limit and target clearly. The description does not add parameter-specific guidance beyond what the schema provides, which is acceptable but does not elevate the score above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get hardware sensor status (temperature, voltage, fan, ...) for all hosts.' It clearly distinguishes this from sibling tools by emphasizing physical hardware sensors and explicitly contrasting with host_performance for CPU/memory load and host_investigation_bundle for red-sensor follow-up.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit: 'Use this for physical hardware only — for CPU/memory load use host_performance, and follow up on a red sensor with host_investigation_bundle.' This gives the agent clear when-to-use and when-not-to-use directions with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_host_servicesA
Read-onlyIdempotent

[READ] Get host service status (running state and startup policy).

Returns the list envelope; each row has host, service key, label, running (bool) and policy (on/off/automatic). Every matching host is enumerated, so truncated is always False.

Use this to check whether SSH, NTP or the firewall service is in the expected state. For NTP specifically prefer ntp_status, which also reports the configured servers. Starting or stopping a service is a write — this skill cannot do it; use vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNovCenter/ESXi target from config (default if omitted).
host_nameNoFilter to a single host by exact name (None = all hosts).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses the return envelope structure, row fields, and the guarantee that truncated is always False because all matching hosts are enumerated. It also states the read-only boundary explicitly, adding meaningful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and dense, with the core purpose first, followed by return details, then usage guidance and exclusions. Every sentence earns its place and no information is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two optional parameters, read-only annotations, and no output schema, the description fully covers what the agent needs: the exact fields returned, the truncated behavior, a concrete use case, and a clear alternative for NTP. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the parameter descriptions for target and host_name already document their meaning and defaults. The tool description does not add deeper semantics for these parameters, but the schema carries the required burden, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Get host service status (running state and startup policy).' It clearly distinguishes the tool from siblings by stating its scope (services, not sensors or VMs) and by explicitly pointing to ntp_status for NTP-specific checks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states exactly when to use the tool ('check whether SSH, NTP or the firewall service is in the expected state'), names a preferred alternative for NTP (ntp_status), and excludes write operations by directing users to vmware-aiops for starting/stopping services.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

host_investigation_bundleA
Read-onlyIdempotent

[READ] "What is happening around this ESXi host?" — one correlated drill-down.

Use this instead of stitching list_esxi_hosts + host_performance + get_alarms

  • get_events yourself. Returns one correlated bundle (not the list envelope): the host's state (connection, CPU/memory pressure, version, uptime), its cluster, a rollup of the VMs it runs, the datastores it mounts, alarms across host/cluster/datastore, live performance, and a merged event timeline. All reads are batched. Explain it in operational language; do not dump it raw.

Reach for it after cluster_health_summary flags a host. Point-in-time snapshot — no trending; for syslog lines use host_log_scan. Acting on a finding (maintenance mode, evacuate) belongs to vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoEvent-timeline look-back window in hours (default 24).
targetNovCenter/ESXi target from config (default if omitted).
host_nameYesExact ESXi host name; unknown names return a teaching error. Get it from list_esxi_hosts or cluster_health_summary first.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool read-only/idempotent; the description adds return-shape context ('one correlated bundle, not the list envelope'), batching behavior, point-in-time semantics, and output guidance (operational language, not raw dump). 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then uses short paragraphs for alternatives, return contents, trigger context, and limitations. Every clause adds non-redundant information and nothing reads as filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 itemizing the bundle's contents (host state, cluster, VM rollup, datastores, alarms, performance, event timeline) and its operational caveats. Given the tool's read-only nature and well-documented parameters, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are fully documented in the schema with defaults and usage notes (e.g., exact host name, teaching error, hours look-back). The main description does not add parameter meaning, so the high schema coverage baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific analytical operation ('correlated drill-down' around an ESXi host) and enumerates exactly what the bundle contains, distinguishing it from the list tools and from sibling bundle tools for VMs and datastores. The opening question makes the intent unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this instead of manually chaining four listed tools and specifies the trigger ('after cluster_health_summary flags a host'). It also gives exclusions: no trending, syslog needs host_log_scan, and remediation belongs to vmware-aiops.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

host_log_scanA
Read-onlyIdempotent

[READ] Scan recent ESXi host syslog lines for error/warning patterns.

Reads the last lines entries of the hostd/vmkernel/vpxa logs via the diagnostic system and returns only the lines matching known trouble patterns (error, fail, critical, panic, lost access, timeout, …). Severity follows the level ESXi wrote on the line (Cr/Er/Wa/In…, raw token in log_level); a critical keyword still wins. By default findings are grouped by pattern — each item has count, hosts, first_seen/last_seen (log time), severity, source (host_log:<key>), pattern and one sample; lines_matched is the ungrouped count. group=false returns one row per line (severity, source, message, time, entity, log_level, log_time). Returns the list envelope {items, returned, limit, total, truncated, hint}. total is null on purpose — this is "errors within the scanned window", not all errors ever. logs_unavailable lists every host/log that could NOT be read, with the reason (e.g. the account lacks Global.Diagnostics); empty items means nothing matched only when logs_unavailable is empty too.

Use this when get_events or host_investigation_bundle show a host in trouble but not why: vCenter events and ESXi syslog are different sources. Filter with host_name to keep the scan fast on large clusters; a name that matches no host returns an error (get the exact name from list_esxi_hosts), not an empty result. Every call reads the last lines lines afresh.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNoGroup repeated lines by pattern (default true). One call on a lab returned 353 lines, 195 of them one statistics-provider message.
linesNoHow many recent lines per log to scan (default 500, at least 1).
targetNovCenter/ESXi target from config (default if omitted).
host_nameNoFilter to a single host by exact name (None = all hosts).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive, and the description adds substantial behavioral context beyond that: it reads only the last `lines` entries, filters by known trouble patterns, explains severity precedence, documents that `total` is deliberately null, and describes `logs_unavailable` semantics. It also states that every call reads the log afresh, which is useful for an agent planning repeated calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but tightly packed with necessary operational details, and the [READ] prefix and first sentence front-load the core purpose. Each subsequent paragraph addresses a distinct concern: output shape, grouping behavior, total semantics, and usage guidance, so no sentence feels wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 carries the full burden of explaining return values, and it does so thoroughly: the list envelope, grouped item fields, ungrouped row fields, `total` being null by design, `logs_unavailable`, and the interplay between empty `items` and `logs_unavailable`. It also covers error behavior and intended usage context, making it complete for an agent 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all four parameters with 100% coverage, so the baseline is 3. The description adds meaningful parameter-level context beyond the schema: `group=false` output shape, the `host_name` exact-match error behavior, and the fact that `lines` controls the freshly read window per call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise action: scanning recent ESXi host syslog lines for error/warning patterns, naming the specific logs (hostd/vmkernel/vpxa) and the diagnostic mechanism. It clearly differentiates this tool from related tools by explicitly contrasting it with get_events and host_investigation_bundle, which read different sources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Use this when get_events or host_investigation_bundle show a host in trouble but not why.' It also provides practical usage details like filtering with host_name, exact name lookup from list_esxi_hosts, the error behavior for unmatched names, and the effect of group=false.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

host_memory_tieringA
Read-onlyIdempotent

[READ] Per-host memory tiering (vSphere 9.1) and NVMe uplift ratio.

When to use: to see which ESXi hosts back RAM with NVMe (memory tiering, 8.0U3+), how large each tier is, and how much of a host's apparent memory rides on NVMe rather than DRAM. This is the only source of measured tier byte sizes.

Returns the list envelope {items, returned, limit, total, truncated, hint}. Each row: host, tiering_type (noTiering|hardwareTiering|softwareTiering), tiering_active, dram_gb, nvme_gb, total_tiered_gb, uplift_ratio (total/DRAM, None if DRAM unknown), and a per-tier breakdown. A host with tiering off reads as tiering_type "noTiering", nvme_gb 0.0 — that is a real "checked, none", not a gap.

Gotchas: reads pyVmomi HostSystem.hardware.memoryTierInfo (needs ESXi 8.0U3+/9.x); older hosts report tiering_type "unknown". Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax host rows (None = all).
targetNovCenter/ESXi target from config (default if omitted).
host_nameNoFilter to one host by exact name (None = all).

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark the operation as read-only and idempotent; the description adds useful behavioral detail beyond that: it reads pyVmomi HostSystem.hardware.memoryTierInfo, requires ESXi 8.0U3+/9.x, reports 'unknown' for older hosts, and clarifies that 'noTiering' means a real checked-none state rather than missing data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized, with front-loaded purpose, a 'When to use' section, return envelope details, and gotchas. The only minor redundancy is restating 'Read-only' at the end after '[READ]' and despite the readOnly annotation, but overall every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though there is no output schema, the description fully explains the return shape, row fields, per-tier breakdown, and the special meaning of 'noTiering'. It also covers version prerequisites and behavior on older hosts, making it complete for an agent to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all three parameters completely, including defaults and filtering intent, with 100% coverage. The description does not add parameter-level detail, but the schema carries that burden adequately, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose: reporting per-host memory tiering and NVMe uplift ratio. It also differentiates itself by claiming to be 'the only source of measured tier byte sizes,' which helps distinguish it from generic host-list tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly begins with 'When to use' and lists concrete scenarios: identifying ESXi hosts backed by NVMe, checking tier sizes, and understanding how much memory rides on NVMe. It does not enumerate alternatives or explicit 'when not to use' conditions, but it provides clear contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

host_performanceA
Read-onlyIdempotent

[READ] Real-time CPU/memory/disk/network utilisation per ESXi host.

Returns the list envelope with a real total (hosts that reported metrics). Unlike list_esxi_hosts (static config: cores, total GB) this is LIVE 20-second PerfManager data: cpu_usage_pct, mem_usage_pct, mem_consumed_mb, disk_kbps, net_kbps, busiest first. Disconnected hosts and hosts without a real-time provider are skipped, not reported as zero. Point-in-time only — no historical trend.

Use this to find which host is hot, then host_investigation_bundle to drill into it, or vm_performance to see which VMs on it are driving the load.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax host rows to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).
host_nameNoFilter to a single host by exact name (None = all hosts).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with annotations already declaring readOnlyHint, openWorldHint, and idempotentHint, the description adds valuable behavioral nuance: data is from live 20-second PerfManager, disconnected hosts are skipped rather than reported as zero, results are busiest-first, and the data is point-in-time with no historical trend.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the essential read/live nature, then efficiently packs the most useful operational details without redundancy. Every sentence contributes either scope, differentiation, behavioral edge cases, or an alternative routing suggestion.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although there is no output schema, the description compensates by enumerating returned fields, explaining the 'total' envelope semantics, stating which hosts are excluded, and describing ordering. No hidden behaviors or call prerequisites remain unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter has a clear inline description (limit, target, host_name), so the schema already fully documents parameter semantics. The tool description adds no extra parameter guidance, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('[READ] Real-time CPU/memory/disk/network utilisation per ESXi host') and distinguishes itself from list_esxi_hosts by contrasting live PerfManager data with static config data. It also names specific fields returned, leaving no ambiguity about what the tool produces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about when to use this tool: 'Use this to find which host is hot'. It also routes the agent to follow-up tools such as host_investigation_bundle and vm_performance, and contrasts with list_esxi_hosts for static host configuration needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

license_statusA
Read-onlyIdempotent

[READ] vCenter/ESXi license inventory with usage and expiry.

Returns the list envelope, one row per license: name, edition_key, total/used units, unlimited flag (row total == 0) and expiration. Every license is enumerated, so truncated is always False — this is the complete inventory.

Use this to catch over-allocation or an approaching expiry, alongside certificate_status and ntp_status for a platform-hygiene sweep. assignments says which license each asset (vCenter, hosts, clusters) is assigned, with expired per asset — use it to tell whether an "expired license" alarm still applies. It is null with assignments_note when the account cannot read assignments. License keys are never returned. Assigning a license is a write.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses important runtime behavior: 'truncated is always False', how assignments behaves when the account cannot read them, and that 'License keys are never returned'. This adds real value beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficiently organized: read intent, return shape, usage context, edge cases, and access limitations all earn their place. No filler or redundancy is present, and the most important purpose is front-loaded first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description covers the full response envelope, truncation behavior, assignment semantics, permission limitations, and the read/write boundary. An agent has enough context to invoke 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema already fully documents the single optional target parameter. The description repeats that the tool targets vCenter/ESXi but doesn't add new semantics beyond the schema, so the high-coverage baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with '[READ] vCenter/ESXi license inventory with usage and expiry', using a specific verb, resource, and scope. It clearly separates this tool from siblings like certificate_status and ntp_status by focusing on license-specific data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit use cases: 'catch over-allocation or an approaching expiry', and situates it in a platform-hygiene sweep with certificate_status and ntp_status. It also sets a clear boundary with 'Assigning a license is a write,' telling agents when not to use this read-only tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_all_clustersA
Read-onlyIdempotent

[READ] List clusters with host count, DRS/HA status, and resource totals.

Returns the list envelope with a real total. Static topology only — use this to resolve a cluster name, then cluster_health_summary, which supersedes stitching this with list_esxi_hosts and get_alarms yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax clusters to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond those hints: it labels the data as 'Static topology only' and warns about the 'list envelope' with a 'real total.' It also documents the intended workflow. Not as rich as full pagination/performance notes, but it genuinely supplements 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no fluff. The core purpose is front-loaded, the return envelope note is brief, and the usage guidance is packed into a single efficient sentence. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description provides a minimal return expectation ('list envelope with a real total') and lists the visible fields. It also routes the agent to the correct next tool. A small gap remains: the description does not mention how limit interacts with total if paginated, but this is minor for a static topology list tool with well-covered schema and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both limit and target already have clear descriptions in the schema. The tool description adds no parameter-specific information, but because the schema fully documents both parameters, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List clusters with host count, DRS/HA status, and resource totals.' It also clarifies this is a static topology listing, distinguishing it from cluster_health_summary, a very close sibling. An agent knows exactly what data this tool provides and what it does not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs: 'use this to resolve a cluster name, then cluster_health_summary, which supersedes stitching this with list_esxi_hosts and get_alarms yourself.' This gives clear when-to-use guidance and directs the agent away from an alternative composition. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_all_datastoresA
Read-onlyIdempotent

[READ] List datastores with capacity, free space, type, and VM count.

Returns the list envelope with a real total. Raw free/used only — use this to resolve a datastore name, then datastore_capacity for thin-provisioning over-commit risk or datastore_investigation_bundle to drill into one datastore.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax datastores to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare it read-only, idempotent, non-destructive, and open-world. The description adds useful context beyond annotations by mentioning the 'list envelope with a real total' and 'Raw free/used only', which helps set expectations. It does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet information-dense, with the core purpose in the first line and follow-up guidance in two short sentences. No filler, and the key exclusions and successor tools are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple list operation, the description fully covers what the tool returns (envelope with fields and total), its limitation (raw free/used only), and when to use which alternative. With no output schema, the description adequately explains the return shape and all necessary context for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both 'limit' and 'target' fully described by the schema. The description does not add parameter-specific detail, which is acceptable given the baseline, but no extra value is provided beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the verb 'List' with a specific resource (datastores) and enumerates the returned fields (capacity, free space, type, VM count). It also names two sibling tools as alternatives, making the tool's purpose and scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool: to resolve a datastore name, and then routes to datastore_capacity or datastore_investigation_bundle for deeper analysis. Also notes that only raw free/used data is provided, implying it is not for thin-provisioning risk assessment.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_all_networksA
Read-onlyIdempotent

[READ] List networks with name, attached VM count, and accessibility.

Returns the list envelope with a real total. Name, vm_count and accessible only — no VLAN, uplink or NSX overlay detail. Use this to resolve a port-group name, then vm_info for the NICs of one VM. NSX segments live in vmware-nsx.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax networks to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context by noting the return is a 'list envelope with a real total' and by explicitly limiting results to name, vm_count, and accessible, which helps set agent expectations beyond the structured metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four short sentences, with the core purpose front-loaded and each sentence adding necessary context: output shape, exclusions, workflow, and NSX routing. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing tool with no output schema, the description covers the returned fields, the envelope behavior, the limitation of detail level, and the intended follow-up workflow. Combined with rich annotations and full schema coverage, this is complete enough for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (limit and target) are already documented in the structured schema. The description does not need to compensate, and it does not meaningfully add parameter-level semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List networks') and enumerates the exact fields returned: name, attached VM count, and accessibility. It goes further by explicitly excluding VLAN, uplink, and NSX overlay detail, which cleanly distinguishes it from what an NSX-specific tool would provide.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete use case: 'Use this to resolve a port-group name, then vm_info for the NICs of one VM.' It also routes NSX segments to a different tool by stating 'NSX segments live in vmware-nsx,' telling the agent when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_esxi_hostsA
Read-onlyIdempotent

[READ] List ESXi hosts with CPU cores, memory, version, VM count, and uptime.

Returns the list envelope; total is the real host count. Static config only (cores, total GB) — use this to resolve a host name, then host_performance for live load or host_investigation_bundle to drill into one host.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax hosts to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral context: the response is a list envelope, 'total' is the authoritative host count, and the values are static config rather than live load. This goes beyond what the annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded. Every sentence earns its place: the first states the list purpose and fields, the second clarifies the envelope/total distinction, and the third routes the agent to the correct sibling tools. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple read-only tool with two optional params and full schema coverage, the description is complete. It covers return shape, field content, the static-config caveat, and related tools, with annotations covering safety. Nothing needed for correct selection or invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented clearly. The tool description adds context around static vs. live data and host-name resolution, but it does not add significant parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List'), identifies the resource (ESXi hosts), and enumerates the returned fields (CPU cores, memory, version, VM count, uptime). It also separates this tool from related siblings by explicitly mentioning host_performance and host_investigation_bundle for different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: use this for static config and resolving a host name, then use host_performance for live load or host_investigation_bundle for deep drill-down. It clearly distinguishes when to use this tool versus the stated alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_virtual_machinesA
Read-onlyIdempotent

[READ] List virtual machines, with filtering, sorting, and field selection.

Returns the family list envelope {items, returned, limit, total, truncated, hint}; total is the real post-filter count, so read truncated before summarising. Over 50 VMs with no limit/fields, only the first five fields below come back (mode says which). vms is a deprecated pre-1.8.0 alias of items, removed in 2.0 — read items.

Use this to resolve an exact VM name, then vm_info for detail or vm_investigation_bundle to drill into one; for a fleet-wide view start at cluster_health_summary instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax VMs (None = all).
fieldsNoAny of name, power_state, cpu, memory_mb, folder_path, guest_os, ip_address, host, uuid, tools_status (None = auto).
targetNovCenter/ESXi target from config (default if omitted).
sort_byNoname | cpu | memory_mb | power_state | folder_path.name
name_filterNoCase-insensitive substring of the VM name. Use this to find one VM by name on a large estate — it is what the "VM not found" errors elsewhere tell you to come here for.
power_stateNopoweredOn | poweredOff | suspended.
folder_filterNoCase-insensitive folder_path substring; nested folders match.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), yet the description adds substantive behavior: the {items, returned, limit, total, truncated, hint} envelope, the instruction to read `truncated` before summarising, and the non-obvious default that over 50 VMs with no limit/fields only the first five fields return. It also flags the pre-1.8.0 `vms` alias being removed in 2.0 — real operational context beyond structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the [READ] tag and purpose, then envelope semantics, then routing — a sensible order with no filler sentences. It is on the dense side (the `mode` reference is unexplained and mostly carries its weight as an aside), but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter, no-output-schema listing tool, the description covers the return envelope, the truncation sentinel, the default field projection, a deprecation notice, and sibling routing. An agent has everything needed to call it and interpret the result without a schema for the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description rises above it by explaining why `name_filter` exists ('what the "VM not found" errors elsewhere tell you to come here for') and how `limit`/`fields` interact with the 50-VM default projection. It does not, however, add format or syntax detail for sort_by, target, or power_state beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List virtual machines') plus the capabilities it supports (filtering, sorting, field selection), prefixed with a [READ] marker. It explicitly names the siblings it is not (vm_info, vm_investigation_bundle, cluster_health_summary), so an agent can place it in the fleet without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: use this to resolve an exact VM name, then vm_info for detail or vm_investigation_bundle to drill into one, and start at cluster_health_summary for a fleet-wide view. The when-to-use-this vs when-to-use-alternatives decision is fully spelled out rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ntp_statusA
Read-onlyIdempotent

[READ] Per-host NTP configuration health (servers + ntpd service state).

Returns the list envelope; every matching host is enumerated, so truncated is always False. Each row has host, reachable, ntp_servers, ntpd_running, ntpd_policy and a healthy flag (servers configured AND ntpd running). The SOAP API does not expose live clock offset or stratum — this is configuration health only; for actual offset use esxcli on the host.

healthy/ntp_servers/ntpd_running are null — not false/empty — for a host vCenter could not reach or could not read. Null means nothing was observed; false means NTP is misconfigured. Filtering rows for healthy == false will not surface the unread ones, so check the envelope's hosts_unreachable count and unreachable_note before reporting the estate as healthy.

The envelope's ntp_sources_consistent compares hosts with each other: false when hosts that have servers configured use different ones (each row can still be healthy — this is how clocks drift apart), with ntp_sources_note naming which host uses which servers; null when fewer than two hosts have servers to compare.

Prefer this over get_host_services for time problems: that tool reports whether ntpd runs but not which servers are configured. Fixing NTP is a write; use vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNovCenter/ESXi target from config (default if omitted).
host_nameNoFilter to a single host by exact name (None = all hosts).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, and the description adds significant behavioral detail beyond that: truncated is always False, null vs false semantics, unreachable hosts appear in the envelope, ntp_sources_consistent compares hosts, and the SOAP API limitation is disclosed. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence adds necessary nuance: return envelope behavior, null semantics, comparison logic, limitations, and alternative tool guidance. It is front-loaded with the core purpose and progresses logically from row-level details to envelope-level and then to usage guidance. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully compensates by enumerating row fields (host, reachable, ntp_servers, ntpd_running, ntpd_policy, healthy), envelope fields (truncated, hosts_unreachable, unreachable_note, ntp_sources_consistent, ntp_sources_note), and explaining edge cases. It also covers API limitations and alternative approaches, making it complete for correct invocation and interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both target and host_name documented clearly in the input schema. The description adds context about matching hosts and envelope behavior but does not need to repeat parameter meanings. Baseline 3 is appropriate because the schema carries the semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: '[READ] Per-host NTP configuration health (servers + ntpd service state)'. It precisely defines what is measured (configuration health, not live clock offset) and explicitly differentiates itself from the sibling get_host_services by noting that tool lacks server configuration details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to prefer this tool over get_host_services for time problems and gives the reason why. It also states that fixing NTP is a write operation and should use vmware-aiops, clearly distinguishing read vs. write use cases and routing the agent to the correct alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resource_pool_usageA
Read-onlyIdempotent

[READ] Per-resource-pool CPU/memory reservation, limit, and current usage.

Returns the list envelope with a real total; each row has name, cpu_reservation_mhz, cpu_limit_mhz, cpu_usage_mhz, mem_reservation_mb, mem_limit_mb, mem_usage_mb, sorted by memory usage descending. A limit of -1 means unlimited. Pool names are not cluster-qualified, so identical names in different clusters may look alike.

Use this when a VM is throttled but its host is not busy — the cap is usually the pool. Then vm_performance to see which VMs in it are demanding, or cluster_health_summary for the cluster-level picture.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax pool rows to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses significant behavioral details beyond annotations: return structure (list envelope with total), field list, sorting by memory usage descending, meaning of -1 as unlimited, and the caveat about non-qualified pool names. This complements the readOnly and idempotent hints without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence earns its place: it front-loads the read marker and core purpose, details output format, then provides usage context. No redundant sentences, though it could be slightly tightened without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully explains return fields, sorting, and special values, plus usage guidance. For a read-only tool with two optional parameters, this is complete; an agent can call it correctly without needing further documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage for both parameters is 100%, so the description adds minimal new meaning. It only indirectly references the limit parameter via the -1 semantics in results, but does not elaborate on the target parameter beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns per-resource-pool CPU/memory reservation, limit, and usage, and enumerates the exact fields in each row. It names specific resources and the read action, distinguishing it from sibling tools that focus on hosts, VMs, clusters, or datastores.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly specifies when to use this tool: "when a VM is throttled but its host is not busy." It also gives clear follow-up steps, mentioning vm_performance and cluster_health_summary as alternatives, effectively routing the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snapshot_agingA
Read-onlyIdempotent

[READ] Sweep ALL VMs for snapshots and flag old / sprawling ones.

Use this for fleet-wide snapshot sprawl; prefer vm_list_snapshots when you only care about one VM. Returns {total_snapshots, old_snapshots, vms_with_snapshots, threshold_days, snapshots[], hint} — a rollup, not the list envelope. Each row has age_days, is_old and an est_size_mb lower bound (snapshotData+snapshotMemory; delta-disk growth is not separable per-snapshot via the API). Read-only — deleting snapshots belongs to vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax snapshot rows to return (None = all).
targetNovCenter/ESXi target from config (default if omitted).
only_oldNoWhen True, return only snapshots past the threshold.
age_threshold_daysNoAge above which a snapshot is flagged old (default 30).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds meaningful behavioral detail beyond that: the return shape is a 'rollup, not the list envelope,' and it discloses that est_size_mb is a 'lower bound' with an explanation of why (delta-disk growth not separable). It also flags that deletion belongs elsewhere. This adds value beyond annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, with the primary purpose and use case front-loaded in the first two sentences. Every sentence earns its place: purpose, usage, return structure, field caveats, and read-only note. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description fully explains the return structure (including fields like total_snapshots, old_snapshots, vms_with_snapshots, threshold_days, snapshots[], hint) and caveats about est_size_mb. It also covers the only behavioral caveat (read-only, no deletion). For a tool with 4 optional parameters and no output schema, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all four parameters. The description does not add new parameter-level semantics beyond what the schema already provides, hence the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (sweep) and resource (ALL VMs' snapshots) with a clear purpose (flag old/sprawling ones). It distinguishes itself from the sibling vm_list_snapshots by saying 'prefer vm_list_snapshots when you only care about one VM.' This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this for fleet-wide snapshot sprawl' and directly names the alternative tool with the condition to switch. This is a textbook example of usage guidance, covering both when and when-not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vcenter_deployment_sizeA
Read-onlyIdempotent

[READ] vCenter appliance deployment size (NEW in vSphere 9.1, REST).

When to use: to read the vCenter appliance's current (and, where reported, target) deployment size class — capacity-planning context that inventory/perf tools do not cover.

What it returns: {available, note, fields} where fields is a defensive passthrough of the endpoint's top-level scalar values. available: False means vCenter answered 503 (busy/restarting) or is older than 9.1 — reason says which; nothing crashed, and neither is a failure.

Gotchas: 9.1-only endpoint — an older vCenter returns available: False, not data. Endpoint and field parse verified against a live VCF 9.1 vCenter. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNovCenter target from config (default if omitted).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior. The description adds valuable behavioral detail beyond annotations: it explains the return shape, that available:False means a 503 or pre-9.1 vCenter, that this is not a failure, and that the endpoint is 9.1-only. This is exactly the kind of context that helps an agent reason about unexpected results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with labeled sections for usage, return value, and gotchas. Every sentence adds meaningful context, and the key purpose is front-loaded. There is no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 appropriately explains the return shape and failure semantics. It also covers version constraints and operational edge cases (503, older vCenter), making it fully sufficient for an agent to call the tool and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single optional parameter `target` is already fully described in the schema as 'vCenter target from config (default if omitted),' giving 100% schema coverage. The description does not need to add parameter semantics, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool reads the vCenter appliance's current deployment size class, with a specific verb and resource. It also distinguishes its capacity-planning purpose from inventory/perf tools, helping an agent differentiate it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit 'When to use' section explaining it is for reading deployment size for capacity planning and that this is not covered by inventory/perf tools. It does not name specific alternative tools or state explicit when-not-to-use conditions, 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.

vm_backup_snapshot_historyA
Read-onlyIdempotent

[READ] How long backups held a snapshot open on one VM, from task history.

Image-level backup products (Veeam, Commvault, Rubrik, NetBackup) snapshot the VM, copy the frozen disks, then delete the snapshot. vCenter records both ends, so the backup window is recoverable without credentials for the backup server.

This is a LOWER BOUND on the job, not its duration: work the product does before the snapshot is taken and after it is removed is invisible to vCenter. The returned basis says so — quote it alongside any figure.

Returns a rollup, not the list envelope: counts, four hour statistics (backup_active / snapshot_present / total_window / snapshot_removal), latest_cycle, longest_cycle, and unmatched rows for creations with no removal (a backup that left its snapshot behind) or removals whose creation predates the window.

Read two fields before reporting all-clear. history_unavailable non-null means the history could not be read at all — that is not "no backups". coverage_note non-null means vCenter has already expired part of the requested window (task.maxAge — 30 days by default; the option is NOT called vpxd.task.maxAge, which raises vim.fault.InvalidName), so the counts describe a shorter period than days asked for. window_fully_covered is the positive form: True when retention is at least days and nothing in the window can have expired, so a VM whose oldest task is recent was simply quiet; None when retention or the history could not be read.

An unmatched creation is not a failed backup. Each one carries status: "open", age_hours, this VM's longest_completed_cycle_hours and possibly_in_progress — True while it is inside that VM's own observed envelope, False past it, None when there is no completed cycle to compare against. Do not report incomplete_cycles as failures without reading those.

The creation task itself, during the seconds it executes, is absent entirely: no completion time yet, so it forms neither a cycle nor an unmatched row. A backup whose snapshot already exists is not this case — that is the open cycle described above. So no open cycle does not prove no backup is running.

Duplicate VM names raise rather than resolve to one, because a duration attributed to the wrong same-named VM looks exactly like a correct answer. For snapshots that exist right now use vm_list_snapshots or snapshot_aging.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoHow far back to look, 1 to 365 (default 30).
limitNoMax cycle rows when include_cycles is set (capped at 200).
targetNovCenter/ESXi target from config (default if omitted).
vm_nameYesExact VM name; duplicates are refused, not guessed.
include_cyclesNoAlso return the individual cycles, newest kept on cap.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a safe read-only, idempotent, non-destructive operation, yet the description adds substantial context beyond them: it is a lower bound, history_unavailable vs coverage_note semantics, vCenter task.maxAge retention expiry (and the vim.fault.InvalidName naming trap), and that duplicate VM names raise rather than resolve. This is rich disclosure, though it stops short of describing pagination or the exact shape returned beyond field names.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the [READ] tag and the core measurement up top, then structured warnings in descending priority. It is long and occasionally dense, but nearly every sentence carries actionable caveats; a touch of pre-emptive narrative (the vpxd naming aside) keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 carries the return-value burden and does so: it enumerates the rollup fields (counts, four hour statistics, latest/longest cycle, unmatched rows) and explains how to interpret each. Nothing essential for correct interpretation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description nonetheless adds interpretation the schema lacks — that the returned counts may cover less than `days` because of retention, and that an exact vm_name is required with duplicates refused rather than guessed — clarifying the practical meaning of two parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: measuring how long backup products held a snapshot open on one VM, derived from vCenter task history. It explicitly distinguishes itself from sibling tools by naming vm_list_snapshots and snapshot_aging for currently-existing snapshots, so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing to alternatives (vm_list_snapshots / snapshot_aging for present snapshots) and states the key use conditions. It also tells the agent when NOT to trust an all-clear, and warns that no open cycle does not prove no backup is running — clear when-to-use and when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vm_infoA
Read-onlyIdempotent

[READ] Get detailed information about one VM (CPU, memory, disks, NICs, snapshots).

Returns a single detail dict, not the list envelope. Static configuration only — for live CPU/memory use vm_performance, and for the same VM correlated with its host, alarms and events use vm_investigation_bundle.

Use this when you already know the exact name; get it from list_virtual_machines first, since an unknown name returns a teaching error rather than a match. Reconfiguring the VM belongs to vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNovCenter/ESXi target from config (default if omitted).
vm_nameYesExact name of the virtual machine.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive. The description adds valuable behavior beyond those: it returns static configuration only, returns a single dict rather than a list envelope, and warns that an unknown name yields a teaching error instead of a match.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose. It covers return format, scope, error behavior, prerequisites, and sibling alternatives in a few sentences, with no filler or repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with rich annotations and siblings, the description covers all needed invocation context: what it returns, when to use it, what to call first, and which tools cover adjacent concerns. The lack of an output schema is mitigated by the explicit return-shape statement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (target and vm_name) are already meaningfully documented in the schema. The description reinforces that vm_name must be exact and tells the agent where to get it, but does not add substantially new parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: 'Get detailed information about one VM' and enumerates the included areas (CPU, memory, disks, NICs, snapshots). It further differentiates from siblings by noting it returns a single detail dict, not the list envelope, and explicitly contrasts with vm_performance and vm_investigation_bundle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about when to use the tool: 'Use this when you already know the exact name' and instructs to obtain it from list_virtual_machines first. It also names alternatives for live CPU/memory, for correlated host/alarms/events data, and for reconfiguration, leaving no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vm_investigation_bundleA
Read-onlyIdempotent

[READ] "What is happening around this VM?" — one correlated drill-down.

Use this instead of stitching vm_info + vm_list_snapshots + get_alarms + vm_performance + get_events yourself. Returns one correlated bundle (not the list envelope): the VM's state, its host, cluster and backing datastores, its snapshots and triggered alarms, live performance, and a merged event timeline across VM/host/cluster/datastore (newest first). All reads are batched. Explain it in operational language; do not dump it raw.

Reach for it after cluster_health_summary names a problem VM, or when asked "what's going on with ?". Point-in-time snapshot — no trending. Acting on what you find (power, migrate, delete snapshot) belongs to vmware-aiops.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoEvent-timeline look-back window in hours (default 24).
targetNovCenter/ESXi target from config (default if omitted).
vm_nameYesExact VM name; unknown names return a teaching error. Get it from list_virtual_machines or cluster_health_summary first.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it discloses that all reads are batched, that the tool returns a correlated bundle rather than a list envelope, that the event timeline is merged and newest-first, and that the result is a point-in-time snapshot. It also adds an instruction to present output operationally rather than raw. These are meaningful behavioral details the annotations alone do not supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: it states purpose, lists contents, gives usage triggers, sets expectations, and issues a clear output instruction. The most important information is front-loaded, and the length is justified by the tool's composite nature.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a composite read-only tool with no output schema, the description is unusually complete: it enumerates the returned components, states ordering, clarifies batch behavior, warns against trending/acting, and even documents error behavior for unknown VM names. An agent has enough context to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all three parameters at 100% coverage, so the baseline is 3. The description adds useful semantic context by telling the agent where to obtain vm_name ('Get it from list_virtual_machines or cluster_health_summary first') and by tying hours/event timeline to the point-in-time nature of the bundle, which goes slightly beyond the raw schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear operational question ('What is happening around this VM?') and names the exact function: 'one correlated drill-down.' It lists the constituent data sources (VM state, host, cluster, datastores, snapshots, alarms, performance, event timeline), making it unambiguously distinct from individual sibling tools and from the host/datastore investigation bundles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use it ('after cluster_health_summary names a problem VM, or when asked "what's going on with <vm>?"'), when not to use it ('Point-in-time snapshot — no trending'; 'Acting on what you find ... belongs to vmware-aiops'), and what to use instead of stitching lower-level tools together. This is strong alternative-selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vm_list_snapshotsA
Read-onlyIdempotent

[READ] List all snapshots of one VM, including the nesting hierarchy.

Returns the list envelope, one row per snapshot with name, description, created timestamp, state and level (0 = root; children are level+1). Empty items with truncated False means the VM genuinely has no snapshots. Read-only — creating, reverting and deleting snapshots live in vmware-aiops.

Use this for one known VM; prefer snapshot_aging to sweep the whole inventory for old or sprawling snapshots. Get the name from list_virtual_machines first — an unknown name returns a teaching error.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNovCenter/ESXi target from config (default if omitted).
vm_nameYesExact name of the virtual machine.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already include readOnlyHint, idempotentHint, and destructiveHint, but the description adds meaningful behavioral context on top: distinguishing a genuinely empty snapshot list via 'empty items with truncated False,' explaining the level hierarchy, and clarifying that mutating snapshot operations live in vmware-aiops. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently organized into three short paragraphs, each earning its place: what/returns, alternatives and preconditions, and error behavior. Key scope and read-only details are front-loaded, and no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully equips an agent to call the tool correctly: exact parameter semantics, return envelope details, empty-result interpretation, the source for the VM name, and which sibling handles inventory-wide scanning. Despite having no output schema, the return structure is clearly documented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are already described in the schema. The description adds extra practical meaning by requiring an 'exact name,' telling the agent to obtain it from list_virtual_machines, and reinforcing that the target defaults from config. This goes beyond the baseline schema-only explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List all snapshots of one VM, including the nesting hierarchy.' It specifies what is returned per row (name, description, created timestamp, state, level) and explicitly distinguishes itself from mutating snapshot operations and related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: 'Use this for one known VM.' It names the alternative for sweeping inventory (snapshot_aging) and instructs the agent to get the VM name from list_virtual_machines first. It even warns about behavior for unknown names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vm_performanceA
Read-onlyIdempotent

[READ] Real-time CPU/memory/disk/network utilisation per virtual machine.

Returns the list envelope with a real total (VMs that reported metrics) — with the default limit of 25, truncated tells you whether more VMs sit behind it. LIVE data (cpu_usage_pct, mem_usage_pct, mem_consumed_mb, mem_ballooned_mb, mem_swapped_mb, disk_read_kbps, disk_write_kbps, net_kbps), busiest first. mem_usage_pct is mem.usage.average — ACTIVE guest memory over configured, not consumed, so it can read low on a VM under pressure; non-zero mem_ballooned_mb (mem.vmmemctl.average) or mem_swapped_mb (mem.swapped.average) is the pressure signal. counters names the counter behind every field. Only powered-on VMs have a real-time provider; powered-off VMs are skipped. Point-in-time only.

Use this to rank load across VMs; for one VM's configuration use vm_info, and to see the same VM correlated with its host, alarms and events use vm_investigation_bundle.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax VM rows to return (default 25; None = all).
targetNovCenter/ESXi target from config (default if omitted).
vm_nameNoFilter to a single VM by exact name (None = all powered-on VMs).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations already declare readOnlyHint and idempotentHint, the description adds substantial behavioral context beyond those hints: the envelope structure with total and truncated, the meaning of mem_usage_pct (can read low under pressure), the ballooning/swapping signals as pressure indicators, and the point-in-time nature. It also names the specific counters behind fields, giving deep insight into data semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear lead sentence stating purpose, then a logical breakdown of the return envelope, data fields, and special semantics. Every sentence adds value, including the final routing sentence. It is dense but not wordy, and the information is front-loaded with the core purpose before diving into details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple metrics, envelope, counter names, memory semantics) and no output schema, the description covers all necessary context: what the return envelope contains, how to interpret mem_usage_pct versus ballooning/swapping, and the limitation to powered-on VMs. An agent can call this tool and interpret its results correctly without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 all three parameters. However, the description adds important semantic context: it explains that the default limit of 25 can cause truncation and that vm_name filters to a single VM. This goes beyond simple field descriptions and helps an agent understand the effect of parameter choices.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads real-time CPU/memory/disk/network utilization per VM and ranks them busiest first. It explicitly distinguishes from siblings by naming vm_info for configuration and vm_investigation_bundle for correlated host/alarms/events. The verb 'rank load' and resource 'per virtual machine' are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool ('rank load across VMs') and provides direct alternatives for different use cases: vm_info for a single VM's configuration, vm_investigation_bundle for correlated data. It also notes the constraint that only powered-on VMs are included, which is a key usage condition.

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.

  1. 3 tool updatesv1.14.0
    • Changedactive_sessions1 field changed
      • addedInput schema / properties / include_service
        Added value: +{
        +  "default": false,
        +  "description": "List vCenter's own solution-user sessions too. On a lab vCenter they were 24 of 33 sessions.",
        +  "title": "Include Service",
        +  "type": "boolean"
        +}
    • Changedget_events4 fields changed
      • addedInput schema / properties / end
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Window end, ISO 8601; defaults to now.",
        +  "title": "End"
        +}
      • changedInput schema / properties / hours / description
        Previous value: -"How many hours back to query (default 24)."New value: +"How many hours back to query (default 24). Ignored when both start and end are given; with end alone, how far back from end."
      • addedInput schema / properties / include_routine
        Added value: +{
        +  "default": false,
        +  "description": "List routine login/logout session events too. By default they are folded and counted in ``routine_folded`` — one local agent's logins can outnumber everything else in a window.",
        +  "title": "Include Routine",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / start
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Window start, ISO 8601 (e.g. \"2026-09-03T12:00:00Z\"; no zone = UTC). Use it to ask about a specific day rather than the last N hours.",
        +  "title": "Start"
        +}
    • Changedhost_log_scan1 field changed
      • addedInput schema / properties / group
        Added value: +{
        +  "default": true,
        +  "description": "Group repeated lines by pattern (default true). One call on a lab returned 353 lines, 195 of them one statistics-provider message.",
        +  "title": "Group",
        +  "type": "boolean"
        +}
  2. 2 tool updatesv1.11.3
    • Changedhost_log_scan1 field changed
      • changedInput schema / properties / lines / description
        Previous value: -"How many recent lines per log to scan (default 500)."New value: +"How many recent lines per log to scan (default 500, at least 1)."
    • Changedlist_virtual_machines1 field changed
      • addedInput schema / properties / name_filter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Case-insensitive substring of the VM name. Use this to find one VM by name on a large estate — it is what the \"VM not found\" errors elsewhere tell you to come here for.",
        +  "title": "Name Filter"
        +}
  3. 32 tool updatesv1.9.2
    • Changedactive_sessions4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max session rows to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "active_sessionsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedactive_tasks5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / include_recent / description
        Added value: +"Also include recently completed/failed tasks (default True)."
      • addedInput schema / properties / limit / description
        Added value: +"Max task rows to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "active_tasksOutput",
        -  "type": "object"
        -}New value: +null
    • Changedcertificate_status5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max host rows to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • addedInput schema / properties / warn_days / description
        Added value: +"Flag certs expiring within this many days (default 30)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "certificate_statusOutput",
        -  "type": "object"
        -}New value: +null
    • Changedcluster_health_summary5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / cluster_filter / description
        Added value: +"Case-insensitive substring; only matching clusters show (None = all, plus a standalone-hosts row)."
      • addedInput schema / properties / include_vms / description
        Added value: +"Roll up VM counts (default True); False skips that pass."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • addedInput schema / properties / top_n / description
        Added value: +"Cap ``top_issues`` (default 10; 0 omits it). ``issues_total`` is the pre-cap count."
    • Addedcluster_last_apply_result
    • Addedcluster_patch_compliance
    • Changedcross_vcenter_attention3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / cluster_filter / description
        Added value: +"Case-insensitive cluster substring applied to every target (None = all clusters)."
      • addedInput schema / properties / top_n / description
        Added value: +"Cap the merged top_issues list (default 10); ``issues_total`` is the pre-cap count."
    • Changeddatastore_capacity4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max datastore rows to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "datastore_capacityOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddatastore_investigation_bundle4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / datastore_name / description
        Added value: +"Exact datastore name; unknown names return a teaching error. Get it from list_all_datastores or datastore_capacity first."
      • addedInput schema / properties / hours / description
        Added value: +"Event-timeline look-back window in hours (default 24)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
    • Changedget_alarms4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max alarms to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_alarmsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_events6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / hours / description
        Added value: +"How many hours back to query (default 24)."
      • addedInput schema / properties / severity / description
        Added value: +"Minimum severity: \"critical\", \"warning\", or \"info\"."
      • addedInput schema / properties / severity / enum
        Added value: +[
        +  "critical",
        +  "warning",
        +  "info"
        +]
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_eventsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_host_sensors4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max sensor rows to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_host_sensorsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_host_services4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / host_name / description
        Added value: +"Filter to a single host by exact name (None = all hosts)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_host_servicesOutput",
        -  "type": "object"
        -}New value: +null
    • Changedhost_investigation_bundle4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / host_name / description
        Added value: +"Exact ESXi host name; unknown names return a teaching error. Get it from list_esxi_hosts or cluster_health_summary first."
      • addedInput schema / properties / hours / description
        Added value: +"Event-timeline look-back window in hours (default 24)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
    • Changedhost_log_scan5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / host_name / description
        Added value: +"Filter to a single host by exact name (None = all hosts)."
      • addedInput schema / properties / lines / description
        Added value: +"How many recent lines per log to scan (default 500)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "host_log_scanOutput",
        -  "type": "object"
        -}New value: +null
    • Addedhost_memory_tiering
    • Changedhost_performance5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / host_name / description
        Added value: +"Filter to a single host by exact name (None = all hosts)."
      • addedInput schema / properties / limit / description
        Added value: +"Max host rows to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "host_performanceOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlicense_status3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "license_statusOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_all_clusters4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max clusters to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_all_clustersOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_all_datastores4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max datastores to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_all_datastoresOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_all_networks4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max networks to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_all_networksOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_esxi_hosts4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max hosts to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_esxi_hostsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_virtual_machines7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / fields / description
        Added value: +"Any of name, power_state, cpu, memory_mb, folder_path, guest_os, ip_address, host, uuid, tools_status (None = auto)."
      • addedInput schema / properties / folder_filter / description
        Added value: +"Case-insensitive folder_path substring; nested folders match."
      • addedInput schema / properties / limit / description
        Added value: +"Max VMs (None = all)."
      • addedInput schema / properties / power_state / description
        Added value: +"poweredOn | poweredOff | suspended."
      • addedInput schema / properties / sort_by / description
        Added value: +"name | cpu | memory_mb | power_state | folder_path."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
    • Changedntp_status4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / host_name / description
        Added value: +"Filter to a single host by exact name (None = all hosts)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "ntp_statusOutput",
        -  "type": "object"
        -}New value: +null
    • Changedresource_pool_usage4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max pool rows to return (None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "resource_pool_usageOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsnapshot_aging5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / age_threshold_days / description
        Added value: +"Age above which a snapshot is flagged old (default 30)."
      • addedInput schema / properties / limit / description
        Added value: +"Max snapshot rows to return (None = all)."
      • addedInput schema / properties / only_old / description
        Added value: +"When True, return only snapshots past the threshold."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
    • Addedvcenter_deployment_size
    • Addedvm_backup_snapshot_history
    • Changedvm_info3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • addedInput schema / properties / vm_name / description
        Added value: +"Exact name of the virtual machine."
    • Changedvm_investigation_bundle4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / hours / description
        Added value: +"Event-timeline look-back window in hours (default 24)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • addedInput schema / properties / vm_name / description
        Added value: +"Exact VM name; unknown names return a teaching error. Get it from list_virtual_machines or cluster_health_summary first."
    • Changedvm_list_snapshots4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • addedInput schema / properties / vm_name / description
        Added value: +"Exact name of the virtual machine."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "vm_list_snapshotsOutput",
        -  "type": "object"
        -}New value: +null
    • Changedvm_performance5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / limit / description
        Added value: +"Max VM rows to return (default 25; None = all)."
      • addedInput schema / properties / target / description
        Added value: +"vCenter/ESXi target from config (default if omitted)."
      • addedInput schema / properties / vm_name / description
        Added value: +"Filter to a single VM by exact name (None = all powered-on VMs)."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "vm_performanceOutput",
        -  "type": "object"
        -}New value: +null
  4. 5 tool updatesv1.7.6
    • Addedcluster_health_summary
    • Addedcross_vcenter_attention
    • Addeddatastore_investigation_bundle
    • Addedhost_investigation_bundle
    • Addedvm_investigation_bundle
  5. 11 tool updatesv1.6.1
    • Addedactive_sessions
    • Addedactive_tasks
    • Addedcertificate_status
    • Addeddatastore_capacity
    • Addedhost_log_scan
    • Addedhost_performance
    • Addedlicense_status
    • Addedntp_status
    • Addedresource_pool_usage
    • Addedsnapshot_aging
    • Addedvm_performance
  6. 4 tool updatesv1.5.38
    • Addedget_host_sensors
    • Addedget_host_services
    • Addedlist_all_networks
    • Addedvm_list_snapshots
  7. 1 tool updatev1.5.22
    • Changedlist_virtual_machines1 field changed
      • addedInput schema / properties / folder_filter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Folder Filter"
        +}
  8. 5 tool updatesv1.5.18
    • Changedget_alarms1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Limit"
        +}
    • Changedlist_all_clusters1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Limit"
        +}
    • Changedlist_all_datastores1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Limit"
        +}
    • Changedlist_esxi_hosts1 field changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Limit"
        +}
    • Changedlist_virtual_machines5 fields changed
      • addedInput schema / properties / fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Fields"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Limit"
        +}
      • addedInput schema / properties / power_state
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Power State"
        +}
      • addedInput schema / properties / sort_by
        Added value: +{
        +  "default": "name",
        +  "title": "Sort By",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_virtual_machinesOutput",
        -  "type": "object"
        -}New value: +null
  9. 7 tool updatesv0.1.2
    • First observedget_alarms
    • First observedget_events
    • First observedlist_all_clusters
    • First observedlist_all_datastores
    • First observedlist_esxi_hosts
    • First observedlist_virtual_machines
    • First observedvm_info

TDQS

A4.3/5.0

Scored across 32 tools

Disambiguation4/5

Most tools target a clearly distinct resource and action, and the descriptions explicitly cross-reference when to use a bundle versus a raw list or health rollup. The three investigation bundles and the cluster-health/cross-vcenter/get_alarms family still create some functional overlap, so a few selections could be ambiguous for an agent.

Naming Consistency4/5

The set consistently uses snake_case with recognizable list_/get_ prefixes and meaningful suffixes like _bundle, _status, and _performance. However, many names are noun phrases without a verb (license_status, active_tasks, vm_info), so the verb_noun pattern is not fully uniform.

Tool Count2/5

At 32 tools, the set is well beyond the 25-tool threshold and feels heavy for an agent to navigate, even for a broad monitoring scope. The three investigation bundles largely duplicate combinations of the individual list/get/performance tools, inflating the count without adding fundamentally new data.

Completeness4/5

The read-only domain is broadly covered: inventory, live performance, health rollups, alarms/events, logs, capacity, snapshots, backup history, licensing, NTP, certificates, sessions/tasks, and patch compliance. Minor gaps remain—no historical trending, no datastore latency, and shallow network detail—but none create dead ends for the stated purpose.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage VMware vSphere virtual infrastructure through comprehensive operations including VM power control, snapshot management, resource monitoring, performance analytics, and bulk operations with built-in safety confirmations for destructive actions.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage VMware vSphere infrastructure through 55 typed tools built on the govc CLI. It supports comprehensive operations including VM lifecycle management, snapshot control, datastore navigation, and networking configuration.
    21 npm
    3
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    AI-powered VMware vCenter/ESXi monitoring and operations. 20 MCP tools for inventory queries, health monitoring, VM lifecycle management, fast provisioning (Linked Clone, OVA, template deploy), snapshot management, and datastore browsing. Supports vSphere 6.5–8.0. Works with local models via Ollama/LM Studio.
    44
    980 PyPI
    73
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables management of VMware vCenter and ESXi environments, including VM operations, resource management, and automation with Ollama AI and n8n workflows.
    4
    MIT