VMware AIops
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 | δΈζ
AI-powered VMware vCenter/ESXi VM lifecycle and deployment tool β 60 tools.
Companion skills handle everything else:
| Skill | Scope | Install |
|---|
| vmware-monitor | Read-only: inventory, health, alarms, events, metrics | uv tool install vmware-monitor |
| vmware-storage | Datastores, iSCSI, vSAN management | uv tool install vmware-storage |
| vmware-vks | Tanzu Namespaces, TKC cluster lifecycle | uv tool install vmware-vks |
Need read-only monitoring only? Use VMware-Monitor β zero destructive code in the codebase.

β‘ Quick Investigation Reports (read-only)
Triage β investigate β act, all in one conversation. Five opinionated read-only reports aggregate and correlate server-side and hand back a high-signal result (never raw inventory), so you can decide where to look before changing anything. Each renders a self-contained offline HTML snapshot with --html (no external assets; drill-down detail collapses in native <details>, zero JavaScript). All delegate to the vmware-monitor library using AIops's own vCenter connection.
| Question | Command | What it correlates |
|---|
| "What needs attention now?" across all vCenters | vmware-aiops attention | Every vCenter merged into one globally-ranked issue list; unreachable targets degrade gracefully |
| "Is anything on fire?" across all clusters | vmware-aiops summary | Every cluster's hosts + VM power + live CPU/mem + alarms β ranked top-N issues + per-cluster status |
| "What's happening around this VM?" | vmware-aiops investigate vm <name> | VM state + host + cluster + backing datastores + snapshots + alarms + performance + a merged event timeline |
| "What's happening around this host?" | vmware-aiops investigate host <name> | Host state + cluster + the VMs it runs + mounted datastores + alarms + performance + correlated timeline |
| "What's happening around this datastore?" | vmware-aiops investigate datastore <name> | Capacity/free + mounting hosts + VMs it backs + alarms + correlated timeline |
vmware-aiops attention
vmware-aiops investigate vm web-01 --hours 72
vmware-aiops investigate vm web-01 --html
Via MCP these are the tools cluster_health_summary, cross_vcenter_attention, vm_investigation_bundle, host_investigation_bundle, datastore_investigation_bundle. (Requires vmware-monitor installed.)
Quick Install (Recommended)
Works with Claude Code, Cursor, Codex, Gemini CLI, Trae, and 30+ AI agents:
npx skills add vmware-skills/VMware-AIops
clawhub install @zw008/vmware-aiops
PyPI Install (No GitHub Access Required)
uv tool install vmware-aiops
pip install vmware-aiops
pip install vmware-aiops -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:
pip install .
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:
pip wheel . -w dist
pip install --no-index --find-links dist vmware-aiops
Why this over other VMware MCP servers
Most open-source VMware MCP servers (e.g. bright8192/esxi-mcp-server,
giuliolibrando/vmware-vsphere-mcp-server) are single-vCenter VM wrappers:
list/power/snapshot a VM, basic monitoring, a confirm=True flag. They explicitly
do not cover networking, storage, Kubernetes, ops analytics, load balancing, or
compliance β and "logging is documented" is not an audit trail.
This is one skill in an 11-package family that covers the whole estate and runs
every tool through a governed harness:
| Other VMware MCP servers | This family |
|---|
| VM lifecycle + monitoring | β
| β
|
| NSX networking (segments/gateways/NAT/routing/IPAM) | β | β
vmware-nsx |
| NSX security (DFW/groups/IDS-IPS/traceflow) | β | β
vmware-nsx-security |
| Storage (datastore/iSCSI/vSAN) | β | β
vmware-storage |
| Tanzu Kubernetes (Supervisor/Namespace/TKC) | β | β
vmware-vks |
| Aria Operations (metrics/alerts/capacity) | β | β
vmware-aria |
| AVI / NSX ALB load balancing + AKO | β | β
vmware-avi |
| Compliance baselines + drift (CIS/SCG/ηδΏ/PCI) | β | β
vmware-harden |
| Governed harness (unified audit, policy engine, token budget + runaway breaker, graduated risk tiers, undo-token, prompt-injection sanitize) | β | β
vmware-policy on every tool |
If you only ever power-cycle VMs in one vCenter, a single-file server is fine. If you
run a real (regulated, NSX-segmented, multi-domain) VMware estate and need an AI
operator an auditor can sign off on, that's what this family is for β see
docs/compliance-ready.md.
Capabilities Overview
What This Skill Does
| Category | Tools | Count |
|---|
| VM Lifecycle | power on/off, TTL auto-delete, clean slate | 6 |
| Deployment | OVA, template, linked clone, batch clone/deploy | 8 |
| Guest Ops | exec commands, upload/download files, provision | 5 |
| Plan/Apply | multi-step planning with rollback | 4 |
| Cluster | create, delete, HA/DRS config, add/remove hosts | 6 |
| Datastore | browse files, scan for images | 2 |
| Network | dvSwitch portgroup list/create, host VMkernel list/add/remove, DF-bit MTU-path ping | 6 |
CLI vs MCP: Which Mode to Use
| Scenario | Recommended | Why |
|---|
| Local/small models (Ollama, Qwen <32B) | CLI | ~2K tokens context vs ~10K for MCP; small models struggle with many tool schemas |
| Token-sensitive workflows | CLI | SKILL.md + Bash tool = minimal overhead |
| Cloud models (Claude, GPT-4o) | Either | Both work; MCP gives structured JSON I/O |
| Automated pipelines / Agent chaining | MCP | Type-safe parameters, structured output, no shell parsing |
| Monitoring / storage / K8s | Companion skills | See vmware-monitor, vmware-storage, vmware-vks |
Rule of thumb: Use CLI for cost efficiency and small models. Use MCP for structured automation with large models.
Architecture
User (Natural Language)
β
AI CLI Tool (Claude Code / Gemini / Codex / Aider / Continue / Trae / Kimi)
β reads SKILL.md / AGENTS.md / rules
β
vmware-aiops CLI
β pyVmomi (vSphere SOAP API)
β
vCenter Server βββ ESXi Cluster βββ VM
or
ESXi Standalone Host βββ VM
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; new REST-only features (PATCH /deployment/size, IPv6-only GOSC) not yet wrapped β see VCF Python SDK for those. |
| VCF 9.0 / vSphere 9.0 | β
Full | pyVmomi 8.0.3+ connects against vSphere 9 SOAP API. From VCF 9, pyVmomi is also bundled inside the unified VCF Python SDK. |
| 8.0 / 8.0U1-U3 | β
Full | CreateSnapshot_Task deprecated β use CreateSnapshotEx_Task |
| 7.0 / 7.0U1-U3 | β
Full | All APIs supported |
| 6.7 | β
Compatible | Backward-compatible, tested |
| 6.5 | β
Compatible | Backward-compatible, tested |
pyVmomi auto-negotiates the API version during SOAP handshake β no manual configuration needed. The same codebase manages 7.0 / 8.0 / 9.0 / 9.1 environments seamlessly.
Common Workflows
Deploy a Lab Environment
- Browse datastore for OVA images β
vmware-aiops datastore browse <ds> --pattern "*.ova"
- Deploy VM from OVA β
vmware-aiops deploy ova ./image.ova --name lab-vm --datastore ds1
- Install software inside VM β
vmware-aiops vm guest-exec lab-vm --cmd /bin/bash --args "-c 'apt-get install -y nginx'" --user root
- Create baseline snapshot β
vmware-aiops vm snapshot-create lab-vm --name baseline
- Set TTL for auto-cleanup β
vmware-aiops vm set-ttl lab-vm --minutes 480
Batch Clone for Testing
- Create plan:
vm_create_plan with multiple clone + reconfigure steps
- Review plan with user (shows affected VMs, irreversible warnings)
- Apply:
vm_apply_plan executes sequentially, stops on failure
- If failed:
vm_rollback_plan reverses executed steps
- Set TTL on all clones for auto-cleanup
Migrate VM to Another Host
- Check VM info via
vmware-monitor β verify power state and current host
- Migrate:
vmware-aiops vm migrate my-vm --to-host esxi-02
- Verify migration completed
VM Lifecycle
| Operation | Command | Confirmation | vCenter | ESXi |
|---|
| Power On | vm power-on <name> | β | β
| β
|
| Graceful Shutdown | vm power-off <name> | Double | β
| β
|
| Force Power Off | vm power-off <name> --force | Double | β
| β
|
| Reset | plan action reset via vm_create_plan (MCP; no CLI command) | β | β
| β
|
| Suspend | plan action suspend via vm_create_plan (MCP; no CLI command) | β | β
| β
|
| Create VM | vm create <name> --cpu --memory --disk | β | β
| β
|
| Delete VM | vm delete <name> | Double | β
| β
|
| Reconfigure | vm reconfigure <name> --cpu --memory | Double | β
| β
|
| Create Snapshot | vm snapshot-create <name> --name <snap> | β | β
| β
|
| List Snapshots | vm snapshot-list <name> | β | β
| β
|
| Revert Snapshot | vm snapshot-revert <name> --name <snap> | Double | β
| β
|
| Delete Snapshot | vm snapshot-delete <name> --name <snap> [--no-wait] | Double | β
| β
|
| Task Status | vm task-status <task-id> | β | β
| β
|
| Clone VM | vm clone <name> --new-name <new> | Double | β
| β
|
| vMotion | vm migrate <name> --to-host <host> | Double | β
| β |
| Set TTL | vm set-ttl <name> --minutes <n> | Double | β
| β
|
| Cancel TTL | vm cancel-ttl <name> | β | β
| β
|
| List TTLs | vm list-ttl | β | β
| β
|
| Clean Slate | vm clean-slate <name> [--snapshot baseline] | Double | β
| β
|
| Guest Exec | vm guest-exec <name> --cmd /bin/bash --args "..." --user <account> | Double | β
| β
|
| Guest Exec (with output) | MCP only: vm_guest_exec_output (username required) β no CLI command | β | β
| β
|
| Guest Upload | vm guest-upload <name> --local f.sh --guest /tmp/f.sh --user <account> | Double | β
| β
|
| Guest Download | vm guest-download <name> --guest /var/log/syslog --local ./syslog --user <account> | β | β
| β
|
Guest Operations require VMware Tools running inside the guest OS, and the guest account is always named explicitly β --user on the CLI, username over MCP. There is no default, so no call runs as root without choosing root. vm_guest_exec_output (MCP only; the CLI has no equivalent) auto-detects Linux/Windows shell and captures stdout/stderr.
Plan β Apply (Multi-step Operations)
For complex operations involving 2+ steps or 2+ VMs, use the plan/apply workflow instead of executing individually:
| Step | What Happens |
|---|
| 1. Create Plan | AI calls vm_create_plan β validates actions, checks targets in vSphere, generates plan with rollback info |
| 2. Review | AI shows plan to user: steps, affected VMs, irreversible warnings |
| 3. Apply | vm_apply_plan previews first; with confirm=True executes sequentially and stops on failure. Each gated step is checked as its own tool checks it; iSCSI/rescan steps are refused (use vmware-storage) |
| 4. Rollback (if failed) | Asks user whether to rollback, then vm_rollback_plan reverses executed steps (irreversible steps skipped); each destructive rollback step is checked first, and a refused check stops the rollback |
Plans stored in ~/.vmware-aiops/plans/, auto-deleted on success, auto-cleaned after 24h.
VM Deployment & Provisioning
| Operation | Command | Speed | vCenter | ESXi |
|---|
| Deploy from OVA | deploy ova <path> --name <vm> | Minutes | β
| β
|
| Deploy from Template | deploy template <tmpl> --name <vm> | Minutes | β
| β
|
| Linked Clone | deploy linked-clone --source <vm> --snapshot <snap> --name <new> | Seconds | β
| β
|
| Attach ISO | deploy iso <vm> --iso "[ds] path/to.iso" | Instant | β
| β
|
| Convert to Template | deploy mark-template <vm> | Instant | β
| β
|
| Batch Clone | deploy batch-clone --source <vm> --count <n> | Minutes | β
| β
|
| Batch Deploy (YAML) | deploy batch spec.yaml | Auto | β
| β
|
Cluster Management
| Operation | Command | Confirmation | vCenter | ESXi |
|---|
| Cluster Info | cluster info <name> | β | β
| β |
| Create Cluster | cluster create <name> [--ha] [--drs] | β | β
| β |
| Delete Cluster | cluster delete <name> | Double | β
| β |
| Add Host | cluster add-host <cluster> --host <host> | Double | β
| β |
| Remove Host | cluster remove-host <cluster> --host <host> | Double | β
| β |
| Configure HA/DRS | cluster configure <name> [--ha/--no-ha] [--drs/--no-drs] | Double | β
| β |
remove-host requires the host to be in maintenance mode first; the host is moved out of the cluster into the datacenter's host folder as a standalone host.
Alarm Management
| Operation | Command | Confirmation | vCenter | ESXi |
|---|
| List Triggered Alarms | alarm list [--target <t>] | β | β
| β |
| Acknowledge Alarm | alarm acknowledge <entity> <alarm> | β | β
| β |
| Clear (Reset) Alarms | alarm reset <entity> <alarm> | Double | β
| β |
Blast radius: vSphere has no per-alarm clear API. alarm reset uses AlarmManager.ClearTriggeredAlarms, which clears all triggered alarms matching the named alarm's entity type (host/VM/all) and current status (red/yellow) β not just the named one. The named alarm is looked up first (typos fail fast), and the output's scope field reports exactly what was cleared. Cleared alarms re-trigger automatically if their underlying condition persists.
Datastore Browser
| Feature | vCenter | ESXi | Details |
|---|
| Browse Files | β
| β
| List files/folders in any datastore path |
| Scan Images | β
| β
| Discover ISO, OVA, OVF, VMDK across all datastores |
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-aiops/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 |
Safety Features
| Feature | Details |
|---|
| Dry-Run Mode (CLI only) | --dry-run prints the exact API call without executing, on every CLI write except deploy iso, deploy mark-template, vm cancel-ttl and vm guest-download |
| Plan β Confirm β Execute β Log | CLI workflow: show current state, confirm changes, execute, audit log |
| Double Confirmation (CLI only) | Destructive and deploy CLI commands (vm power-off, delete, reconfigure, snapshot-revert/delete, clone, migrate, set-ttl, clean-slate, guest-exec, guest-upload; deploy ova, template, linked-clone, batch, batch-clone, mark-template; cluster delete, add-host, remove-host, configure, drs-rule-set/create/delete; alarm reset) require 2 sequential prompts and take no bypass flag |
| Only destructive MCP tools confirm | 22 of the 43 write tools an agent sees over MCP β every tool annotated destructive, plus vm_migrate and the network/DRS authoring tools β preview first and need confirm=True; the other 21 (creates, clones, deploys, power-on, reconfigure, snapshot create, host add, template and ISO operations, guest download, plan creation, alarms) act on the first call. There is no approval tier and no read-only switch. What decides whether a write lands is the privilege of the vCenter account, and what records it is the audit trail. See What protects you |
| Rejection Logging | Declined CLI confirmations are recorded in the audit trail |
| Audit Trail | All operations logged to ~/.vmware-aiops/audit.log (JSONL) with before/after state |
| Input Validation | VM name, CPU (1-128), memory (128-1048576 MB), disk (1-65536 GB) validated |
| Password Protection | .env file loading with permission check; never in shell history |
| 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, stripped of control characters, and wrapped in boundary markers before output |
| 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, IP addresses, and user names. No credentials from the skill's config or .env are sent |
| Task Waiting | All async operations wait for completion and report result |
| State Validation | Pre-operation checks (VM exists, power state correct) |
vCenter vs ESXi Comparison
| Capability | vCenter | ESXi Standalone |
|---|
| vMotion migration | β
| β |
| Cross-host clone | β
| β |
| Cluster management | β
| β |
| All VM lifecycle ops | β
| β
|
| OVA/Template/Linked Clone deploy | β
| β
|
| Datastore browsing & image scan | β
| β
|
| Snapshots | β
| β
|
| Guest operations | β
| β
|
Inventory, alarms, events, sensors, host services, and scanning are now in vmware-monitor.
What protects you
The table above lists two different surfaces and it is worth being blunt about
which protections apply to which, because getting this wrong is worse than
having no protection at all β a guardrail you believe in is one you stop
compensating for.
On the CLI, a destructive command asks twice and takes no bypass flag, and
--dry-run previews every write except deploy iso, deploy mark-template,
vm cancel-ttl and vm guest-download. That defends a mistyped command typed by a
human. It does not defend against an agent, which satisfies both prompts with
yes |.
Over MCP, every tool annotated destructive, plus vm_migrate and the network/DRS
authoring tools β 22 of the 43 write tools, including
vm_power_off, vm_migrate, cluster_delete, the snapshot, guest, TTL, Clean
Slate and plan tools β takes one argument, confirm, whose default is a
no-write preview: a bare call returns its blast radius and changes nothing.
confirm=True re-measures and is refused, with a teaching error audited as a
failure, if the preview found a blocker (a VM without running VMware Tools, a
target host in maintenance mode, a cluster that still has hosts, a missing or
duplicated snapshot) or could not read something. vm_delete also takes the
preview's acknowledge_with echoed back, and is refused if the VM changed
since, is powered on or suspended. The other 21 write tools β creates, clones,
deploys, power-on, reconfigure, snapshot create, host add, template and ISO operations,
guest download, plan creation, alarms β act on the first call. A confirmation is not authorization, which is
why the VMWARE_READ_ONLY switch stays removed (it was enforced on the MCP path
only, and any agent with a shell walked around it via the CLI). What the preview
buys is narrower: an agent does not destroy something it has not looked at.
What actually decides whether a write lands is the vCenter/ESXi service
account. Give the skill an account with the privileges the work needs and no
more; vCenter refuses the rest itself, on every surface, with no way around it
from inside this skill. To run an agent read-only, give it a read-only vCenter
role β one decision, enforced where it is made. Every call is then recorded in
~/.vmware/audit.db before the caller sees a result, which is how you find out
what happened. Optional deny rules in ~/.vmware/rules.yaml, checked before
every MCP call, can refuse operations β for example, writes to targets labelled
environment: production. The shipped baseline denies nothing, and the rules
run inside the same process: a guardrail on top of RBAC, not a replacement.
vm_guest_exec is the one to think hardest about. It runs a caller-supplied
command inside the guest OS with the credentials handed to it β its username
is required (no default account); nothing bounds what the command may be. The guest account is
a separate authorization boundary from the vCenter one β a read-only vCenter
role does not constrain what this tool does inside a VM. The skill stores no
guest credentials: over MCP they are tool arguments the agent sees (the audit row
redacts the password). Pass a least-privilege guest account, and do not hand the
agent guest credentials it does not need. vm_guest_upload reads any local file
the server process can read.
The full inventory of which tools are gated and which are not is in
references/capabilities.md,
where the numbers are checked against the live tool registry by the test suite
rather than maintained by hand.
Troubleshooting
"VM not found" error
VM names are case-sensitive in vSphere. Use exact name from vmware-monitor inventory vms.
Guest exec returns empty output
Use vm_guest_exec_output instead of vm_guest_exec β it auto-captures stdout/stderr. Basic vm_guest_exec only returns exit code.
Deploy OVA times out
Large OVA files (>10GB) may exceed the default 120s timeout. The upload happens via HTTP NFC lease β ensure network between the machine running vmware-aiops and ESXi is stable.
Plan apply fails mid-way
Run vmware-aiops plan list to see failed plan status. Ask user if they want to rollback with vm_rollback_plan. Irreversible steps (delete_vm) are skipped during rollback.
Connection refused / SSL error
- Verify target is reachable:
vmware-aiops doctor
- For self-signed certs: set
verify_ssl: false in config.yaml (lab environments only)
| Platform | Status | Config File | AI Model |
|---|
| Claude Code | β
Native Skill | skills/vmware-aiops/SKILL.md | Anthropic Claude |
| Gemini CLI | β
Context file + MCP | skills/vmware-aiops/SKILL.md | Google Gemini |
| OpenAI Codex CLI | β
Skill + AGENTS.md | skills/vmware-aiops/SKILL.md | OpenAI GPT |
| Aider | β
Conventions | skills/vmware-aiops/SKILL.md | Any (cloud + local) |
| Continue CLI | β
Rules | skills/vmware-aiops/SKILL.md | Any (cloud + local) |
| Trae IDE | β
Rules | skills/vmware-aiops/SKILL.md | Claude/DeepSeek/GPT-4o/Doubao |
| Kimi Code CLI | β
Skill | skills/vmware-aiops/SKILL.md | Moonshot Kimi |
| MCP Server | β
MCP Protocol | vmware_aiops/mcp_server/ | Any MCP client |
| Python CLI | β
Standalone | N/A | N/A |
| 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-aiops MCP server works with any MCP-compatible agent or tool. Ready-to-use configuration templates are in examples/mcp-configs/.
Xiaoguai (ε°ζͺ) β a self-hostable, audit-first agent platform (Rust, single binary + embedded SQLite) from the same maintainer. It runs the vmware-aiops MCP server as one of its toolboxes; being both an MCP consumer and an MCP server, its HMAC-chained audit log and human-on-the-loop approval gates line up with this skill's own audit + confirm design. See its MCP integration guide.
Fully local operation (no cloud API required):
aider --conventions skills/vmware-aiops/SKILL.md --model ollama/qwen2.5-coder:32b
Installation
Step 0: Prerequisites
python3 --version
node --version
Step 1: Clone & Install Python Backend
All platforms share the same Python backend.
git clone https://github.com/vmware-skills/VMware-AIops.git
cd VMware-AIops
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
mkdir -p ~/.vmware-aiops
cp config.example.yaml ~/.vmware-aiops/config.yaml
Set passwords via .env file (recommended):
cp .env.example ~/.vmware-aiops/.env
chmod 600 ~/.vmware-aiops/.env
Security note: Prefer .env file over command-line export to avoid passwords appearing in shell history. The .env file should have chmod 600 (owner-only read/write).
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
Security Best Practices
- NEVER hardcode passwords in scripts or config files
- NEVER pass passwords as command-line arguments (visible in
ps)
- ALWAYS use
~/.vmware-aiops/.env with chmod 600
- ALWAYS configure connections via
config.yaml β credentials are loaded from .env automatically
- Config File Contents:
config.yaml stores target hostnames, ports, and a reference to the .env file. It does not contain passwords or tokens. All secrets are stored exclusively in .env
- TLS: Enabled by default. Disable only for ESXi hosts with self-signed certificates in isolated lab environments
- Webhook: Disabled by default. When enabled, the daemon posts to your own configured URL only β no third-party service β 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. Payloads carry the full issue text (entity names, alarm names, event messages, ESXi log excerpts, connection errors), which can include host names, IP addresses, and user names; they carry no credentials from your config or .env
- Least Privilege: Use a dedicated vCenter service account with minimal permissions. For monitoring-only use cases, prefer the read-only VMware-Monitor
- Prompt Injection Protection: All vSphere-sourced content is truncated, stripped of control characters, and wrapped in boundary markers before output
- Code Review: We recommend reviewing the source code and commit history before deploying in production
- Production Safety: For production environments, use the read-only VMware-Monitor instead. AI agents can misinterpret context and execute unintended destructive operations β real-world incidents have shown that AI-driven infrastructure tools without proper isolation can delete production databases and entire environments. VMware-Monitor eliminates this risk at the code level: no destructive functions exist in its codebase
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-AIops
clawhub install @zw008/vmware-aiops
Method 2: Manual skill install
git clone https://github.com/vmware-skills/VMware-AIops.git
cd VMware-AIops
mkdir -p ~/.claude/skills/vmware-aiops
cp -r skills/vmware-aiops/. ~/.claude/skills/vmware-aiops/
For tool access (not just skill context), also register the MCP server:
claude mcp add vmware-aiops -- vmware-aiops mcp
Restart Claude Code, then:
> Show me all VMs on esxi-lab.example.com
Submit to Official Marketplace
This plugin can also be submitted to the Anthropic official plugin directory for public discovery.
Option B: Gemini CLI
npm install -g @google/gemini-cli
cp skills/vmware-aiops/SKILL.md ./GEMINI.md
For tool access (not just context), register the MCP server in ~/.gemini/settings.json:
{
"mcpServers": {
"vmware-aiops": {
"command": "vmware-aiops",
"args": ["mcp"],
"env": { "VMWARE_AIOPS_CONFIG": "~/.vmware-aiops/config.yaml" }
}
}
}
Then start Gemini CLI:
gemini
> Show me all VMs on my ESXi host
Option C: OpenAI Codex CLI
npm i -g @openai/codex
mkdir -p ~/.codex/skills/vmware-aiops
cp skills/vmware-aiops/SKILL.md ~/.codex/skills/vmware-aiops/SKILL.md
cp skills/vmware-aiops/SKILL.md ./AGENTS.md
Then start Codex CLI:
codex --enable skills
> List all VMs on my ESXi
Option D: Aider (supports local models)
pip install aider-chat
brew install ollama
ollama pull qwen2.5-coder:32b
aider --conventions skills/vmware-aiops/SKILL.md
aider --conventions skills/vmware-aiops/SKILL.md \
--model ollama/qwen2.5-coder:32b
Option E: Continue CLI (supports local models)
npm i -g @continuedev/cli
mkdir -p .continue/rules
cp skills/vmware-aiops/SKILL.md .continue/rules/vmware-aiops.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-aiops/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
mkdir -p ~/.kimi/skills/vmware-aiops
cp skills/vmware-aiops/SKILL.md ~/.kimi/skills/vmware-aiops/SKILL.md
Option H: MCP Server (Glama / Claude Desktop)
The MCP server exposes VMware operations as tools via the Model Context Protocol. Works with any MCP-compatible client (Claude Desktop, Cursor, etc.).
After uv tool install vmware-aiops, start the MCP server with one command (v1.5.15+):
vmware-aiops mcp
VMWARE_AIOPS_CONFIG=/path/to/config.yaml vmware-aiops mcp
Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"vmware-aiops": {
"command": "vmware-aiops",
"args": ["mcp"],
"env": {
"VMWARE_AIOPS_CONFIG": "/path/to/config.yaml"
}
}
}
}
Alternative: uvx (no install) or legacy entry point
uvx --from vmware-aiops vmware-aiops mcp
vmware-aiops-mcp
Behind a corporate TLS proxy? uvx may fail with invalid peer certificate: UnknownIssuer.
Use the recommended vmware-aiops mcp form above (no network needed), or set UV_NATIVE_TLS=true.
Option I: Standalone CLI (no AI)
source .venv/bin/activate
vmware-aiops vm power-on my-vm --target home-esxi
vmware-aiops deploy ova ./ubuntu.ova --name my-vm --target home-esxi
vmware-aiops datastore browse datastore1 --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-aiops |
| Skills.sh | npx skills add vmware-skills/VMware-AIops |
| Git clone | cd VMware-AIops && git pull origin main && uv pip install --no-sources -e . (without --no-sources, uv looks for a sibling ../VMware-Monitor checkout) |
| uv | uv tool install vmware-aiops --force |
Check your current version: vmware-aiops --version
Chinese Cloud Models
For users in China who prefer domestic cloud APIs or have limited access to overseas services.
DeepSeek
Cost-effective, strong coding capability.
export DEEPSEEK_API_KEY="your-key"
aider --conventions skills/vmware-aiops/SKILL.md \
--model deepseek/deepseek-coder
Persistent config ~/.aider.conf.yml:
model: deepseek/deepseek-coder
conventions: skills/vmware-aiops/SKILL.md
Qwen (Alibaba Cloud)
Alibaba Cloud's coding model, free tier available.
export DASHSCOPE_API_KEY="your-key"
aider --conventions skills/vmware-aiops/SKILL.md \
--model qwen/qwen-coder-plus
Or via OpenAI-compatible endpoint:
export OPENAI_API_BASE="https://dashscope.aliyuncs.com/compatible-mode/v1"
export OPENAI_API_KEY="your-dashscope-key"
aider --conventions skills/vmware-aiops/SKILL.md \
--model qwen-coder-plus-latest
Doubao (ByteDance)
export OPENAI_API_BASE="https://ark.cn-beijing.volces.com/api/v3"
export OPENAI_API_KEY="your-ark-key"
aider --conventions skills/vmware-aiops/SKILL.md \
--model your-doubao-endpoint-id
With Continue CLI
Configure ~/.continue/config.yaml:
models:
- name: deepseek-coder
provider: openai-compatible
apiBase: https://api.deepseek.com/v1
apiKey: your-deepseek-key
model: deepseek-coder
models:
- name: qwen-coder
provider: openai-compatible
apiBase: https://dashscope.aliyuncs.com/compatible-mode/v1
apiKey: your-dashscope-key
model: qwen-coder-plus-latest
Local Models (Aider + Ollama)
For fully offline operation β no cloud API, no internet, full privacy.
Aider + Ollama + local Qwen/DeepSeek is ideal for air-gapped environments.
Step 1: Install Ollama
Step 2: Pull a model
| Model | Command | Size | Note |
|---|
| Qwen 2.5 Coder 32B | ollama pull qwen2.5-coder:32b | ~20GB | Best local coding model |
| Qwen 2.5 Coder 7B | ollama pull qwen2.5-coder:7b | ~4.5GB | Low-memory option |
| DeepSeek Coder V2 | ollama pull deepseek-coder-v2 | ~8.9GB | Strong reasoning |
| CodeLlama 34B | ollama pull codellama:34b | ~19GB | Meta coding model |
Hardware: 32B β ~20GB VRAM (or 32GB RAM for CPU). 7B β 8GB RAM.
Step 3: Run with Aider
pip install aider-chat
ollama serve
aider --conventions skills/vmware-aiops/SKILL.md \
--model ollama/qwen2.5-coder:32b
aider --conventions skills/vmware-aiops/SKILL.md \
--model ollama/deepseek-coder-v2
aider --conventions skills/vmware-aiops/SKILL.md \
--model ollama/qwen2.5-coder:7b
Persistent config ~/.aider.conf.yml:
model: ollama/qwen2.5-coder:32b
conventions: skills/vmware-aiops/SKILL.md
Local Architecture
User β Aider CLI β Ollama (localhost:11434) β Qwen / DeepSeek local model
β β
β reads AGENTS.md instructions
β β
ββββββββββββββββββββββββββββββββ vmware-aiops CLI βββ ESXi / vCenter
Tip: Local models are fully offline β perfect for air-gapped environments or strict data compliance.
CLI Reference
vmware-aiops doctor
vmware-aiops doctor --skip-auth
vmware-aiops mcp-config generate --agent goose
vmware-aiops mcp-config generate --agent claude-code
vmware-aiops mcp-config list
vmware-aiops vm power-on my-vm
vmware-aiops vm power-off my-vm
vmware-aiops vm power-off my-vm --force
vmware-aiops vm create my-new-vm --cpu 4 --memory 8192 --disk 100
vmware-aiops vm delete my-vm
vmware-aiops vm reconfigure my-vm --cpu 4 --memory 8192
vmware-aiops vm snapshot-create my-vm --name "before-upgrade"
vmware-aiops vm snapshot-list my-vm
vmware-aiops vm snapshot-revert my-vm --name "before-upgrade"
vmware-aiops vm snapshot-delete my-vm --name "before-upgrade"
vmware-aiops vm snapshot-delete my-vm --name "old-big" --no-wait
vmware-aiops vm task-status task-1234
vmware-aiops vm clone my-vm --new-name my-vm-clone
vmware-aiops vm migrate my-vm --to-host esxi-02
vmware-aiops vm set-ttl my-vm --minutes 60
vmware-aiops vm cancel-ttl my-vm
vmware-aiops vm list-ttl
vmware-aiops vm clean-slate my-vm --snapshot baseline
vmware-aiops vm guest-exec my-vm --cmd /bin/bash --args "-c 'whoami'" --user root
vmware-aiops vm guest-upload my-vm --local ./script.sh --guest /tmp/script.sh --user root
vmware-aiops vm guest-download my-vm --guest /var/log/syslog --local ./syslog.txt --user root
vmware-aiops plan list
vmware-aiops deploy ova ./ubuntu.ova --name my-vm --datastore ds1
vmware-aiops deploy template golden-ubuntu --name new-vm
vmware-aiops deploy linked-clone --source base-vm --snapshot clean --name test-vm
vmware-aiops deploy iso my-vm --iso "[datastore1] iso/ubuntu-22.04.iso"
vmware-aiops deploy mark-template golden-vm
vmware-aiops deploy batch-clone --source base-vm --count 5 --prefix lab
vmware-aiops deploy batch deploy.yaml
vmware-aiops cluster info my-cluster
vmware-aiops cluster create my-cluster --ha --drs
vmware-aiops cluster delete my-cluster
vmware-aiops cluster add-host my-cluster --host esxi-03
vmware-aiops cluster remove-host my-cluster --host esxi-03
vmware-aiops cluster configure my-cluster --ha --drs
vmware-aiops alarm list
vmware-aiops alarm acknowledge esxi-01 "Host memory usage"
vmware-aiops alarm reset esxi-01 "Host memory usage"
vmware-aiops datastore browse datastore1 --path "iso/"
vmware-aiops datastore scan-images --target home-esxi
vmware-aiops scan now
vmware-aiops daemon start
vmware-aiops daemon status
vmware-aiops daemon stop
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 |
| scanner | log_types | β | Not read by any code β the daemon always reads the hostd, vmkernel and vpxa host logs. Setting it changes nothing |
| notify | log_file | ~/.vmware-aiops/scan.log | JSONL log output |
| notify | webhook_url | β | Webhook endpoint (Slack, Discord, etc.) |
Project Structure
VMware-AIops/
βββ skills/ # Skills index (npx skills add)
β βββ vmware-aiops/
β βββ SKILL.md # Slimmed-down skill (progressive disclosure)
β βββ references/ # Detailed docs loaded on-demand
β βββ capabilities.md # Full capabilities tables
β βββ cli-reference.md # Complete CLI reference
β βββ setup-guide.md # Install, security, AI platforms
βββ vmware_aiops/ # Python backend
β βββ config.py # YAML + .env config
β βββ connection.py # Multi-target pyVmomi
β βββ cli/ # Typer CLI (double confirm)
β βββ ops/ # Operations
β β βββ inventory.py # VMs, hosts, datastores, clusters
β β βββ health.py # Alarms, events, sensors
β β βββ vm_lifecycle.py # VM CRUD, snapshots, clone, migrate
β β βββ vm_deploy.py # OVA, template, linked clone, batch deploy
β β βββ datastore_browser.py # Datastore browsing, image discovery
β βββ scanner/ # Log scanning daemon
β βββ notify/ # Notifications (JSONL + webhook)
β βββ mcp_server/ # MCP server wrapper
β βββ server.py # FastMCP server with tools
β βββ __main__.py
βββ examples/mcp-configs/ # MCP client config templates
βββ tests/ # Test suite
βββ smithery.yaml # Smithery marketplace config
βββ RELEASE_NOTES.md
βββ config.example.yaml
βββ pyproject.toml
API Coverage
Built on pyVmomi (vSphere Web Services API / SOAP).
| API Object | Usage |
|---|
vim.VirtualMachine | VM lifecycle, snapshots, clone, migrate |
vim.HostSystem | ESXi host info, sensors, services |
vim.Datastore | Storage capacity, type, accessibility |
vim.host.DatastoreBrowser | File browsing, image discovery (ISO/OVA/VMDK) |
vim.OvfManager | OVA import and deployment |
vim.ClusterComputeResource | Cluster, DRS, HA |
vim.Network | Network listing |
vim.alarm.AlarmManager | Active alarm monitoring |
vim.event.EventManager | Event/log queries |
| Skill | Scope | Tools | Install |
|---|
| vmware-aiops | VM lifecycle, deployment, guest ops, cluster, datastore browse, triage | 49 | uv tool install vmware-aiops |
| vmware-monitor | Read-only monitoring, alarms, events, investigation bundles | 27 | uv tool install vmware-monitor |
| 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, routing, IPAM | 33 | uv tool install vmware-nsx-mgmt |
| vmware-nsx-security | DFW policies/rules, security groups, Traceflow, IDS/IPS | 21 | uv tool install vmware-nsx-security |
| vmware-aria | Aria Operations metrics, alerts, capacity, anomalies | 28 | uv tool install vmware-aria |
| vmware-avi | AVI (NSX ALB) load balancing, AKO Kubernetes ops | 28 | uv tool install vmware-avi |
| vmware-harden | Compliance baselines (CIS / vSphere SCG / ηδΏ / PCI-DSS), drift detection | 6 | uv tool install vmware-harden |
Troubleshooting & Contributing
If you encounter any errors or issues, please send the error message, logs, or screenshots to zhouwei008@gmail.com. Contributions are welcome β feel free to join us in maintaining and improving this project!
License
MIT