VMware-Monitor
Read-only VMware vCenter/ESXi monitoring server for inventory, health triage, investigation, capacity, and platform hygiene — with no destructive operations.
List VMs, ESXi hosts, datastores, clusters, and networks with filtering, sorting, and field selection.
Get one-glance cluster health summaries and cross-vCenter "what needs attention" rankings.
Investigate a VM, host, or datastore with correlated state, infrastructure, alarms, performance, and event timelines.
Query active alarms and recent events with severity filtering, stale-alarm checks, and routine-event folding.
View live host and VM performance (CPU, memory, disk, network) and resource-pool reservation/limit usage.
Check hardware sensors, host services, NTP configuration, certificate expiry, and license status.
List snapshots, sweep for aging snapshots, and inspect backup snapshot-window history.
Scan ESXi host logs for error/warning patterns and list active tasks and authenticated sessions.
Inspect account privileges, host memory tiering, vLCM patch compliance/last apply result, and vCenter deployment size.
Render an optional MCP Apps cluster-health dashboard with read-only investigate actions.
Supports sending automated monitoring alerts and scheduled scan summaries to Discord channels via webhooks.
Supports sending automated monitoring alerts and scheduled scan summaries to Slack channels via webhooks.
Provides read-only monitoring and inventory management for VMware vCenter and ESXi environments, including virtual machines, hosts, clusters, datastores, and system health status.
VMware Monitor
For a read-only check of this skill with your model and agent host, use the shared model-fit self-test in the marketplace root.
Author: Wei Zhou, VMware by Broadcom — zhouwei008@gmail.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.pyparses every source file withastand requires each vSphere method the package calls to appear on a reviewed allowlist, cross-checked against pyVmomi's own type metadata: anything returning avim.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.yamland.env(viainit; plaintext passwords in.envare rewritten asb64:on load), audit logs (~/.vmware/audit.dbfor MCP, remote CLI calls and daemon operations; the legacy per-skill log remains),--htmlsnapshots in~/vmware-health/, and — only afterdaemon start—daemon.pid,scan.log, and posts to a webhook you configured. Full table: setup guide.
Companion Skills
Skill | Scope | Tools | Install |
vmware-aiops ⭐ entry point | VM lifecycle, deployment, guest ops, clusters | 49 |
|
Datastores, iSCSI, vSAN | 11 |
| |
Tanzu Namespaces, TKC cluster lifecycle | 20 |
| |
NSX networking: segments, gateways, NAT, IPAM | 33 |
| |
DFW microsegmentation, security groups, Traceflow | 21 |
| |
Aria Ops metrics, alerts, capacity planning | 28 |
| |
AVI (NSX ALB) load balancing, AKO on Kubernetes | 28 |
| |
Compliance baselines, drift detection (read-only) | 6 |
| |
Centralized syslog search, aggregation, alerts | 7 |
| |
Incident timeline correlation, root cause | 2 |
| |
Multi-step workflow orchestration, approval gates | 13 |
|
Skills.sh examples pin skills@1.7.6 (Node.js >=22.20.0) separately from the repository release tag. These pins do not lock transitive dependencies.
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 |
| Every cluster's hosts + VM power + live CPU/mem + alarms → ranked top-N issues + per-cluster status |
"What needs attention now?" across all vCenters |
| Every configured vCenter merged into one globally-ranked issue list; unreachable targets degrade gracefully |
"What's happening around this VM?" |
| VM state + host it runs on + cluster + backing datastores + snapshots + alarms + performance + a merged event timeline |
"What's happening around this host?" |
| Host state + cluster + the VMs it runs + mounted datastores + alarms + performance + correlated timeline |
"What's happening around this datastore?" |
| 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.
Evidence fields
Host investigation includes the exact ESXi build, or null when unreadable. Ungrouped host-log findings
use the original log timestamp for time and a separate observed_at for the scan time; a missing log
timestamp remains null. Patch reads retain nested base_image and components evidence, with explicit
markers when large or deeply nested metadata is omitted.
The health summary includes the connected endpoint's api_type, version and
build, distinct from ESXi hosts in its inventory. Interactive log scans accept
selected diagnostic keys: scan_host_logs(log_keys=["hostd", "vobd"]) or
vmware-monitor scan logs --log-key hostd --log-key vobd. Defaults remain
hostd/vmkernel/vpxa. Unavailable logs are reported as coverage gaps; keys are
API identifiers, never file paths.
MCP Apps cluster health view (2.5.0)
get_cluster_health_summary also advertises ui://vmware-monitor/cluster-health.html to MCP Apps hosts. A supporting host can render a live cluster dashboard and use its Investigate buttons to call the read-only host or datastore tool through the same MCP server, role, Policy and audit path. The HTML is self-contained and renders vSphere names as text. Hosts without MCP Apps support receive the same tool result as before. The view and real vCenter data have been verified through the production loopback HTTP transport; visual rendering in a current third-party host remains to be verified. This is separate from the CLI's offline --html snapshot.
Quick Install (Recommended)
Works with Claude Code, Cursor, Codex, Gemini CLI, Trae, and 30+ AI agents:
# Via Skills.sh
npx skills@1.7.6 add vmware-skills/VMware-Monitor#v2.6.0
# Via ClawHub
clawhub install @zw008/vmware-monitorPyPI Install (No GitHub Access Required)
# Install via uv (recommended)
uv tool install vmware-monitor==2.6.0
# Or via pip
pip install vmware-monitor==2.6.0
# China mainland mirror (faster)
pip install vmware-monitor==2.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simpleOffline / 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-monitorCapabilities (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 ──→ VMsVersion Compatibility
vSphere / VCF Version | Support | Notes |
VCF 9.1 / vSphere 9.1 | ✅ Full | Released 2026-05-12. pyVmomi |
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
SDKs: https://developer.broadcom.com/sdks — VCF Python SDK (recommended for VCF 9+, bundles pyVmomi + vSAN SDK), vSphere Automation SDK for Python
REST APIs: https://developer.broadcom.com/xapis — vSphere Automation API, VCF API
CLI Tools: https://developer.broadcom.com/tools — PowerCLI 9.1, ESXCLI, OVF Tool
1. Inventory
Feature | vCenter | ESXi | Details |
List VMs | ✅ | ✅ | Name, power state, CPU, memory, guest OS, IP, |
List Hosts | ✅ | ⚠️ Self only | CPU cores, memory, ESXi version, VM count, uptime |
List Datastores | ✅ | ✅ | Capacity, free/used, type (VMFS/NFS), usage % |
List Clusters | ✅ | ❌ | Host count, DRS/HA status |
List Networks | ✅ | ✅ | Network name, associated VM count, accessibility — CLI |
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 |
Host Services | ✅ | ✅ | hostd, vpxa running/stopped status — CLI |
Account Access | ✅ | ✅ | Which account the server uses and whether it holds each tool's privileges on the root folder — CLI |
Monitored Event Types:
Category | Events |
VM Failures |
|
Host Issues |
|
Storage |
|
HA/DRS |
|
Auth |
|
3. VM Info & Snapshot List (Read-Only)
Feature | Details |
VM Info | Name, power state, guest OS, CPU, memory, IP, VMware Tools, disks, NICs, |
Snapshot List | List existing snapshots with name and creation time (no create/revert/delete) — CLI |
Backup Window | How long backups held a snapshot open on a VM, from vCenter task history — CLI |
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 |
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 |
Log Analysis | Host-log lines matching error, fail, critical, panic, lost access, cannot, timeout, refused, corrupt — lines with critical/panic/corrupt are |
Structured Log | JSONL output to |
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 |
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 |
Daemon Policy & Audit | Each target scan and webhook send checks Policy and writes to the unified audit database with |
Daemon Management |
|
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 ( |
Audit Trail | MCP tool calls and every CLI command that reaches vCenter logged to |
Password Protection |
|
SSL Self-signed Support |
|
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 |
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
Check alarms:
vmware-monitor health alarms --target prod-vcenterReview recent events:
vmware-monitor health events --hours 24 --severity warningList 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.
Start from triage:
vmware-monitor attention(all vCenters) orvmware-monitor summary(one)Drill into what it flags:
vmware-monitor investigate vm <name>(orhost/datastore)Widen the event window with
--hours 72; share it with--html(offline snapshot)If the name is unknown → the teaching error names how to list objects (
inventory vms/hosts,list_all_datastores)
Set Up Continuous Monitoring
Configure webhook in
~/.vmware-monitor/config.yamlStart daemon:
vmware-monitor daemon startDaemon 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
Run
vmware-monitor doctorto diagnoseVerify target hostname/IP and port (443) in
config.yamlFor self-signed certs: trust the CA; set
verify_ssl: falseonly 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 |
| Anthropic Claude |
Gemini CLI | ✅ Context file + MCP |
| Google Gemini |
OpenAI Codex CLI | ✅ Skill + AGENTS.md |
| OpenAI GPT |
Aider | ✅ Conventions |
| Any (cloud + local) |
Continue CLI | ✅ Rules |
| Any (cloud + local) |
Trae IDE | ✅ Rules |
| Claude/DeepSeek/GPT-4o |
Kimi Code CLI | ✅ Skill |
| Moonshot Kimi |
MCP Server | ✅ MCP Protocol |
| 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 | 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 |
✅ Self-hosted, any LLM | |||
✅ Ollama, LM Studio | |||
✅ Fully offline | |||
✅ Ollama, vLLM | |||
VS Code Copilot | — | ||
Cursor | — | — | |
Continue | ✅ Ollama | ||
Claude Code | — | — |
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 formatInstallation
Step 0: Prerequisites
# Python 3.10+ required
python3 --version
# Node.js 18+ required for Gemini CLI and Codex CLI
node --versionStep 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 targetsSet passwords via .env file (recommended):
cp .env.example ~/.vmware-monitor/.env
chmod 600 ~/.vmware-monitor/.env
# Edit and fill in your passwordsSecurity note: Prefer
.envfile over command-lineexportto avoid passwords appearing in shell history.config.yamlstores only hostnames, ports, and a reference to the.envfile — 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_PASSWORDStep 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@1.7.6 add vmware-skills/VMware-Monitor#v2.6.0
# or
clawhub install @zw008/vmware-monitorMethod 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 mcpRestart Claude Code, then:
> Show me all VMs on esxi-lab.example.comOption 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.mdFor 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 hostOption 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.mdThen start Codex CLI:
codex --enable skills
> List all VMs on my ESXiOption 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:32bOption 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.mdConfigure ~/.continue/config.yaml for local model:
models:
- name: local-coder
provider: ollama
model: qwen2.5-coder:32bThen:
cn
> Check ESXi health and alarmsOption 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.mdTrae 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.mdOption 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==2.6.0, 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 mcpClaude 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==2.6.0 vmware-monitor mcp
# Legacy entry point (still works, kept for backward compatibility)
vmware-monitor-mcpBehind a corporate TLS proxy? uvx may fail with
invalid peer certificate: UnknownIssuer. Use the recommendedvmware-monitor mcpform above (no network needed), or setUV_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-esxiUpdate / Upgrade
Already installed? Re-run the install command for your channel to get the latest version:
Install Channel | Update Command |
ClawHub |
|
Skills.sh |
|
Git clone |
|
uv |
|
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-coderQwen (Alibaba Cloud)
export DASHSCOPE_API_KEY="your-key"
aider --conventions skills/vmware-monitor/SKILL.md \
--model qwen/qwen-coder-plusLocal 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:32bCLI 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 statusConfiguration
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 |
|
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.tomlRelated Projects
Skill | Scope | Tools | Install |
Read-only monitoring, alarms, events | 27 |
| |
VM lifecycle, deployment, guest ops, clusters | 49 |
| |
Datastores, iSCSI, vSAN | 11 |
| |
Tanzu Namespaces, TKC cluster lifecycle | 20 |
|
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.comConnect 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.comand pass theAuthorizationheader through.Behind a load balancer or gateway on another machine, keep
--transport https(a self-signed certificate is fine), list in--public-namethe host name the balancer sends asHost, and have it forwardAuthorization. Its health probe can useGET /healthz, which needs no token and returns only{"status": "ok"}(vmware-policy ≥ 1.23.0).Send
traceparentorX-Request-IDwith each request to have it stored on the audit row;vmware-audit log --correlation-id IDthen finds the calls behind one platform request.The audit log records each caller as
token:<name>. Calls run side by side, with up toVMWARE_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 enableonce, then give each token a role (vmware-audit token create NAME --role reader, or a role inroles.yamlnaming 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").
System proxy bypass
The vCenter REST client honors the operating system proxy bypass list for the configured origin.
TLS verification still follows verify_ssl, and CA environment settings such as SSL_CERT_FILE remain active.
Other origins retain their normal proxy routing.
License
MIT
Available Tools
33 toolsfind_aging_snapshotsARead-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.
Inputs: limit, target, only_old, age_threshold_days.
get_access_infoARead-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.
Inputs: tool, target.
get_alarmsARead-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.
Inputs: limit, target.
get_certificate_statusARead-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.
Inputs: limit, target, warn_days.
get_cluster_health_summaryARead-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.
Inputs: top_n, target, include_vms, cluster_filter.
get_cluster_last_apply_resultARead-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.
Inputs: cluster (required), target.
get_cluster_patch_complianceARead-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.
Inputs: cluster (required), target.
get_cross_vcenter_attentionARead-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.
Inputs: top_n, cluster_filter.
get_datastore_capacityARead-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.
Inputs: limit, target.
get_eventsARead-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.
Inputs: end, hours, start, target, +2 more.
get_host_memory_tieringARead-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.
Inputs: limit, target, host_name.
get_host_performanceARead-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.
Inputs: limit, target, host_name.
get_host_sensorsARead-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.
interpretation_note bounds what a red aggregate memory sensor proves:
it does not identify a DIMM/slot, establish ECC errors, or predict failure.
Keep observed status separate from a component diagnosis.
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.
Inputs: limit, target.
get_host_servicesARead-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.
Inputs: target, host_name.
get_license_statusARead-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.
Inputs: target.
get_ntp_statusARead-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.
Inputs: target, host_name.
get_resource_pool_usageARead-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.
Inputs: limit, target.
get_vcenter_deployment_sizeARead-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.
Inputs: target.
get_vm_backup_snapshot_historyARead-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.
Inputs: vm_name (required), days, limit, target, +1 more.
get_vm_infoARead-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.
Inputs: vm_name (required), target.
get_vm_performanceARead-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.
Inputs: limit, target, vm_name.
investigate_datastoreARead-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.
Inputs: datastore_name (required), hours, target.
investigate_hostARead-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.
Inputs: host_name (required), hours, target.
investigate_vmARead-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.
Inputs: vm_name (required), hours, target.
list_active_sessionsARead-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.
Inputs: limit, target, include_service.
list_active_tasksARead-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.
Inputs: limit, target, include_recent.
list_all_clustersARead-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.
Inputs: limit, target.
list_all_datastoresARead-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.
Inputs: limit, target.
list_all_networksARead-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.
Inputs: limit, target.
list_esxi_hostsARead-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.
Inputs: limit, target.
list_virtual_machinesARead-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.
Inputs: limit, fields, target, sort_by, +3 more.
list_vm_snapshotsARead-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.
Inputs: vm_name (required), target.
scan_host_logsARead-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.
Inputs: group, lines, target, host_name.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 33 tools
The suite uses a clear layered model (list/get/investigate/fleet rollup), and most descriptions explicitly route an agent between overlapping-looking tools. A few boundaries still require close reading, such as get_vm_info vs investigate_vm and get_events vs scan_host_logs, so not every tool is instantly distinguishable.
Tool names consistently use snake_case with a predictable verb prefix: list_, get_, investigate_, find_, and scan_. The pattern is stable across all 33 tools and makes the intended action clear.
At 33 tools, the server is well past the typical 3-15 range and includes many niche read-only endpoints such as vCenter deployment size, memory tiering, and vLCM apply results. While broad VMware monitoring can justify a large surface, this is heavy for one MCP server and increases cognitive load.
Coverage is broad across inventory, cluster health, performance, alarms/events, logs, hardware sensors, storage capacity, snapshots, licenses, certificates, NTP, access, and patch compliance. The main gaps are historical trending and some appliance-level details, but agents can work around these for most monitoring tasks.
Maintenance
Related MCP Connectors
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Read-only search of 2,189 AI agent tools (MCP servers, x402 APIs) with daily automated trust scores.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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.-
- AlicenseNot gradedqualityCmaintenanceEnables 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.48 npm5MIT
- AlicenseAqualityAmaintenanceAI-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.44398 PyPI87MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives AI agents direct access to VMware vSphere infrastructure, enabling VM lifecycle management, snapshots, datastore operations, networking, and more via 55 typed tools built on govc.48 npmMIT