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 — 33 tools. No destructive operations exist in this codebase, and a test enforces that.

Why a separate repository? VMware Monitor is fully independent from VMware-AIops. No power off, delete, create, reconfigure, snapshot-create/revert/delete, clone, or migrate functions exist in this codebase — not a prompt constraint, an absence.

How that is enforced, precisely. tests/eval/regression/test_read_only_enforcement.py parses every source file with ast and requires each vSphere method the package calls to appear on a reviewed allowlist, cross-checked against pyVmomi's own type metadata: anything returning a vim.Task, or gated by vCenter on a non-read privilege, fails unless a human wrote down why. Today that allowlist is fourteen methods. The check is a gate on the code as written — it cannot see a method name assembled at runtime, and nothing runs it automatically, so it holds only as far as someone runs the test suite. For a guarantee that does not depend on this repository at all, point the skill at a dedicated account holding vCenter's built-in Read-Only role (which reads need more than that role).

What "read-only" does not cover. It is a claim about vCenter/ESXi: no code path changes their state. On vCenter the skill opens only its own login session and short-lived query handles it releases. It does write locally: ~/.vmware-monitor/config.yaml and .env (via init; plaintext passwords in .env are rewritten as b64: on load), audit logs (~/.vmware/audit.db for MCP calls, ~/.vmware-monitor/audit.log for CLI commands), --html snapshots in ~/vmware-health/, and — only after daemon start — daemon.pid, scan.log, and posts to a webhook you configured. Full table: setup guide.

ClawHub Skills.sh Claude Code Marketplace License: MIT

Companion Skills

Skill

Scope

Tools

Install

vmware-aiops ⭐ entry point

VM lifecycle, deployment, guest ops, clusters

49

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

33

uv tool install vmware-nsx-mgmt

vmware-nsx-security

DFW microsegmentation, security groups, Traceflow

21

uv tool install vmware-nsx-security

vmware-aria

Aria Ops metrics, alerts, capacity planning

28

uv tool install vmware-aria

vmware-avi

AVI (NSX ALB) load balancing, AKO on Kubernetes

28

uv tool install vmware-avi

vmware-harden

Compliance baselines, drift detection (read-only)

6

uv tool install vmware-harden

vmware-log-insight

Centralized syslog search, aggregation, alerts

7

uv tool install vmware-log-insight

vmware-debug

Incident timeline correlation, root cause

2

uv tool install vmware-debug

vmware-pilot

Multi-step workflow orchestration, approval gates

13

uv tool install vmware-pilot

Upgrading to 2.0

2.0 renames 23 of its MCP tools so every name starts with a verb (e.g. active_sessions → list_active_sessions, active_tasks → list_active_tasks, certificate_status → get_certificate_status). The full old → new table is in RELEASE_NOTES.md. Nothing else changes: same tools, parameters, safety gates and CLI commands. If an agent prompt, script or ~/.vmware/rules.yaml names a tool, update it — though deny rules written with the old names keep working with vmware-policy ≥ 1.18 (vmware-audit policy lists any rule the renames widened), and vmware-pilot ≥ 1.13 translates old names in saved workflows. If an install older than 2.0 shares that rules.yaml, give it vmware-policy ≥ 1.18.2 too: it matches each rule against both the old and the new name, so one file serves both.

Related MCP server: VMWare MCP

⚡ Quick Investigation Reports

Five opinionated, read-only reports that answer an operator's real questions — each aggregates and correlates server-side and hands back a high-signal result (never raw inventory). Every report also renders a self-contained offline HTML snapshot with --html (no external assets, nothing leaves the machine; drill-down detail collapses in native <details> sections, zero JavaScript).

Question

Command

What it correlates

"Is anything on fire?" across all clusters

vmware-monitor summary

Every cluster's hosts + VM power + live CPU/mem + alarms → ranked top-N issues + per-cluster status

"What needs attention now?" across all vCenters

vmware-monitor attention

Every configured vCenter merged into one globally-ranked issue list; unreachable targets degrade gracefully

"What's happening around this VM?"

vmware-monitor investigate vm <name>

VM state + host it runs on + cluster + backing datastores + snapshots + alarms + performance + a merged event timeline

"What's happening around this host?"

vmware-monitor investigate host <name>

Host state + cluster + the VMs it runs + mounted datastores + alarms + performance + correlated timeline

"What's happening around this datastore?"

vmware-monitor investigate datastore <name>

Capacity/free + mounting hosts + VMs it backs + alarms + correlated timeline

# Triage the estate, then drill into whatever it flags:
vmware-monitor attention                         # what needs attention now, all vCenters
vmware-monitor summary --top 5                   # is anything on fire, one vCenter
vmware-monitor investigate vm web-01 --hours 72  # everything around a VM, 72h event window
vmware-monitor investigate vm web-01 --html      # → offline snapshot in ~/vmware-health/

Unknown object names return a teaching error naming exactly how to list objects. Via MCP these are the tools get_cluster_health_summary, get_cross_vcenter_attention, investigate_vm, investigate_host, investigate_datastore — the model calls them and explains the aggregated result in operational language. Full flags: references/cli-reference.md.

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

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

# Via ClawHub
clawhub install @zw008/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

Offline / Air-Gapped Install (from source)

This project uses the modern PEP 517 build system (hatchling), so there is no setup.py by design — that is expected, not a missing file. If you cloned the source and hit ERROR: File "setup.py" or "setup.cfg" not found ... editable mode currently requires a setuptools-based build, your pip is older than 21.3 and cannot do an editable (-e) install with a non-setuptools backend. Editable mode is a developer convenience, not needed to run the tool — do one of:

# From the source tree — a normal (non-editable) install builds a wheel:
pip install .              # NOT  pip install -e .

# ...or upgrade pip first, and editable works too:
pip install --upgrade pip && pip install -e .

For a truly air-gapped host, build the wheels on a connected machine and copy them over — the target then needs no network:

# On a connected machine, collect this package + its dependencies as wheels:
pip wheel . -w dist        # → dist/*.whl   (or: uv build, for just this package)

# Copy dist/ to the air-gapped host, then install offline:
pip install --no-index --find-links dist vmware-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 / VCF Version

Support

Notes

VCF 9.1 / vSphere 9.1

✅ Full

Released 2026-05-12. pyVmomi <10.0 resolves and connects via SOAP.

VCF 9.0 / vSphere 9.0

✅ Full

pyVmomi 8.0.3+ connects against vSphere 9 SOAP API.

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

Official Broadcom References

1. Inventory

Feature

vCenter

ESXi

Details

List VMs

✅

✅

Name, power state, CPU, memory, guest OS, IP, folder_path (vCenter inventory folder, e.g. /Datacenters/Production/Web Tier); MCP list_virtual_machines supports folder_filter for case-insensitive folder-tree search

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, accessibility — CLI inventory networks, MCP list_all_networks

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

✅

✅

Per-sensor type (temperature/voltage/fan...), reading, unit, and health status (green/yellow/red) — CLI health sensors, MCP get_host_sensors

Host Services

✅

✅

hostd, vpxa running/stopped status — CLI health services, MCP get_host_services

Account Access

✅

✅

Which account the server uses and whether it holds each tool's privileges on the root folder — CLI access-info, MCP get_access_info

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, folder_path

Snapshot List

List existing snapshots with name and creation time (no create/revert/delete) — CLI vm snapshot-list, MCP tool list_vm_snapshots

Backup Window

How long backups held a snapshot open on a VM, from vCenter task history — CLI snapshots backup-window, MCP tool get_vm_backup_snapshot_history. A lower bound on the backup job, never its official duration

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

Each cycle: triggered alarms, vCenter events from the last lookback_hours, and new lines in the ESXi host logs hostd, vmkernel, vpxa

Host Logs

Read incrementally: each line is reported once per daemon run (a restarted daemon re-reads each log's last 500 lines once). A rotated log, or more than 500 new lines between cycles, adds an info row saying which lines were not scanned. Reading host logs needs the Global.Diagnostics privilege, which vCenter's Read-Only role does not include; a log that cannot be read becomes an info row with the reason, never a silent "all clear"

Log Analysis

Host-log lines matching error, fail, critical, panic, lost access, cannot, timeout, refused, corrupt — lines with critical/panic/corrupt are critical, the rest warning

Structured Log

JSONL output to ~/.vmware-monitor/scan.log — every issue, info rows included

Webhook

Slack, Discord, or any HTTP endpoint. Receives every critical issue and every alarm/event warning; host-log warnings go to the scan log only, and info rows are never sent

Cycle Summary

One line per cycle in the daemon's log output: findings (and how many went to the webhook), unreadable host logs, logs with unscanned lines, failed passes. If any pass failed or a target could not be reached it reads Scan INCOMPLETE, never "all clear"

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, checked by an AST allowlist gate over every vSphere call (tests/eval/regression/test_read_only_enforcement.py)

Audit Trail

MCP tool calls and every CLI command that reaches vCenter logged to ~/.vmware/audit.db (SQLite, via vmware-policy); CLI queries also append to ~/.vmware-monitor/audit.log (JSONL)

Password Protection

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

SSL Self-signed Support

verify_ssl: false — 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

Disabled by default. When configured, the daemon posts to your URL only: every critical issue (alarms, events, ESXi log lines matching critical/panic/corrupt, targets it could not connect to) and every alarm/event warning — host-log warnings stay in the scan log, and info rows are never sent. Each issue carries its entity name and message: sanitized alarm, event, or ESXi log text, or the connection error, which can include host names, IPs, and user names. No credentials from the skill's config or .env are sent

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 removes that class of risk from its own code: no destructive code paths exist, and the allowlist gate fails the build if one is added. Pair it with a read-only vCenter account for defence that does not rely on this codebase. 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.


Running with local or small models? See skills/vmware-monitor/references/agent-guardrails.md.


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 Object (drill-down)

One call correlates the object with its surrounding infrastructure and recent history — see ⚡ Quick Investigation Reports above.

  1. Start from triage: vmware-monitor attention (all vCenters) or vmware-monitor summary (one)

  2. Drill into what it flags: vmware-monitor investigate vm <name> (or host / datastore)

  3. Widen the event window with --hours 72; share it with --html (offline snapshot)

  4. If the name is unknown → the teaching error names how to list objects (inventory vms/hosts, list_all_datastores)

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: trust the CA; set verify_ssl: false only for an isolated lab host

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.

doctor reports "no vSphere role", or every command fails with "session is not authenticated"

The account logs in but has no vSphere role, so vCenter gives it no session (AIops#47). Assign it a role (Read-Only or higher) on the vCenter root folder: Administration > Access Control > Global Permissions. Changing the password will not help. vmware-monitor doctor reports this case by name, and attention counts such a target as unread (overall at least WARN).


Supported AI Platforms

Platform

Status

Config File

AI Model

Claude Code

✅ Native Skill

skills/vmware-monitor/SKILL.md

Anthropic Claude

Gemini CLI

✅ Context file + MCP

skills/vmware-monitor/SKILL.md

Google Gemini

OpenAI Codex CLI

✅ Skill + AGENTS.md

skills/vmware-monitor/SKILL.md

OpenAI GPT

Aider

✅ Conventions

skills/vmware-monitor/SKILL.md

Any (cloud + local)

Continue CLI

✅ Rules

skills/vmware-monitor/SKILL.md

Any (cloud + local)

Trae IDE

✅ Rules

skills/vmware-monitor/SKILL.md

Claude/DeepSeek/GPT-4o

Kimi Code CLI

✅ Skill

skills/vmware-monitor/SKILL.md

Moonshot Kimi

MCP Server

✅ MCP Protocol

vmware_monitor/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

Context file

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 33 tools are read-only, enforced by the allowlist gate described above.

Agent / Tool

Local Model Support

Config Template

Integration Guide

Xiaoguai (小怪)

✅ Self-hosted, any LLM

MCP setup

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

—

Xiaoguai (小怪) — a self-hostable, audit-first agent platform (Rust, single binary + embedded SQLite) from the same maintainer. It runs the read-only vmware-monitor MCP server as one of its toolboxes; being both an MCP consumer and an MCP server, its HMAC-chained audit log pairs naturally with this skill's read-only design — every query is logged, and no code path here mutates. See its MCP integration guide.

Fully local operation (no cloud API required):

# Aider + Ollama + vmware-monitor (via SKILL.md)
aider --conventions skills/vmware-monitor/SKILL.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/vmware-skills/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 go to user-configured URLs only and carry no credentials from your config — but they do carry vSphere's own alarm, event, and log text, which can include host names, IPs, and user names. We recommend a dedicated service account with vCenter's built-in Read-Only role.

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

Method 1: Skills.sh or ClawHub (recommended)

Either installer places the skill in Claude Code's skills directory for you:

npx skills add vmware-skills/VMware-Monitor
# or
clawhub install @zw008/vmware-monitor

Method 2: Manual skill install

git clone https://github.com/vmware-skills/VMware-Monitor.git
cd VMware-Monitor

# Copy the skill into Claude Code's personal skills directory
mkdir -p ~/.claude/skills/vmware-monitor
cp -r skills/vmware-monitor/. ~/.claude/skills/vmware-monitor/

For tool access (not just skill context), also register the MCP server:

claude mcp add vmware-monitor -- vmware-monitor mcp

Restart Claude Code, then:

> Show me all VMs on esxi-lab.example.com

Option B: Gemini CLI

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

# Load the skill as project context (Gemini CLI reads GEMINI.md on startup)
cp skills/vmware-monitor/SKILL.md ./GEMINI.md

For tool access (not just context), register the MCP server in ~/.gemini/settings.json:

{
  "mcpServers": {
    "vmware-monitor": {
      "command": "vmware-monitor",
      "args": ["mcp"],
      "env": { "VMWARE_MONITOR_CONFIG": "~/.vmware-monitor/config.yaml" }
    }
  }
}

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 skills/vmware-monitor/SKILL.md ~/.codex/skills/vmware-monitor/SKILL.md

# Copy AGENTS.md to project root
cp skills/vmware-monitor/SKILL.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 skills/vmware-monitor/SKILL.md

# Or with local model via Ollama
aider --conventions skills/vmware-monitor/SKILL.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 skills/vmware-monitor/SKILL.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 skills/vmware-monitor/SKILL.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 skills/vmware-monitor/SKILL.md ~/.kimi/skills/vmware-monitor/SKILL.md

Option H: MCP Server (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.


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 @zw008/vmware-monitor

Skills.sh

npx skills add vmware-skills/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 skills/vmware-monitor/SKILL.md \
  --model deepseek/deepseek-coder

Qwen (Alibaba Cloud)

export DASHSCOPE_API_KEY="your-key"
aider --conventions skills/vmware-monitor/SKILL.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 skills/vmware-monitor/SKILL.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)
vmware-monitor access-info [--tool <mcp-tool>] [--target <name>]  # Account in use + privileges per tool

# 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 vms --sort-by folder_path             # Group VMs by inventory folder
# All `inventory vms` results include a `folder_path` field (e.g. `/Datacenters/Production/Web Tier`).
# MCP tool `list_virtual_machines` additionally supports `folder_filter="Production"` for case-insensitive folder-tree search.
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

true

Verify the target's TLS certificate (set false only for self-signed lab hosts)

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/
├── skills/                        # Skills index (npx skills add)
│   └── vmware-monitor/
│       ├── SKILL.md
│       └── references/            # Detailed docs loaded on-demand
├── 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)
│   └── mcp_server/                # MCP server (read-only tools only)
├── examples/mcp-configs/          # MCP client config templates
├── tests/                         # Test suite
├── smithery.yaml                  # Smithery marketplace config
├── RELEASE_NOTES.md
├── config.example.yaml
└── pyproject.toml

Skill

Scope

Tools

Install

vmware-monitor

Read-only monitoring, alarms, events

27

uv tool install vmware-monitor

vmware-aiops

VM lifecycle, deployment, guest ops, clusters

49

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!

Remote access (HTTPS) and limiting tools

By default vmware-monitor mcp speaks stdio to one local client and offers every tool. Two options change that (vmware-policy ≥ 1.21.0).

Serve over HTTPS so clients on other machines can connect. Every caller needs a bearer token:

vmware-audit token create alice          # prints the token once; give it to alice
vmware-audit token list                  # names only
vmware-audit token revoke alice          # refused from its next request, no restart
vmware-monitor mcp --transport https --host 0.0.0.0 --port 8443 \
    --cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \
    --public-name mcp.example.com

Connect a client (Claude Code shown; any MCP client that supports streamable HTTP and custom headers works):

claude mcp add --transport http vmware-monitor https://mcp.example.com:8443/mcp \
    --header "Authorization: Bearer $VMWARE_MCP_TOKEN"
{
  "mcpServers": {
    "vmware-monitor": {
      "type": "http",
      "url": "https://mcp.example.com:8443/mcp",
      "headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }
    }
  }
}
  • The server will not start without a token, refuses Host/Origin values outside --public-name, and checks before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.

  • Behind a TLS-terminating reverse proxy on the same machine use --transport http --host 127.0.0.1 --public-name mcp.example.com and pass the Authorization header through.

  • Behind a load balancer or gateway on another machine, keep --transport https (a self-signed certificate is fine), list in --public-name the host name the balancer sends as Host, and have it forward Authorization. Its health probe can use GET /healthz, which needs no token and returns only {"status": "ok"} (vmware-policy ≥ 1.23.0).

  • Send traceparent or X-Request-ID with each request to have it stored on the audit row; vmware-audit log --correlation-id ID then finds the calls behind one platform request.

  • The audit log records each caller as token:<name>. Calls run side by side, with up to VMWARE_MCP_POOL_SIZE (default 2) sessions per target; each session is a login on the target, and a call waits at most 300 s for one.

  • Everyone who can reach the endpoint acts with this server's account. Tokens identify callers; they grant nothing on the platform. Run one endpoint per privilege level.

  • Several people or roles on one endpoint: run vmware-audit roles enable once, then give each token a role (vmware-audit token create NAME --role reader, or a role in roles.yaml naming tools and targets; vmware-policy ≥ 1.24.0). A role limits what the token may call on this endpoint; it cannot grant more than the account has. See vmware-policy's README, "Roles for network callers".

Limiting tools: every tool of this server is read-only, so --expose read changes nothing here; it exists for the write-capable skills. Least privilege comes from the account the server uses.

Details: skills/vmware-monitor/references/setup-guide.md ("Serving MCP over HTTPS", "Limiting which tools are offered").

License

MIT

Available Tools

33 tools
find_aging_snapshotsA
Read-onlyIdempotent

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

Use this for fleet-wide snapshot sprawl; prefer list_vm_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/destructiveHint=false, yet the description still adds real behavioral context: the exact rollup return shape ({total_snapshots, old_snapshots, vms_with_snapshots, threshold_days, snapshots[], hint}), the caveat that est_size_mb is only a lower bound because delta-disk growth isn't separable per-snapshot via the API, and an explicit scope boundary that deletion lives in vmware-aiops.

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?

Front-loaded with the action and scope in the first clause, then usage routing, then the return contract, then the caveat. No sentence is filler; the bracketed [READ] tag signals safety up front.

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 return contract itself and does so concretely, including per-row fields and the size-estimate limitation. Combined with rich annotations, an agent has everything needed to call and interpret this tool.

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 limit/target/only_old/age_threshold_days are already fully documented. The description references threshold_days in the return shape but adds no parameter syntax, formats, or defaults beyond the schema, so the baseline 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?

States a specific verb+resource+scope: 'Sweep ALL VMs for snapshots and flag old / sprawling ones.' It immediately distinguishes itself from the sibling list_vm_snapshots by naming that tool as the single-VM alternative.

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 routing guidance: 'Use this for fleet-wide snapshot sprawl; prefer list_vm_snapshots when you only care about one VM.' The when-to-use and the named alternative are both stated, leaving nothing to inference.

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

get_access_infoA
Read-onlyIdempotent

[READ] The account this server uses on a target, and whether it holds a tool's privileges.

When to use: a tool failed with NoPermission, returned fewer objects than expected, or you want to know up front what the configured account may read. Ask about one tool, or omit it to sort every tool of this server into granted / not granted / undetermined.

What it returns: {target, account, checked_on, privileges {id: state}, and either tool {name, requires, verdict, meaning, missing_at_root} or the tools_* lists}, plus the account's direct permissions (role, on, propagate).

Gotchas: privileges are checked on the vCenter/ESXi root folder only. not_granted_at_root does not mean no access — a permission on a cluster, folder or VM still lets the tool work there. undetermined means the platform did not answer and is never to be read as granted. Permissions held through a group count in the verdict but are not listed by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolNoA tool name on this server, e.g. list_active_sessions (None = all tools).
targetNovCenter/ESXi 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, and the description goes well beyond them with real behavioral caveats: privileges are checked on the vCenter/ESXi root folder only, ``not_granted_at_root`` does not imply no access, ``undetermined`` must never be read as granted, and group-derived permissions count in the verdict but are not listed by name. These are exactly the traps that would otherwise cause misreads.

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?

Front-loaded with a [READ] tag, then cleanly partitioned into When to use / What it returns / Gotchas. It is dense but every sentence carries information an agent needs, with no filler or restatement of the tool name.

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

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 takes on the burden of describing the return payload (target, account, checked_on, privileges map, tool block or tools_* lists, direct permissions) and it does so. Combined with the gotchas, an agent has everything needed 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 both parameters, including the 'None = all tools' default. The description adds the behavioral consequence of omitting ``tool`` (grouping into granted / not granted / undetermined) but no syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

The description names the specific resource — the configured account on a target and its privilege verdict for a given tool — which no sibling tool covers (all siblings are inventory/health/investigation tools). The opening sentence is a noun phrase rather than an explicit verb+resource, but the scope is unambiguous once read with the 'What it returns' line.

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 concrete triggering conditions: a tool failed with NoPermission, returned fewer objects than expected, or you want to pre-check what the account may read. It also explains the two invocation modes (ask about one ``tool``, or omit it to classify every tool), leaving nothing to inference.

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 get_cluster_health_summary when you want alarms folded into a whole-cluster verdict. Then drill into the flagged object with investigate_vm or investigate_host.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax alarms 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?

Annotations already declare readOnly/idempotent/destructive=false, yet the description goes far beyond them: it discloses the response envelope (real ``total``, ``stale_alarms`` count), the three ``condition_now`` states and their meanings, that expired-license alarms are re-checked against real license assignment, and the object_label vs entity_name distinction. It also guards against misreporting (cleared as live, unknown as resolved).

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 front-loads purpose and routing before the interpretive detail, and given there is no output schema the return-value semantics earn their space. The '[READ]' tag and some parenthetical asides are slightly noisy, but there is little waste.

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 and only two optional params, the description carries the full burden, and it does so: it documents the envelope, the meaning of each alarm field and condition state, and edge cases like empty items with truncated=False. An agent has everything needed to call and interpret 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% for the two parameters (limit, target), so the schema already carries the semantics. The description says nothing further about limit or target behavior, so it neither adds nor subtracts; baseline 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 opening sentence names a specific verb and resource with scope ("Get active/triggered alarms across the VMware inventory"), leaving no ambiguity about what is returned. It explicitly distinguishes itself from the sibling get_cluster_health_summary, so an agent can route correctly without opening a schema.

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

Usage Guidelines5/5

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

States when to use this tool ("Use this for the raw alarm list"), names the preferred alternative for a different intent (get_cluster_health_summary), and prescribes the follow-up drill-down path via investigate_vm/investigate_host. This is explicit when/when-not/alternatives guidance.

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

get_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 get_license_status and get_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 declare read-only/idempotent/non-destructive, so the description correctly spends its words elsewhere: it explains the operational consequence of the data ('An expired ESXi cert drops host management'), the return shape (list envelope with a real total, rows containing host/not_after/days_until_expiry/expiring, soonest first), and an explicit coverage limitation. That is 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.

Conciseness4/5

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

Front-loaded with the [READ] tag and the resource, then rationale, return shape, and routing guidance in tight order. Slightly dense with the mid-paragraph field enumeration, but 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?

No output schema exists, so the description carries the return-value burden and does so (envelope, fields, ordering), plus scope caveat and alternatives. Nothing an agent needs to call and interpret this tool is missing.

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

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, target, and warn_days fully; baseline 3 applies. The description only indirectly gestures at warn_days via the 'expiring' flag and does not add format or default-syntax detail 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 a specific verb+resource ('Per-host ESXi management certificate expiry') and immediately scopes it against the obvious confusion: 'Host certificates only — the vCenter appliance's own certificate is not covered.' An agent can distinguish this from sibling status tools like get_license_status without opening the schema.

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

Usage Guidelines5/5

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

Explicitly routes usage: 'Use this alongside get_license_status and get_ntp_status for a platform-hygiene sweep,' and states the boundary condition for acting — 'Renewing a certificate is a write this skill cannot do; use vmware-aiops or vCenter directly.' Both when-to-use and when-not are covered.

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

get_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; get_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 investigate_vm, investigate_host or investigate_datastore; use get_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 read-only/idempotent, but the description adds substantial behavior beyond them: it is point-in-time with no trending, top_issues is ranked worst-first, cleared vs unknown alarm handling differs, and thin-provisioned datastores past 100% are folded in. These are exactly the nuances an agent needs and none are derivable from 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.

Conciseness4/5

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

Front-loads the core purpose and is organized into scannable blocks (purpose, return shape, alarm nuance, drill-down). It is on the long side and the alarm-paragraph is dense, but nearly every sentence carries actionable meaning, so waste is limited.

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 enumerating the return keys ({totals, top_issues, issues_total, clusters, snapshot, customization_hint}), explaining what each leads with, and clarifying that it is not the list envelope. Nothing needed to call and interpret it correctly 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 each parameter is well documented there, so the baseline is 3. The description reinforces a couple of semantics (top_issues capping, cluster_filter behavior) but adds little beyond what the schema descriptions already state.

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+resource ('health rollup for every cluster') and immediately frames the intent with a memorable question ('is anything on fire?'). It explicitly distinguishes itself from siblings by naming list_all_clusters + list_esxi_hosts + get_alarms as the thing it replaces.

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 when to use it ('Start here for single-vCenter triage'), when not to stitch the primitives yourself, and routes follow-up work to investigate_vm/investigate_host/investigate_datastore and get_cross_vcenter_attention. It even delegates remediation ('Acting on a finding 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.

get_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 get_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 cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds real context beyond them: a 'not found' teaching error for a never-remediated cluster and a 503 that yields available: False mid-patch with a retry instruction. This error/retry behavior is not derivable from structured fields.

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?

Structured into when-to-use, what-it-returns, and gotchas sections with the operation and scope front-loaded. Every sentence carries distinct information; none 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?

With no output schema, the description takes on the burden of describing the return shape ({available, cluster, status, end_time, note, fields}) and the degraded cases. Nothing an agent needs to call and interpret this correctly 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 description coverage is 100%, so the baseline is 3, but the description adds a discovery pointer ('see list_all_clusters') that tells the agent how to obtain the required cluster MoID, plus reiterates the MoID format with a concrete example.

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?

Specific verb+resource+scope: the last vLCM remediation apply result on a single cluster. It explicitly names the sibling it is not (get_cluster_patch_compliance) so an agent can route without opening either 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?

States when to use ('after a patch/remediation, to confirm the last apply succeeded and when it finished') and gives the explicit alternative plus its selection condition ('use get_cluster_patch_compliance for current drift; use this for the outcome of the most recent apply'). 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.

get_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 get_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.6/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive, and the description adds substantial context beyond them: the 503-mid-patch meaning of available=False with retry guidance, an explicit statement that it never runs remediation, and that the endpoint was verified 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.

Conciseness4/5

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

Front-loads the one-line purpose then uses clear labelled sections (When to use / What it returns / Gotchas) with no filler sentences. It is longer than typical but each block carries distinct, load-bearing information; minor redundancy in the return-field list keeps it just short of 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 enumerating the return shape (available, cluster, status, hosts_total, non_compliant_hosts, scan_time, note, fields) and by flagging the required-MoID gotcha. An agent has everything needed to call and interpret this tool.

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, but the description adds actionable meaning: cluster must be the MoID (domain-c123), the REST API requires it, and it must come from list_all_clusters rather than the display name. That routing advice goes beyond the schema's terse 'Cluster MoID' note.

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 (get), resource (cluster patch/software compliance), and scope (one cluster, vLCM, via vSphere Automation REST). It also explicitly contrasts itself with the sibling get_host_memory_tiering (per-host hardware vs per-cluster lifecycle state), so an agent can place it 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 Guidelines4/5

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

The 'When to use' section names the triggering condition (checking host match to assigned image/baseline before or after a patch cycle) and contrasts with a sibling. It does not, however, distinguish itself from the closely related get_cluster_last_apply_result, which an agent might reasonably confuse with compliance.

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

get_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 get_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, but it is never counted as healthy: totals.worst_status is at least warn (critical when no target answered) and totals.status_reason says how many were not read. 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 investigate_vm, investigate_host or investigate_datastore 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.6/5.0
Behavior5/5

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

Annotations already declare safe read/idempotent/open-world behavior, so the bar is lower, yet the description adds substantial context beyond them: graceful degradation with the unreachable list, guarantee that unreachable targets never count as healthy (totals.worst_status floor), identity-based dedup rules, point-in-time (no trending), and the fact it returns a rollup rather than the list envelope.

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-loads the core question and the 'start here' decision, then layers degradation, dedup, and drill-in guidance in a logical order. It is dense but every block carries information; minor verbosity from the backtick field references 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 return-shape responsibility and does so — explaining top_issues, the per-target rollup, unreachable, also_seen_via, and the totals breakdown. For a multi-target aggregation tool this is complete enough to invoke 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 (top_n, cluster_filter) are fully documented in the schema. The description explains the top_issues return field that top_n caps but adds no syntax or format detail beyond the schema, so the baseline 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?

States a specific verb and resource — rolls every configured target's cluster-health summary into one globally ranked top_issues list — and explicitly contrasts itself with the sibling get_cluster_health_summary. An agent can distinguish it without opening either 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 a clear 'start here when the estate has more than one vCenter', names the alternative it replaces ('use this instead of calling get_cluster_health_summary once per target'), and routes follow-up work to investigate_vm/host/datastore. When-to-use, alternative, and drill-in path are all explicit.

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

get_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). The figures can also differ with the same vm_count: each endpoint aggregates uncommitted space itself.

Use this for the capacity view, then investigate_datastore 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.6/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), yet the description adds substantial non-obvious behavior: point-in-time semantics, that provisioned_gb is aggregated by the endpoint over registered VMs so vCenter and direct ESXi diverge, that vm_count delimits the figure's coverage, and that vms_not_connected uses None as 'could not be read'. This is exactly the extra context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the tag, one-line summary, then the returned envelope and the risk rationale; the 'whose figure' paragraph is dense but every clause resolves a real ambiguity about divergent per-endpoint numbers. Slightly long and could be tightened, but nothing 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?

For a read-only list tool with no output schema, the description supplies the return fields, the risk interpretation, the point-in-time caveat and the multi-endpoint aggregation caveat — everything an agent needs to call it and correctly interpret 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?

Schema description coverage is 100% and the two parameters (limit, target) are already documented in the schema. The description adds no argument syntax or format detail beyond the schema, so the baseline 3 for full-coverage schemas 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?

States a specific verb and resource ('per-datastore capacity') plus the distinctive capability (thin-provisioning over-commit) and explicitly contrasts itself with list_all_datastores, which it says 'lacks' the risk signal list. An agent can distinguish it from the 30+ siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit routing: 'Use this for the capacity view, then investigate_datastore to drill into a specific datastore's hosts, VMs and alarms.' It also draws an out-of-scope boundary by handing remediation ('delete snapshots, storage vMotion') to another agent (vmware-aiops), which tells the agent when not to act here.

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 investigate_vm / investigate_host instead: they return the same events correlated with that object's state in one call. ESXi syslog lines are not events — use scan_host_logs 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.8/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, yet the description discloses behavior they cannot: a 5000-event read cap with read_truncated/read_note, severity 'unknown' events returned rather than filtered and counted in 'unclassified', and the trap that empty items with non-zero unclassified is not an all-clear. This is exactly the extra context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the core purpose and the truncation caveat before the routing advice. It is long, but nearly every sentence encodes a distinct failure mode (truncation, unclassified, routine folding) rather than padding, so length is justified rather than wasteful.

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, and the description compensates by naming the return envelope fields (read_truncated, read_note, unclassified, classification_note, routine_folded) and their semantics. For a complex, open-world read tool this is complete enough to call and interpret 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantic guidance beyond the schema: it explains why to narrow 'hours' (truncation means the oldest events were never examined) and how severity ranking works (skill ranking, else vCenter catalogue, else 'unknown' still returned). It does not restate the start/end interaction the schema already covers.

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: '[READ] Get recent vCenter/ESXi events filtered by severity.' It also names the siblings it is not (investigate_vm/investigate_host) and the adjacent log tool (scan_host_logs), so an agent can distinguish it 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?

Explicit routing: use for an inventory-wide event sweep; when the object is known, prefer investigate_vm/investigate_host; ESXi syslog lines are not events, use scan_host_logs. All three conditions (when, when-not, alternative) are stated.

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

get_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.5/5.0
Behavior5/5

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

Beyond the annotations' safety profile, the description discloses important behavioral traits: ESXi 8.0U3+/9.x requirements, the pyVmomi field read, older hosts reporting 'unknown', and the meaning of 'noTiering' as a real checked result rather than missing data. This is rich context that materially affects interpretation.

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 well-structured with a [READ] tag, 'When to use', 'Returns', and 'Gotchas' sections. Every sentence adds useful information, and key constraints 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?

Even without an output schema, the description fully explains the return envelope and row fields, including edge-case values like uplift_ratio None and tiering_type 'noTiering'. It covers version prerequisites and invariant semantics, so an agent has everything needed to invoke and interpret the 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, target, and host_name. The description adds no parameter-specific syntax, defaults, or edge cases beyond what the schema provides, making the baseline score 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: per-host memory tiering and NVMe uplift ratio. It also states the unique value ('only source of measured tier byte sizes'), distinguishing it from sibling host tools like get_host_performance or list_esxi_hosts.

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?

It gives a clear 'When to use' scenario and notes it is the only source of measured tier byte sizes, which effectively rules out alternatives. However, it does not explicitly state when-not-to-use or name any alternative tool for similar host-level information.

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

get_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 investigate_host to drill into it, or get_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?

Annotations already declare readOnly/idempotent/non-destructive, and the description still adds substantial behavioral context beyond them: 20-second sampling cadence, point-in-time only with no historical trend, disconnected or provider-less hosts being skipped rather than reported as zero, and busiest-first ordering. The 'skipped, not zero' detail is exactly the kind of edge case that prevents misreading a result.

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?

Three short paragraphs, front-loaded with the read-only marker and the resource, then the differentiating metrics, then the routing advice. No sentence is filler and each carries distinct 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?

There is no output schema, so the description carries the return-value burden and does it: the list envelope with a real total, the precise metric field names, and the sort order. Combined with the safety annotations and full schema coverage, an agent has everything needed to call and interpret this tool.

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 limit, target, and host_name are already documented in the schema, and the description adds little about them directly. It does imply ordering ('busiest first') which interacts with how limit truncates results, but that is marginal. Baseline 3 applies when the schema does the heavy lifting.

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 ('real-time CPU/memory/disk/network utilisation per ESXi host') and enumerates the exact metrics returned. It explicitly distinguishes itself from the sibling list_esxi_hosts by labelling that tool as static config versus this one as LIVE PerfManager data, so an agent can choose without opening either 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 find which host is hot, then investigate_host to drill into it, or get_vm_performance to see which VMs on it are driving the load.' It also names the condition that rules it out in favor of list_esxi_hosts (static config vs live metrics).

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 get_host_performance, and follow up on a red sensor with investigate_host 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 cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial context beyond them: the list envelope shape, the per-row fields, and crucially the warning that missing rows do NOT mean healthy hardware, plus the hosts_without_sensors / cim_server_running explanation and the instruction to quote sensors_note. This is exactly the kind of misinterpretation guard the annotations cannot express.

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?

Front-loads the [READ] marker and the core action, then layers return shape, the negative-result caveat, and routing guidance in short, dense sentences. No filler; every sentence carries operational 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 carries the return-value burden and does so fully: envelope with total, per-row fields, and the hosts_without_sensors structure. Combined with the safety annotations and 100% param coverage, an agent has everything needed to call and interpret this tool.

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 parameters (limit, target) are already documented in the schema. The description adds no syntax, defaulting, or filtering detail beyond that, so the baseline 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?

States a specific verb and resource ([READ] Get hardware sensor status) with the exact data domain (temperature, voltage, fan) and scope (all hosts). It explicitly distinguishes itself from the closest sibling, get_host_performance, which handles CPU/memory load rather than physical hardware sensors.

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 when-to-use ('physical hardware only'), names the alternative for the adjacent use case (get_host_performance for CPU/memory load), and prescribes a concrete follow-up workflow (investigate_host after a red sensor). Both routing decisions an agent faces are covered.

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 get_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.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so safety is covered structurally. The description adds genuinely useful behavior: it returns a list envelope, guarantees 'truncated' is always False because every matching host is enumerated, and clarifies that all mutating service operations are out of scope. It stops short of documenting error/auth behavior, so not a full 5.

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?

Front-loaded with a [READ] marker and the core verb-resource pair, then return shape, then routing guidance in three tight sentences. No sentence is redundant; each adds a distinct fact (what, what it returns, when to use something else).

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, but the description compensates by naming the envelope and every row field plus the truncated flag guarantee. Combined with the sibling routing and write-exclusion notes, an agent has everything needed to call and interpret this tool.

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%: both 'target' (vCenter/ESXi target, default if omitted) and 'host_name' (exact-name filter, None = all hosts) are already documented in the schema. The description's 'Every matching host is enumerated' only loosely reinforces the host_name semantics without adding format or syntax detail, so the baseline 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?

States a specific verb and resource ('Get host service status') and immediately enumerates the returned fields (host, service key, label, running, policy). It also names the sibling it should not be confused with (get_ntp_status) and the write-capable alternative (vmware-aiops), so an agent can distinguish it 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?

Explicit when-to-use ('check whether SSH, NTP or the firewall service is in the expected state'), an explicit alternative with its selection condition ('For NTP specifically prefer get_ntp_status, which also reports the configured servers'), and an explicit exclusion ('Starting or stopping a service is a write — this skill cannot do it').

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

get_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 get_certificate_status and get_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.4/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive, and the description adds genuinely new behavioral context: 'truncated' is always False (complete inventory), license keys are never returned, and 'assignments' is null with a note when the account lacks read permission. It also flags that assigning a license is a write, which the read-only annotations would not convey.

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 one-line purpose, then return shape, then usage. Information-dense and mostly waste-free, though it runs long across several sentences and the assignments/expiry explanation could be tightened.

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 carries the full burden of describing returns and does so thoroughly (row fields, envelope, unlimited flag semantics, assignments behavior). An agent has everything needed to 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?

Single optional 'target' parameter with 100% schema description coverage, so the schema already documents it. The description never mentions 'target' or its default-to-config behavior, adding no meaning beyond the schema — baseline 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 a specific verb+resource+scope: '[READ] vCenter/ESXi license inventory with usage and expiry.' An agent can distinguish this from sibling read tools immediately, and the field list (edition_key, total/used units, expiration) further nails down the resource.

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?

Explicitly names the use case ('catch over-allocation or an approaching expiry') and positions itself in a platform-hygiene sweep alongside get_certificate_status and get_ntp_status. No when-not-to-use or exclusion guidance, which is the only gap.

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

get_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 and hosts_unreadable counts (with unreachable_note / unreadable_note) before reporting the estate as healthy. Unreachable: vCenter cannot reach the host (reachable false). Unreadable: this account cannot read the host's state (reachable null) — not known to be down.

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.6/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), yet the description adds substantial non-obvious context: truncated is always False, null-vs-false semantics for unreadable hosts, hosts_unreachable/hosts_unreadable envelope counts, and ntp_sources_consistent cross-host comparison. This is exactly the behavioral detail annotations cannot express.

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-loads the purpose and the return envelope, then handles edge cases in dense but relevant prose. It is long, but nearly every sentence addresses a real semantic trap (null vs false, unreachable vs unreadable); minor tightening is possible but little is 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?

No output schema exists, so the description must carry the return contract — and it does, enumerating each row field, the healthy flag logic, and the envelope-level counts/notes. Nothing an agent needs to call and interpret this correctly 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% and both params (target, host_name) are already documented in the schema, so baseline 3 applies. The description adds no syntax or format detail beyond what the schema states for these two filters.

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 ("Per-host NTP configuration health (servers + ntpd service state)") and immediately distinguishes itself from the closest sibling by noting the SOAP API does not expose clock offset. An agent can tell exactly what this returns versus get_host_services without opening the schema.

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

Usage Guidelines5/5

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

Explicit routing: "Prefer this over get_host_services for time problems," plus the exclusion (not for live offset — use esxcli) and the write boundary ("Fixing NTP is a write; use vmware-aiops"). This covers when-to-use, when-not, and alternatives all in one place.

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

get_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 get_vm_performance to see which VMs in it are demanding, or get_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?

Annotations already establish read-only/idempotent/non-destructive, and the description adds substantial context on top: the list envelope with a real total, the exact field set, descending-memory ordering, the -1 sentinel meaning 'unlimited', and the caveat that pool names are not cluster-qualified. That last point is a non-obvious data trap an agent needs.

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 [READ] tag and usage trigger are front-loaded and the prose is largely waste-free, though the mid-paragraph enumeration of every returned column is somewhat heavy. With no output schema that detail arguably earns its place, but it reads more densely than necessary.

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 carries the return-value burden — envelope shape, columns, ordering, sentinel semantics — plus the known ambiguity caveat and usage routing. Nothing needed to call and interpret it correctly 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% and both 'limit' and 'target' are documented in the schema. The description adds nothing specific beyond this — the 'limit of -1' line refers to a returned field, not the limit parameter — so the baseline 3 applies while the schema does the work.

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 opening verb+resource is exact: per-resource-pool CPU/memory reservation, limit, and current usage. It names the concrete row fields and the sort order, so an agent immediately knows what this returns and how it differs from cluster- or VM-level 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?

It gives an explicit trigger ('a VM is throttled but its host is not busy — the cap is usually the pool') and routes to named alternatives (get_vm_performance for which VMs, get_cluster_health_summary for the cluster picture). This is genuine when-to-use plus alternatives.

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

get_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.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/idempotentHint, and the description goes well beyond them: it explains the response envelope {available, note, fields}, that available:False signals a 503 or pre-9.1 vCenter with reason distinguishing them, and that this is not a failure condition. This is exactly the failure-mode disclosure an agent needs and cannot get from structured fields.

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-loads the [READ] marker and purpose, then uses short labeled blocks (When to use, What it returns, Gotchas) so an agent can scan the relevant part. Slightly redundant between the "What it returns" and "Gotchas" mentions of the 9.1/available:False behavior, keeping it short of 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 present, the description fully covers the return envelope and its non-obvious sentinel value, plus the version prerequisite that gates the endpoint. Nothing an agent needs to interpret a result or diagnose an empty response 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?

Only one optional parameter (target) with 100% schema description coverage, so the schema already carries its meaning. The description adds no syntax, defaulting, or target-selection detail beyond the schema, which is the expected baseline when the schema is complete.

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?

Names a specific verb and resource (read vCenter appliance deployment size) and immediately scopes it against the rest of the toolset by noting it covers capacity-planning context that inventory/perf tools do not. An agent can tell it apart from list_all_* and get_*_performance siblings without opening the schema.

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

Usage Guidelines5/5

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

Includes an explicit "When to use" block and states what this tool covers that inventory/perf tools do not, giving both the selecting condition and the boundary against adjacent categories. No ambiguity about when to reach for it.

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

get_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 list_vm_snapshots or find_aging_snapshots.

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.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), but the description adds far more: it is a lower bound, not a duration; duplicate VM names raise rather than resolve; the in-flight creation task is invisible; and it flags history_unavailable / coverage_note / window_fully_covered as fields an agent must read before reporting an all-clear. This is unusually rich disclosure beyond structured fields.

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 one-line purpose before any caveats, and virtually every sentence carries a real misinterpretation hazard (unmatched rows, open cycles, duplicate names). It is still very long and dense for a single read tool, and a few clauses could be trimmed without losing guidance.

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 describing the return shape — and it does: rollup vs list envelope, the four hour statistics, latest/longest cycle, unmatched rows, and the three sentinel fields. Nothing an agent needs to interpret the result correctly 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, but the description adds meaning the schema does not: it explains that the returned counts can describe a shorter period than the 'days' argument asked for due to task.maxAge retention, tying the days parameter to an expiry semantic. It also ties limit to include_cycles, though that is largely already in 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 opening line states a specific verb, resource and unit ('how long backups held a snapshot open on one VM, from task history'), and the description later names the sibling tools it is not (list_vm_snapshots, find_aging_snapshots). An agent can distinguish it from every other VM/snapshot tool without opening a schema.

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

Usage Guidelines5/5

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

It gives explicit routing: 'For snapshots that exist right now use list_vm_snapshots or find_aging_snapshots,' and frames the tool's niche (recovering the backup window from vCenter task history without backup-server credentials). When-to-use is stated positively and negatively.

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

get_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 get_vm_performance, and for the same VM correlated with its host, alarms and events use investigate_vm.

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.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds behavior beyond them: the return is a single detail dict rather than a list envelope, coverage is static configuration only, and an unknown name yields a teaching error instead of an empty match. That error semantics disclosure is exactly the kind of thing annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the verb+resource, then routing, then the input constraint; every sentence carries routing or error information. The '[READ]' prefix is mildly redundant with readOnlyHint=true, keeping it just short of 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 explicitly describes the return shape (single detail dict, not a list envelope) and what it does and does not cover (static config vs. live performance). Everything an agent needs to call this correctly is present.

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 goes further by stressing that vm_name must be the exact name and by describing the failure mode for a wrong name, which materially shapes how the agent supplies the argument. It says nothing extra about target, but that parameter is already documented as an optional config default.

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 (Get) and resource (one VM) and enumerates the returned fields (CPU, memory, disks, NICs, snapshots). It explicitly distinguishes itself from get_vm_performance, investigate_vm, and list_virtual_machines, so an agent can route correctly 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 when-to-use ('when you already know the exact name'), a prerequisite workflow ('get it from list_virtual_machines first'), named alternatives for other needs, and a when-not clause ('Reconfiguring the VM belongs to vmware-aiops'). 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.

get_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 get_vm_info, and to see the same VM correlated with its host, alarms and events use investigate_vm.

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.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial behavior beyond them: only powered-on VMs (no real-time provider) are returned, results are point-in-time, ordering is busiest-first, the list envelope carries total/truncated, and it discloses a metric pitfall (mem_usage_pct can read low under pressure; balloon/swapped are the real pressure signals) plus a counters field mapping.

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 '[READ]' tag front-loads the operation type and the rest is dense with no filler, though the mem_usage_pct/counters passage is long enough to slightly dilute the core routing message. Every sentence carries actionable information, so nothing is truly 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?

No output schema exists, yet the description fully explains the return shape (list envelope with real total and truncated, named live fields, counters mapping) and the powered-off exclusion. An agent has everything needed to call and interpret it.

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; however the description adds meaning beyond the schema by tying the default limit of 25 to the 'truncated' flag semantics and clarifying that an omitted vm_name covers all powered-on VMs, which the schema does not state.

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+resource ('Real-time CPU/memory/disk/network utilisation per virtual machine') and explicitly distinguishes itself from siblings by naming get_vm_info and investigate_vm with their respective scopes. An agent can select it correctly 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: 'Use this to rank load across VMs; for one VM's configuration use get_vm_info, and to see the same VM correlated with its host, alarms and events use investigate_vm.' Names the alternatives and the condition selecting each.

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

investigate_datastoreA
Read-onlyIdempotent

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

Use this instead of stitching list_all_datastores + get_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 get_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 get_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 declare readOnly/idempotent/non-destructive, and the description adds real context beyond them: reads are batched, returns a correlated bundle rather than the list envelope, excludes per-datastore latency, is a point-in-time snapshot with no trending, and unknown names yield a teaching error.

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?

Front-loaded scope statement, then alternative-routing, then bundle contents, then boundaries — every sentence earns its place and there is no filler. Length is justified by the composite return.

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 enumerates the returned bundle (capacity/free space/accessibility, mounting hosts, VM rollup, alarms, merged event timeline) and states what is excluded, so an agent knows exactly what it gets back.

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 hours, target, and datastore_name are already documented structurally; the description adds only the provenance hint for datastore_name (from list_all_datastores or get_datastore_capacity). Baseline 3 is appropriate where the schema carries the parameter burden.

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?

Specific verb (investigate) plus resource (datastore), and it explicitly frames the tool as a correlated drill-down that replaces stitching four named sibling tools together. An agent can distinguish this from list_all_datastores, get_datastore_capacity, get_alarms, and get_events 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?

Explicit when-to-use ('Reach for it after get_cluster_health_summary flags storage pressure'), explicit alternative-avoidance ('instead of stitching ... yourself'), and explicit when-not / hand-off ('Freeing space ... belongs to vmware-aiops'). 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.

investigate_hostA
Read-onlyIdempotent

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

Use this instead of stitching list_esxi_hosts + get_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 get_cluster_health_summary flags a host. Point-in-time snapshot — no trending; for syslog lines use scan_host_logs. 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 get_cluster_health_summary first.

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 safety. The description adds real beyond-annotation context: point-in-time snapshot with no trending, batched reads, and a note that unknown host names produce a teaching error. It does not, however, describe pagination or size/rate characteristics of the merged timeline.

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?

Front-loaded with the core question, followed by the replacement statement, the return shape, the trigger condition, and routing to alternatives. Every sentence earns its place with no 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?

For a read-only aggregator with no output schema, the description covers what comes back, how to interpret it ('operational language; do not dump it raw'), when to invoke it, and where to go for log-level detail or corrective action. An agent has everything needed to call and use 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 host_name, hours, and target are all documented in-schema (including the default 24h look-back and the teaching-error behavior). The description itself adds little parameter-level detail beyond naming the bundle contents, so the schema 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 a specific question and verb ('one correlated drill-down'), then enumerates exactly what the bundle contains (host state, cluster, VM rollup, datastores, alarms, performance, merged timeline). This clearly distinguishes it from siblings like get_host_performance or get_events, which it explicitly says it replaces.

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 when-to-use ('after get_cluster_health_summary flags a host'), when-not-to-use ('for syslog lines use scan_host_logs'), and routes action-taking elsewhere ('maintenance mode, evacuate belongs to vmware-aiops'). It also names the four tools it stitches together. 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.

investigate_vmA
Read-onlyIdempotent

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

Use this instead of stitching get_vm_info + list_vm_snapshots + get_alarms + get_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 get_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 get_cluster_health_summary first.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description focuses on behaviors they can't express: it returns one correlated bundle rather than the list envelope, all reads are batched, it is a point-in-time snapshot with no trending, and unknown VM names return a teaching error. Only gap is that it doesn't hint at cost/latency or size of the merged timeline.

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 question it answers and the replacement claim, then return shape, then invocation triggers, then boundary. Every sentence carries distinct information, though the list of covered data sources is dense and could be trimmed.

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 carries the return-value burden and does so thoroughly: VM state, host, cluster, datastores, snapshots, alarms, live performance, and a newest-first merged event timeline. It also instructs how to present the result ('explain it in operational language; do not dump it raw'), which is unusual and useful.

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 every parameter is already documented there, including the default 24-hour window and the source for vm_name. The description adds only marginal param context ('merged event timeline' implying the hours window drives it), so the baseline 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?

States a specific verb (investigate/drill-down) and resource (this VM) with explicit scope: 'one correlated drill-down'. It directly distinguishes itself from the composite siblings it replaces (get_vm_info, list_vm_snapshots, get_alarms, get_vm_performance, get_events) and from investigate_host/investigate_datastore by naming the VM as the object.

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 routing: use it instead of stitching five specific sibling calls, reach for it after get_cluster_health_summary flags a problem VM, or on a 'what's going on with <vm>?' question. It also draws a clear boundary for when-not: acting on findings (power, migrate, delete snapshot) 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.

list_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 list_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.8/5.0
Behavior5/5

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

Annotations cover read-only/idempotent/non-destructive, and the description goes well beyond them: it discloses the required Sessions privilege, the graceful-degradation behavior for low-privilege accounts (single explanatory row instead of a traceback), and the default folding of vCenter solution users into service_sessions. That is exactly the privileged-operations context an agent needs.

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 core purpose, then return fields, then usage guidance. The row-field enumeration (user_name, full_name, login_time, ...) is dense but earns its place given there is no output schema. Slightly long, but no filler sentences.

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 enumerating the row fields and the envelope's total, plus the current flag and service-session folding. Permissions, targeting and the read-only boundary are all covered, so nothing an agent needs to invoke this correctly 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, but the description adds real semantic value for include_service by explaining that solution users are folded by default and surfaced in the service_sessions count. It does not add anything for limit or target, but the default-behavior clarification lifts it above 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?

Opens with a specific verb and resource: 'Currently authenticated vCenter/ESXi sessions (who is logged in).' The scope is unambiguous and it is clearly distinguishable from sibling monitoring tools like list_all_clusters, and it explicitly names list_active_tasks as a related-but-different tool.

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 an explicit purpose statement ('Use this to attribute a change to a person'), names the complementary sibling (list_active_tasks, which names the user who started each task), and states a boundary ('terminating a session is not supported here'). When-to-use and when-not-to-use are both covered.

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

list_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, then newest first — so limit drops the oldest. 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 get_host_performance shows. Pair with list_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.8/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive), but the description adds non-obvious behavior: the short vCenter recent-task retention window, ordering (running/queued first, then newest), and the consequence that limit silently drops the oldest rows. It also describes the return envelope and the truncated flag, none of which the annotations convey.

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-loads the [READ] tag and the core question, then layers in ordering, envelope, and retention details efficiently. Slightly redundant in restating read-only ('[READ]' plus 'Read-only') already covered by annotations, but no sentence is wasted overall.

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 describing the return envelope and per-row fields, plus truncation and retention caveats. Nothing an agent needs to call or interpret this correctly 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 description coverage is 100%, so the baseline is 3. The description still adds meaning by explaining that ordering makes limit drop the oldest records and that include_recent pulls in just-completed/failed tasks, which the terse schema labels do not convey.

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 in-flight vCenter tasks) and frames the question it answers ('why is the cluster busy?'). It explicitly distinguishes itself from siblings get_host_performance and list_active_sessions, so an agent can select it without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('Use this before blaming load'), the alternative it complements (get_host_performance) and the pairing tool (list_active_sessions) to attribute the task to a user. It also routes the out-of-scope action (cancelling a task) to vmware-aiops.

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. Each row's moid (e.g. domain-c123) is the cluster id the vLCM patch tools take. Static topology only — use this to resolve a cluster name, then get_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, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuine context beyond that: it returns a list envelope with a real total, rows carry a moid (e.g. domain-c123) that is the cluster id consumed by vLCM patch tools, and the data is static topology only. Pagination behavior with the limit parameter is left implicit, which keeps it from a 5.

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 [READ] tag and the purpose sentence are front-loaded and the second paragraph is dense but each clause earns its place (return shape, id semantics, alternative routing). Slightly heavy phrasing ('supersedes stitching this with...') keeps it short of 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 carries the burden of describing returns and does so: list envelope with total, row fields, and the moid identifier. Combined with the routing guidance to get_cluster_health_summary, an agent has everything needed to call and interpret this tool.

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 limit and target are already documented in the schema; the description adds no syntax or format guidance for them. The moid explanation is about return values, not parameters, so the baseline 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?

States a specific verb and resource ('List clusters') plus the exact row contents (host count, DRS/HA status, resource totals), and explicitly contrasts itself with get_cluster_health_summary and the manual stitching of list_esxi_hosts/get_alarms. An agent can distinguish it from every sibling without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use ('use this to resolve a cluster name'), a when-not ('static topology only'), and names the superseding alternative (get_cluster_health_summary) along with the anti-pattern it replaces. 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 get_datastore_capacity for thin-provisioning over-commit risk or investigate_datastore 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 readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds meaningful behavior beyond that — it returns raw free/used values only (no derived over-commit analysis) and the list envelope reports a real total rather than a truncated count. It does not mention auth/permission requirements or rate limits, so it stops short of a 5.

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?

Front-loaded with the [READ] marker and the core purpose, then a second sentence devoted entirely to routing. Two sentences, no filler; the minor [READ] redundancy against readOnlyHint costs nothing.

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 carries return-shape responsibility and does so: it enumerates the fields returned and notes the envelope's total semantics. For a simple two-parameter list call with full annotation coverage, nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% — limit (None = all) and target are already documented in the schema. The description adds no syntax, default, or format detail beyond that, so the baseline 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?

Specific verb+resource ("List datastores") plus the exact fields returned (capacity, free space, type, VM count). It explicitly names the two sibling tools it is not (get_datastore_capacity, investigate_datastore), so an agent can distinguish it 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?

Gives an explicit routing rule: use this first to resolve a datastore name, then get_datastore_capacity for thin-provisioning over-commit risk, or investigate_datastore to drill into one datastore. Both the when-to-use and the when-to-use-something-else conditions are stated.

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 get_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.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond that: the envelope carries a real 'total', and the response deliberately omits VLAN, uplink, and NSX overlay detail, which preempts wrong assumptions about richness. It doesn't address pagination behavior, keeping it short of a 5.

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?

Three sentences, zero filler, with the read-only marker and resource leading. The scope limitation and the routing to siblings each earn their 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?

With no output schema, the description carries the return-value burden and does so by naming the returned fields and the real total. It stops short of explaining ordering or pagination semantics tied to 'limit', which is the only remaining ambiguity for a two-optional-param list tool.

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 parameters (limit, target) are already fully documented in the schema. The description adds no parameter-level syntax or defaulting nuance, so the baseline 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?

States a specific verb and resource ('List networks') and enumerates the returned fields (name, vm_count, accessibility), plus explicitly scopes out VLAN/uplink/NSX overlay detail. An agent can distinguish this from list_all_clusters, list_all_datastores, and NSX tooling 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 an explicit use case and workflow: resolve a port-group name here, then call get_vm_info for the NICs of one VM. It also names an exclusion ('NSX segments live in vmware-nsx'), so the agent knows when not to use it and where to go instead.

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 get_host_performance for live load or investigate_host to drill into one host.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax hosts 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 readOnly/idempotent/non-destructive, but the description adds real value beyond them: the '[READ]' marker, the warning that returned values are static config only (cores, total GB) not live load, and the note that 'total' in the envelope is the real host count even when 'limit' truncates the list. It stops short of describing other envelope fields or auth/target-resolution behavior, so it is strong but not complete.

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?

Two short sentences plus a parenthetical; the scope and return contents are front-loaded and the sibling routing comes last. No sentence is filler.

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?

With no output schema, the description carries the burden of explaining returns and does so reasonably: it enumerates the core host fields and clarifies the envelope's 'total' semantics. It could say more about the remaining envelope structure or how targets resolve, but an agent has enough 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% and both parameters ('limit', 'target') are already documented with defaults, so the description need not re-explain them. It adds only an indirect hint about truncation via the 'total' remark, which is baseline-level value here.

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 ESXi hosts') plus the exact fields returned (CPU cores, memory, version, VM count, uptime). It also distinguishes itself from nearby inventory siblings by scoping to hosts and their static config. An agent can identify this as the host-inventory tool without opening the schema.

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

Usage Guidelines5/5

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

Explicitly names the two conditions and alternatives: use this to resolve a host name, then get_host_performance for live load, or investigate_host to drill into a single host. This routes the agent between three related tools with no inference required.

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 get_vm_info for detail or investigate_vm to drill into one; for a fleet-wide view start at get_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?

With annotations already declaring readOnly/idempotent/non-destructive, the description goes well beyond: it discloses the truncated result envelope, that `total` is post-filter, that >50 VMs with no limit/fields returns only the first five fields (mode says which), and that `vms` is a deprecated pre-1.8.0 alias removed in 2.0. These are real behavioral constraints an agent would otherwise miss.

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 purpose and routing, and every sentence carries behavioral weight. The envelope-key enumeration is slightly dense and could be trimmed, but it substitutes for a missing output schema, so it 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?

This is a 7-param, no-output-schema listing tool, so the description must carry the return-shape burden — and it does, naming the envelope keys, the truncated flag, the mode field, and the deprecated alias. Nothing an agent needs to call and interpret it correctly 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, but the description adds genuine meaning: it explains the limit/fields interaction that triggers truncation and singles out name_filter as the tool's intended mechanism for locating a VM by name. That is value beyond the per-parameter 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?

Opens with a specific verb+resource and scope ("List virtual machines, with filtering, sorting, and field selection") and immediately distinguishes itself from siblings by naming get_vm_info, investigate_vm, and get_cluster_health_summary as the routes for other needs. An agent can tell exactly what this tool is for without opening the schema.

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

Usage Guidelines5/5

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

States a concrete use case ("resolve an exact VM name") and explicit routing: get_vm_info for detail, investigate_vm to drill in, get_cluster_health_summary for a fleet-wide view. Alternatives are named with the conditions that select them, leaving nothing to inference.

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

list_vm_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 find_aging_snapshots 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.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuine beyond-annotation context: the return envelope shape, level semantics, empty-items meaning, and the teaching-error behavior on unknown 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] marker and purpose, then return semantics, then routing guidance. A couple of phrases (the truncated-False explanation) are slightly verbose but each sentence carries useful information.

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?

For a read-only list tool with no output schema, the description supplies return structure, level semantics, empty-result meaning, error behavior, and alternative-tool routing. Only minor gaps remain, such as pagination/truncation mechanics beyond the empty-items note.

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 both parameters (target, vm_name) are already documented in the schema. The description notes vm_name must come from list_virtual_machines and that an unknown name yields a teaching error, which is mild added meaning over the schema 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?

Specific verb+resource ('List all snapshots of one VM') with explicit scope ('including the nesting hierarchy'). It distinguishes itself from siblings by naming find_aging_snapshots as the sweep alternative and confining itself to one known VM.

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?

Clearly states when to use this (one known VM) versus find_aging_snapshots (whole-inventory sweep), and routes the agent to list_virtual_machines for the name. Lacks explicit when-not conditions beyond the sibling contrast, 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.

scan_host_logsA
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 investigate_host 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.6/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly/idempotent/non-destructive), and the description adds substantial context beyond them: grouping behavior and what each mode returns, that total is null by design, that logs_unavailable enumerates unreadable hosts (with the Global.Diagnostics permission example), that empty items is only meaningful when logs_unavailable is empty, and that every call re-reads the last lines afresh. Missing only explicit rate-limit or cost expectations for large lines values.

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?

Effectively front-loaded, with the purpose in sentence one and usage guidance placed after the return-shape detail. It is on the long side with several dense parentheticals (severity tokens, envelope fields), but with no output schema almost all of that text is load-bearing rather than 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?

Absent an output schema, the description fully specifies the return envelope ({items, returned, limit, total, truncated, hint}), the per-mode item shapes, the null-total caveat, and the logs_unavailable contract. Four optional parameters plus a mutation-free read operation are covered adequately; nothing an agent needs to call this correctly 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 baseline is 3, but the description adds real meaning on top: it explains the differing row shapes produced by group=true vs group=false, the default grouping rationale, and the exact-match failure semantics of host_name. It is more than a restatement of the schema descriptions.

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 ('[READ] Scan recent ESXi host syslog lines for error/warning patterns') and immediately distinguishes itself from siblings by naming get_events and investigate_host as a different data source ('vCenter events and ESXi syslog are different sources'). An agent can route between this and the event tools 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?

States the trigger condition explicitly ('Use this when get_events or investigate_host show a host in trouble but not why') and names the alternatives. It also gives operational guidance — filter with host_name for speed on large clusters, get exact names from list_esxi_hosts, and warns that a non-matching name errors rather than returning empty.

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. 1 tool updatev2.3.0
    • Addedget_access_info
  2. 46 tool updatesv2.2.0
    • Removedactive_sessions
    • Removedactive_tasks
    • Removedcertificate_status
    • Removedcluster_health_summary
    • Removedcluster_last_apply_result
    • Removedcluster_patch_compliance
    • Removedcross_vcenter_attention
    • Removeddatastore_capacity
    • Removeddatastore_investigation_bundle
    • Addedfind_aging_snapshots
    • Addedget_certificate_status
    • Addedget_cluster_health_summary
    • Addedget_cluster_last_apply_result
    • Addedget_cluster_patch_compliance
    • Addedget_cross_vcenter_attention
    • Addedget_datastore_capacity
    • Addedget_host_memory_tiering
    • Addedget_host_performance
    • Addedget_license_status
    • Addedget_ntp_status
    • Addedget_resource_pool_usage
    • Addedget_vcenter_deployment_size
    • Addedget_vm_backup_snapshot_history
    • Addedget_vm_info
    • Addedget_vm_performance
    • Removedhost_investigation_bundle
    • Removedhost_log_scan
    • Removedhost_memory_tiering
    • Removedhost_performance
    • Addedinvestigate_datastore
    • Addedinvestigate_host
    • Addedinvestigate_vm
    • Removedlicense_status
    • Addedlist_active_sessions
    • Addedlist_active_tasks
    • Addedlist_vm_snapshots
    • Removedntp_status
    • Removedresource_pool_usage
    • Addedscan_host_logs
    • Removedsnapshot_aging
    • Removedvcenter_deployment_size
    • Removedvm_backup_snapshot_history
    • Removedvm_info
    • Removedvm_investigation_bundle
    • Removedvm_list_snapshots
    • Removedvm_performance
  3. 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"
        +}
  4. 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"
        +}
  5. 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
  6. 5 tool updatesv1.7.6
    • Addedcluster_health_summary
    • Addedcross_vcenter_attention
    • Addeddatastore_investigation_bundle
    • Addedhost_investigation_bundle
    • Addedvm_investigation_bundle
  7. 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
  8. 4 tool updatesv1.5.38
    • Addedget_host_sensors
    • Addedget_host_services
    • Addedlist_all_networks
    • Addedvm_list_snapshots
  9. 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"
        +}
  10. 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

TDQS

A4.2/5.0

Scored across 33 tools

Disambiguation4/5

The set layers list/get/investigate/performance tools for the same resources (VMs, hosts, datastores, clusters), so overlap exists, but descriptions explicitly route agents between them (e.g., list_virtual_machines to resolve a name, get_vm_info for config, investigate_vm for a correlated bundle). Most selections are clear, though a few depth-based choices remain easy to confuse.

Naming Consistency5/5

All names use snake_case verb_noun patterns with consistent prefixes: list_ for collections, get_ for details/metrics, investigate_ for correlated drill-downs, find_/scan_ for sweeps. Minor variance like list_all_clusters vs list_virtual_machines does not break the predictable convention.

Tool Count2/5

33 read-only tools is well above the practical 3–15 range and past the 25+ 'too many' threshold, creating significant selection overhead even for a broad vSphere monitoring domain. Each tool has a narrow niche, but the volume is heavy for an agent-facing set.

Completeness4/5

Coverage spans clusters, hosts, VMs, datastores, networks, snapshots, performance, alarms, events, sensors, services, logs, certificates, licenses, capacity, tasks, sessions, and newer vLCM/tiering endpoints. Gaps remain for vSAN health, vCenter appliance certificate, datastore latency, and historical trending, though agents can often work around these via other servers or vCenter directly.

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
    C
    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.
    12 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
    1,073 PyPI
    78
    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