VMware-AIops
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 — 31 tools across 6 categories.
Companion skills handle everything else:
Skill
Scope
Install
Read-only: inventory, health, alarms, events, metrics
uv tool install vmware-monitorDatastores, iSCSI, vSAN management
uv tool install vmware-storageTanzu Namespaces, TKC cluster lifecycle
uv tool install vmware-vksNeed read-only monitoring only? Use VMware-Monitor — zero destructive code in the codebase.
Quick Install (Recommended)
Works with Claude Code, Cursor, Codex, Gemini CLI, Trae, and 30+ AI agents:
# Via Skills.sh
npx skills add zw008/VMware-AIops
# Via ClawHub
clawhub install vmware-aiopsPyPI Install (No GitHub Access Required)
# Install via uv (recommended)
uv tool install vmware-aiops
# Or via pip
pip install vmware-aiops
# China mainland mirror (faster)
pip install vmware-aiops -i https://pypi.tuna.tsinghua.edu.cn/simpleClaude Code Plugin Install
# Add marketplace
/plugin marketplace add zw008/VMware-AIops
# Install plugin
/plugin install vmware-ops
# Use the skill
/vmware-ops:vmware-aiopsCapabilities 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 |
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 |
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 ──→ VMVersion Compatibility
vSphere Version | Support | Notes |
8.0 / 8.0U1-U3 | ✅ Full |
|
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 both 7.0 and 8.0 environments seamlessly.
Related MCP server: VMware-Monitor
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 ds1Install software inside VM →
vmware-aiops vm guest-exec lab-vm --cmd /bin/bash --args "-c 'apt-get install -y nginx'" --user rootCreate baseline snapshot →
vmware-aiops vm snapshot-create lab-vm --name baselineSet TTL for auto-cleanup →
vmware-aiops vm set-ttl lab-vm --minutes 480
Batch Clone for Testing
Create plan:
vm_create_planwith multiple clone + reconfigure stepsReview plan with user (shows affected VMs, irreversible warnings)
Apply:
vm_apply_planexecutes sequentially, stops on failureIf failed:
vm_rollback_planreverses executed stepsSet TTL on all clones for auto-cleanup
Migrate VM to Another Host
Check VM info via
vmware-monitor→ verify power state and current hostMigrate:
vmware-aiops vm migrate my-vm --to-host esxi-02Verify migration completed
VM Lifecycle
Operation | Command | Confirmation | vCenter | ESXi |
Power On |
| — | ✅ | ✅ |
Graceful Shutdown |
| Double | ✅ | ✅ |
Force Power Off |
| Double | ✅ | ✅ |
Reset |
| — | ✅ | ✅ |
Suspend |
| — | ✅ | ✅ |
Create VM |
| — | ✅ | ✅ |
Delete VM |
| Double | ✅ | ✅ |
Reconfigure |
| Double | ✅ | ✅ |
Create Snapshot |
| — | ✅ | ✅ |
List Snapshots |
| — | ✅ | ✅ |
Revert Snapshot |
| — | ✅ | ✅ |
Delete Snapshot |
| — | ✅ | ✅ |
Clone VM |
| — | ✅ | ✅ |
vMotion |
| — | ✅ | ❌ |
Set TTL |
| — | ✅ | ✅ |
Cancel TTL |
| — | ✅ | ✅ |
List TTLs |
| — | ✅ | ✅ |
Clean Slate |
| Double | ✅ | ✅ |
Guest Exec |
| — | ✅ | ✅ |
Guest Exec (with output) |
| — | ✅ | ✅ |
Guest Upload |
| — | ✅ | ✅ |
Guest Download |
| — | ✅ | ✅ |
Guest Operations require VMware Tools running inside the guest OS.
guest-exec-outputauto-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 |
2. Review | AI shows plan to user: steps, affected VMs, irreversible warnings |
3. Apply |
|
4. Rollback (if failed) | Asks user whether to rollback, then |
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 |
| Minutes | ✅ | ✅ |
Deploy from Template |
| Minutes | ✅ | ✅ |
Linked Clone |
| Seconds | ✅ | ✅ |
Attach ISO |
| Instant | ✅ | ✅ |
Convert to Template |
| Instant | ✅ | ✅ |
Batch Clone |
| Minutes | ✅ | ✅ |
Batch Deploy (YAML) |
| Auto | ✅ | ✅ |
Cluster Management
Operation | Command | Confirmation | vCenter | ESXi |
Cluster Info |
| — | ✅ | ❌ |
Create Cluster |
| — | ✅ | ❌ |
Delete Cluster |
| Double | ✅ | ❌ |
Add Host |
| Double | ✅ | ❌ |
Remove Host |
| Double | ✅ | ❌ |
Configure HA/DRS |
| Double | ✅ | ❌ |
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 | Alarms + Events + Host logs (hostd, vmkernel, vpxd) |
Log Analysis | Regex pattern matching: error, fail, critical, panic, timeout, corrupt |
Structured Log | JSONL output to |
Webhook | Slack, Discord, or any HTTP endpoint |
Daemon Management |
|
Safety Features
Feature | Details |
Dry-Run Mode |
|
Plan → Confirm → Execute → Log | Structured workflow: show current state, confirm changes, execute, audit log |
Double Confirmation | All destructive ops (power-off, delete, reconfigure, snapshot-revert/delete, clone, migrate) require 2 sequential confirmations — no bypass flags |
Rejection Logging | Declined confirmations are recorded in the audit trail |
Audit Trail | All operations logged to |
Input Validation | VM name, CPU (1-128), memory (128-1048576 MB), disk (1-65536 GB) validated |
Password Protection |
|
SSL Self-signed Support |
|
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 | Sends notifications to user-configured URLs only — no third-party services by default |
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.
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 doctorFor self-signed certs: set
disableSslCertValidation: truein config.yaml (lab environments only)
Supported AI Platforms
Platform | Status | Config File | AI Model |
Claude Code | ✅ Native Skill |
| Anthropic Claude |
Gemini CLI | ✅ Extension |
| 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/Doubao |
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 | Extension | SKILL.md | — | Rules | Rules | SKILL.md |
MCP support | Native | Native | Via Skills | Third-party | Native | — | — |
Free tier | — | 60 req/min | — | Self-hosted | Self-hosted | — | — |
MCP Server Integrations
The vmware-aiops MCP server works with any MCP-compatible agent or tool. Ready-to-use configuration templates are in examples/mcp-configs/.
Agent / Tool | Local Model Support | Config Template | Integration Guide |
✅ Ollama, LM Studio | |||
✅ Fully offline | |||
✅ Ollama, vLLM | |||
VS Code Copilot | — | ||
— | |||
Continue | ✅ Ollama | ||
Claude Code | — | — |
Fully local operation (no cloud API required):
# Aider + Ollama + vmware-aiops (via AGENTS.md)
aider --conventions codex-skill/AGENTS.md --model ollama/qwen2.5-coder:32b
# Any MCP agent + local model + vmware-aiops 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
All platforms share the same Python backend.
git clone https://github.com/zw008/VMware-AIops.git
cd VMware-AIops
python3 -m venv .venv
source .venv/bin/activate
pip install -e .Step 2: Configure
mkdir -p ~/.vmware-aiops
cp config.example.yaml ~/.vmware-aiops/config.yaml
# Edit config.yaml with your vCenter/ESXi targetsSet passwords via .env file (recommended):
# Use the template
cp .env.example ~/.vmware-aiops/.env
# Edit and fill in your passwords, then lock permissions
chmod 600 ~/.vmware-aiops/.envSecurity note: Prefer
.envfile over command-lineexportto avoid passwords appearing in shell history. The.envfile should havechmod 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_PASSWORDSecurity Best Practices
NEVER hardcode passwords in scripts or config files
NEVER pass passwords as command-line arguments (visible in
ps)ALWAYS use
~/.vmware-aiops/.envwithchmod 600ALWAYS configure connections via
config.yaml— credentials are loaded from.envautomaticallyConfig File Contents:
config.yamlstores target hostnames, ports, and a reference to the.envfile. It does not contain passwords or tokens. All secrets are stored exclusively in.envTLS: Enabled by default. Disable only for ESXi hosts with self-signed certificates in isolated lab environments
Webhook: Disabled by default. When enabled, sends monitoring summaries to your own configured URL only — payloads contain no credentials, IPs, or PII, only aggregated alert metadata. No data sent to third-party services
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
Step 3: Connect Your AI Tool
Choose one (or more) of the following:
Option A: Claude Code (Marketplace)
Method 1: Marketplace (recommended)
In Claude Code, run:
/plugin marketplace add zw008/VMware-AIops
/plugin install vmware-opsThen use:
/vmware-ops:vmware-aiops
> Show me all VMs on esxi-lab.example.comMethod 2: Local install
# Clone and symlink
git clone https://github.com/zw008/VMware-AIops.git
ln -sf $(pwd)/VMware-AIops ~/.claude/plugins/marketplaces/vmware-aiops
# Register marketplace
python3 -c "
import json, pathlib
f = pathlib.Path.home() / '.claude/plugins/known_marketplaces.json'
d = json.loads(f.read_text()) if f.exists() else {}
d['vmware-aiops'] = {
'source': {'source': 'github', 'repo': 'zw008/VMware-AIops'},
'installLocation': str(pathlib.Path.home() / '.claude/plugins/marketplaces/vmware-aiops')
}
f.write_text(json.dumps(d, indent=2))
"
# Enable plugin
python3 -c "
import json, pathlib
f = pathlib.Path.home() / '.claude/settings.json'
d = json.loads(f.read_text()) if f.exists() else {}
d.setdefault('enabledPlugins', {})['vmware-ops@vmware-aiops'] = True
f.write_text(json.dumps(d, indent=2))
"Restart Claude Code, then:
/vmware-ops:vmware-aiopsSubmit to Official Marketplace
This plugin can also be submitted to the Anthropic official plugin directory for public discovery.
Option B: Gemini CLI
# Install Gemini CLI
npm install -g @google/gemini-cli
# Install the extension from the cloned repo
gemini extensions install ./gemini-extension
# Or install directly from GitHub
# gemini extensions install https://github.com/zw008/VMware-AIopsThen 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-aiops
cp codex-skill/SKILL.md ~/.codex/skills/vmware-aiops/SKILL.md
# Copy AGENTS.md to project root
cp codex-skill/AGENTS.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 codex-skill/AGENTS.md
# Or with local model via Ollama
aider --conventions codex-skill/AGENTS.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 codex-skill/AGENTS.md .continue/rules/vmware-aiops.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 trae-rules/project_rules.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-aiops
cp kimi-skill/SKILL.md ~/.kimi/skills/vmware-aiops/SKILL.mdOption H: MCP Server (Smithery / 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+):
# Recommended — single command, no network re-resolve
vmware-aiops mcp
# With a custom config path
VMWARE_AIOPS_CONFIG=/path/to/config.yaml vmware-aiops mcpClaude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"vmware-aiops": {
"command": "vmware-aiops",
"args": ["mcp"],
"env": {
"VMWARE_AIOPS_CONFIG": "/path/to/config.yaml"
}
}
}
}# Run without installing (requires PyPI access each launch)
uvx --from vmware-aiops vmware-aiops mcp
# Legacy entry point (still works, kept for backward compatibility)
vmware-aiops-mcpBehind a corporate TLS proxy? uvx may fail with
invalid peer certificate: UnknownIssuer. Use the recommendedvmware-aiops mcpform above (no network needed), or setUV_NATIVE_TLS=true.
Install via Smithery:
npx -y @smithery/cli install @zw008/VMware-AIops --client claudeOption I: Standalone CLI (no AI)
# Already installed in Step 1
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-esxiUpdate / Upgrade
Already installed? Re-run the install command for your channel to get the latest version:
Install Channel | Update Command |
ClawHub |
|
Skills.sh |
|
Claude Code Plugin |
|
Git clone |
|
uv |
|
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.
# Set DeepSeek API key (get from https://platform.deepseek.com)
export DEEPSEEK_API_KEY="your-key"
# Run with Aider
aider --conventions codex-skill/AGENTS.md \
--model deepseek/deepseek-coderPersistent config ~/.aider.conf.yml:
model: deepseek/deepseek-coder
conventions: codex-skill/AGENTS.mdQwen (Alibaba Cloud)
Alibaba Cloud's coding model, free tier available.
# Set DashScope API key (get from https://dashscope.console.aliyun.com)
export DASHSCOPE_API_KEY="your-key"
aider --conventions codex-skill/AGENTS.md \
--model qwen/qwen-coder-plusOr via OpenAI-compatible endpoint:
export OPENAI_API_BASE="https://dashscope.aliyuncs.com/compatible-mode/v1"
export OPENAI_API_KEY="your-dashscope-key"
aider --conventions codex-skill/AGENTS.md \
--model qwen-coder-plus-latestDoubao (ByteDance)
export OPENAI_API_BASE="https://ark.cn-beijing.volces.com/api/v3"
export OPENAI_API_KEY="your-ark-key"
aider --conventions codex-skill/AGENTS.md \
--model your-doubao-endpoint-idWith Continue CLI
Configure ~/.continue/config.yaml:
# DeepSeek
models:
- name: deepseek-coder
provider: openai-compatible
apiBase: https://api.deepseek.com/v1
apiKey: your-deepseek-key
model: deepseek-coder
# Qwen
models:
- name: qwen-coder
provider: openai-compatible
apiBase: https://dashscope.aliyuncs.com/compatible-mode/v1
apiKey: your-dashscope-key
model: qwen-coder-plus-latestLocal 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
# macOS
brew install ollama
# Linux — download from https://ollama.com/download and install manually
# See https://github.com/ollama/ollama for platform-specific instructionsStep 2: Pull a model
Model | Command | Size | Note |
Qwen 2.5 Coder 32B |
| ~20GB | Best local coding model |
Qwen 2.5 Coder 7B |
| ~4.5GB | Low-memory option |
DeepSeek Coder V2 |
| ~8.9GB | Strong reasoning |
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 + local Qwen (recommended)
aider --conventions codex-skill/AGENTS.md \
--model ollama/qwen2.5-coder:32b
# Aider + local DeepSeek
aider --conventions codex-skill/AGENTS.md \
--model ollama/deepseek-coder-v2
# Low-memory option
aider --conventions codex-skill/AGENTS.md \
--model ollama/qwen2.5-coder:7bPersistent config ~/.aider.conf.yml:
model: ollama/qwen2.5-coder:32b
conventions: codex-skill/AGENTS.mdLocal Architecture
User → Aider CLI → Ollama (localhost:11434) → Qwen / DeepSeek local model
│ ↓
│ reads AGENTS.md instructions
│ ↓
└──────────────────────────────→ vmware-aiops CLI ──→ ESXi / vCenterTip: Local models are fully offline — perfect for air-gapped environments or strict data compliance.
CLI Reference
# Diagnostics
vmware-aiops doctor # Check environment, config, connectivity
vmware-aiops doctor --skip-auth # Skip vSphere auth check (faster)
# MCP Config Generator
vmware-aiops mcp-config generate --agent goose # Generate config for Goose
vmware-aiops mcp-config generate --agent claude-code # Generate config for Claude Code
vmware-aiops mcp-config list # List all supported agents
# VM operations
vmware-aiops vm power-on my-vm # Power on
vmware-aiops vm power-off my-vm # Graceful shutdown (2x confirm)
vmware-aiops vm power-off my-vm --force # Force power off (2x confirm)
vmware-aiops vm create my-new-vm --cpu 4 --memory 8192 --disk 100 # Create VM
vmware-aiops vm delete my-vm --confirm # Delete VM (2x confirm)
vmware-aiops vm reconfigure my-vm --cpu 4 --memory 8192 # Reconfigure (2x confirm)
vmware-aiops vm snapshot-create my-vm --name "before-upgrade" # Create snapshot
vmware-aiops vm snapshot-list my-vm # List snapshots
vmware-aiops vm snapshot-revert my-vm --name "before-upgrade" # Revert snapshot
vmware-aiops vm snapshot-delete my-vm --name "before-upgrade" # Delete snapshot
vmware-aiops vm clone my-vm --new-name my-vm-clone # Clone VM
vmware-aiops vm migrate my-vm --to-host esxi-02 # vMotion
vmware-aiops vm set-ttl my-vm --minutes 60 # Auto-delete in 60 min
vmware-aiops vm cancel-ttl my-vm # Cancel TTL
vmware-aiops vm list-ttl # Show all TTLs
vmware-aiops vm clean-slate my-vm --snapshot baseline # Revert to baseline (2x confirm)
# Guest Operations (requires VMware Tools in guest)
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
# Plan → Apply (multi-step operations)
vmware-aiops plan list # List pending/failed plans
# Deploy
vmware-aiops deploy ova ./ubuntu.ova --name my-vm --datastore ds1 # Deploy from OVA
vmware-aiops deploy template golden-ubuntu --name new-vm # Deploy from template
vmware-aiops deploy linked-clone --source base-vm --snapshot clean --name test-vm # Linked clone (seconds)
vmware-aiops deploy iso my-vm --iso "[datastore1] iso/ubuntu-22.04.iso" # Attach ISO
vmware-aiops deploy mark-template golden-vm # Convert VM to template
vmware-aiops deploy batch-clone --source base-vm --count 5 --prefix lab # Batch clone
vmware-aiops deploy batch deploy.yaml # Batch deploy from YAML spec
# Cluster
vmware-aiops cluster info my-cluster # Cluster details (HA/DRS status)
vmware-aiops cluster create my-cluster --ha --drs # Create cluster with HA+DRS
vmware-aiops cluster delete my-cluster # Delete cluster (2x confirm)
vmware-aiops cluster add-host my-cluster --host esxi-03 # Add host to cluster (2x confirm)
vmware-aiops cluster remove-host my-cluster --host esxi-03 # Remove host (2x confirm)
vmware-aiops cluster configure my-cluster --ha --drs # Configure HA/DRS (2x confirm)
# Datastore (browse and scan only — iSCSI/vSAN moved to vmware-storage)
vmware-aiops datastore browse datastore1 --path "iso/" # Browse datastore
vmware-aiops datastore scan-images --target home-esxi # Scan all datastores for images
# Scan
vmware-aiops scan now # One-time scan
# Daemon
vmware-aiops daemon start # Start scanner
vmware-aiops daemon status # Check status
vmware-aiops daemon stop # Stop daemon
# Companion skills for other operations:
# vmware-monitor: inventory, alarms, events, sensors
# vmware-storage: datastores, iSCSI, vSAN
# vmware-vks: Tanzu/TKC cluster lifecycleConfiguration
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 | false | SSL certificate verification |
scanner | interval_minutes | 15 | Scan frequency |
scanner | severity_threshold | warning | Min severity: critical/warning/info |
scanner | lookback_hours | 1 | How far back to scan |
scanner | log_types | [vpxd, hostd, vmkernel] | Log sources |
notify | log_file | ~/.vmware-aiops/scan.log | JSONL log output |
notify | webhook_url | — | Webhook endpoint (Slack, Discord, etc.) |
Project Structure
VMware-AIops/
├── .claude-plugin/ # Claude Code marketplace manifest
│ └── marketplace.json
├── plugins/ # Claude Code plugin
│ └── vmware-ops/
│ ├── .claude-plugin/
│ │ └── plugin.json
│ └── skills/
│ └── vmware-aiops/
│ └── SKILL.md # Full operations skill
├── 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.py # 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)
├── gemini-extension/ # Gemini CLI extension
│ ├── gemini-extension.json
│ └── GEMINI.md
├── codex-skill/ # Codex + Aider + Continue
│ ├── SKILL.md
│ └── AGENTS.md
├── trae-rules/ # Trae IDE rules
│ └── project_rules.md
├── kimi-skill/ # Kimi Code CLI skill
│ └── SKILL.md
├── mcp_server/ # MCP server wrapper
│ ├── server.py # FastMCP server with tools
│ └── __main__.py
├── smithery.yaml # Smithery marketplace config
├── RELEASE_NOTES.md
├── config.example.yaml
└── pyproject.tomlAPI Coverage
Built on pyVmomi (vSphere Web Services API / SOAP).
API Object | Usage |
| VM lifecycle, snapshots, clone, migrate |
| ESXi host info, sensors, services |
| Storage capacity, type, accessibility |
| File browsing, image discovery (ISO/OVA/VMDK) |
| OVA import and deployment |
| Cluster, DRS, HA |
| Network listing |
| Active alarm monitoring |
| Event/log queries |
Related Projects
Skill | Scope | Tools | Install |
Read-only monitoring, alarms, events | 8 |
| |
VM lifecycle, deployment, guest ops, cluster, datastore browse | 31 |
| |
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 — feel free to join us in maintaining and improving this project!
License
MIT
Available Tools
44 toolsacknowledge_vcenter_alarmA
[WRITE] Acknowledge a triggered vCenter alarm — marks it as seen WITHOUT clearing it.
The alarm stays in the active list with acknowledged=true until its condition clears or it is reset. To remove the alarm entirely after fixing the root cause, use reset_vcenter_alarm instead. Get exact entity_name and alarm_name values from list_vcenter_alarms first; an unknown pair returns a not-found error. Audited to ~/.vmware/audit.db.
Args: entity_name: Name of the VM, ESXi host, or cluster the alarm fired on (from list_vcenter_alarms output). alarm_name: Exact alarm definition name, e.g. "Virtual machine CPU usage". target: vCenter target name from config.yaml; omit to use the default target.
Returns: Dict: entity_name, alarm_name, action ("acknowledged"), acknowledged (true).
Inputs: alarm_name (required), entity_name (required), target.
attach_iso_to_vmA
[WRITE] Mount a datastore ISO into a VM's virtual CD-ROM drive.
Reconfigures the existing CD-ROM (replacing any currently mounted ISO) or adds a new CD-ROM on the VM's IDE controller if none exists; fails with a clear message if the VM has no IDE controller. Works whether the VM is powered on or off — the device is set connected and start-connected. Find ISO files first with browse_datastore using pattern "*.iso". Audited to ~/.vmware/audit.db.
Args: vm_name: Exact VM name as shown in vCenter inventory. iso_ds_path: Full datastore path in bracket format, e.g. "[datastore1] iso/ubuntu-22.04.iso" (datastore name in brackets, then the path relative to the datastore root). target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: Status string confirming attachment, or a VM-not-found / no-IDE-controller error.
Inputs: vm_name (required), iso_ds_path (required), target. Returns: result
batch_clone_vmsA
[WRITE] Batch clone multiple VMs from a source VM (gold image).
Each clone: full copy → optional reconfigure → optional snapshot → optional power on.
Args: source_vm_name: Source VM to clone from. vm_names: List of names for the new VMs. cpu: Override CPU count for all clones (optional). memory_mb: Override memory for all clones (optional). snapshot_name: Create a baseline snapshot on each clone (optional). power_on: Power on each clone after creation. target: Optional vCenter/ESXi target name from config.
Inputs: vm_names (required), source_vm_name (required), cpu, target, +3 more. Returns: result
batch_deploy_from_specA
[WRITE] Deploy multiple VMs in one call from a declarative YAML spec file.
Use for fleet provisioning (several VMs, shared defaults); for a single VM prefer deploy_vm_from_template, vm_clone, deploy_vm_from_ova, or deploy_linked_clone. The provisioning channel is chosen by spec keys: top-level "source" (full clone), "template", "linked_clone: {source, snapshot}", per-VM "ova", else empty-VM creation (optionally with "iso"). A "defaults" block sets cpu/memory_mb/disk_gb/network/ datastore/snapshot/power_on, overridable per VM. VMs deploy sequentially; one VM's failure is recorded and the rest continue. Audited to ~/.vmware/audit.db.
Args: spec_path: Local filesystem path to the deploy.yaml specification file. target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: One dict per VM: name, status ("ok" or "error"), and messages with per-step results.
Inputs: spec_path (required), target. Returns: result
batch_linked_clone_vmsA
[WRITE] Batch create linked clones from a VM snapshot (fastest batch provisioning).
Each clone shares the source disk via copy-on-write.
Args: source_vm_name: Source VM to clone from. snapshot_name: Snapshot to use as clone base. vm_names: List of names for the new linked clones. cpu: Override CPU count (optional). memory_mb: Override memory (optional). power_on: Power on each clone. baseline_snapshot: Create a new snapshot on each clone (optional). target: Optional vCenter/ESXi target name from config.
Inputs: vm_names (required), snapshot_name (required), source_vm_name (required), cpu, +4 more. Returns: result
browse_datastoreARead-onlyIdempotent
[READ] Browse files in a vSphere datastore directory.
Use this to discover OVA, ISO, VMDK, and other files on datastores before deploying VMs.
Args: datastore_name: Name of the datastore to browse. path: Subdirectory path (empty string for root). pattern: Glob pattern to filter files (e.g. ".ova", ".iso", "*"). target: Optional vCenter/ESXi target name from config.
Inputs: datastore_name (required), path, target, pattern. Returns: result
cluster_add_hostA
[WRITE] Move an ESXi host that vCenter already manages into a cluster.
The host must already be in vCenter inventory (standalone or in another cluster) — this tool does NOT register brand-new hosts and takes no host credentials; use the vCenter UI for first-time host registration. Idempotent: a host already in the cluster returns success without change. Maintenance mode is not required to join (it IS required by cluster_remove_host). Check membership with cluster_info. Audited to ~/.vmware/audit.db.
Args: cluster_name: Existing destination cluster name (create with cluster_create). host_name: Host name exactly as shown in vCenter inventory, typically the FQDN, e.g. "esxi-01.lab.local". target: vCenter target name from config.yaml; omit to use the default target.
Returns: Status string: moved, already-in-cluster, or host/cluster-not-found error.
Inputs: host_name (required), cluster_name (required), target. Returns: result
cluster_configureA
[WRITE] Reconfigure cluster HA/DRS settings.
Args: name: Cluster name. ha: Enable (True) or disable (False) HA, or None to leave unchanged. drs: Enable (True) or disable (False) DRS, or None to leave unchanged. drs_behavior: DRS behavior: "fullyAutomated", "partiallyAutomated", or "manual". target: Optional vCenter target name from config.
Inputs: name (required), ha, drs, target, +1 more. Returns: result
cluster_createA
[WRITE] Create a new empty cluster in a datacenter, optionally enabling HA and DRS.
Fails with a clear error (no partial state) if a cluster with that name already exists or drs_behavior is invalid. After creation, add hosts with cluster_add_host; change HA/DRS later with cluster_configure; verify with cluster_info. Audited to ~/.vmware/audit.db.
Args: name: Name for the new cluster; must be unique in the datacenter. datacenter: Datacenter name; omit to use the first datacenter on the target. ha: True enables vSphere HA (default False). drs: True enables DRS (default False). drs_behavior: "fullyAutomated" (default), "partiallyAutomated", or "manual". Only takes effect when drs=True. target: vCenter target name from config.yaml; omit to use the default target.
Returns: Status string confirming creation and which features (HA/DRS) were enabled.
Inputs: name (required), ha, drs, target, +2 more. Returns: result
cluster_deleteADestructive
[WRITE] Delete an empty cluster (no hosts must remain).
Args: name: Name of the cluster to delete. target: Optional vCenter target name from config.
Inputs: name (required), target. Returns: result
cluster_infoARead-onlyIdempotent
[READ] Get detailed cluster information: member hosts, HA/DRS config, resource capacity.
Read-only, no side effects. Use before cluster_add_host / cluster_remove_host (shows membership and per-host maintenance mode) and to verify cluster_configure changes.
Args: name: Exact cluster name. target: vCenter target name from config.yaml; omit to use the default target.
Returns: Dict with name, host_count, hosts (each: name, connection_state, power_state, maintenance_mode), ha_enabled, ha_admission_control, drs_enabled, drs_behavior, total/effective CPU (MHz) and memory (GB). Errors return a dict with "error" + hint.
Inputs: name (required), target.
cluster_remove_hostADestructive
[WRITE] Remove a host from a cluster (host must be in maintenance mode).
Args: cluster_name: Cluster to remove the host from. host_name: ESXi host name to remove. target: Optional vCenter target name from config.
Inputs: host_name (required), cluster_name (required), target. Returns: result
convert_vm_to_templateA
[WRITE] Convert a powered-off VM to a vSphere template.
After conversion the VM cannot be powered on — it serves as a clone source for deploy_vm_from_template.
Args: vm_name: Name of the VM to convert (must be powered off). target: Optional vCenter/ESXi target name from config.
Inputs: vm_name (required), target. Returns: result
deploy_linked_cloneA
[WRITE] Create a linked clone from a VM snapshot — near-instant, minimal disk usage.
The clone shares the source's base disk and writes changes to a copy-on-write delta disk, so it depends on the source VM staying intact. Fastest provisioning method for test/dev fleets; use vm_clone or deploy_vm_from_template for fully independent copies. Requires the source VM to have the named snapshot — run vm_list_snapshots first; unknown names return the available list. Audited to ~/.vmware/audit.db.
Args: source_vm_name: Exact name of the source VM (must have at least one snapshot). snapshot_name: Snapshot on the source to use as the clone base (from vm_list_snapshots). new_name: Name for the new linked clone; must not already exist. cpu: Override vCPU count; omit to keep the source's value. memory_mb: Override memory in MB; omit to keep the source's value. power_on: True powers the clone on after creation (default False). baseline_snapshot: If set, creates a snapshot with this name on the new clone. target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: Status string with the new clone name, or a snapshot/VM-not-found error.
Inputs: new_name (required), snapshot_name (required), source_vm_name (required), cpu, +4 more. Returns: result
deploy_vm_from_ovaA
[WRITE] Create a new VM by importing a local .ova file (OVF parse + VMDK upload).
Use for OVA appliance files on the local machine. For vSphere templates use deploy_vm_from_template; to copy an existing VM use vm_clone or deploy_linked_clone. Upload time scales with OVA size. Fails before creating anything if the datastore is not found. Audited to ~/.vmware/audit.db.
Args: ova_path: Local filesystem path to the .ova file (must be readable by this server). vm_name: Name for the new VM; must not already exist. datastore_name: Target datastore name; discover with browse_datastore. network_name: Port group for the VM's NICs (default "VM Network"). folder_path: vCenter VM folder path; omit to use the datacenter's root VM folder. power_on: True powers the VM on after import (default False). snapshot_name: If set, creates a baseline snapshot with this name after deploy. target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: Status string with the deployed VM name, or an error naming the missing resource.
Inputs: vm_name (required), ova_path (required), datastore_name (required), target, +4 more. Returns: result
deploy_vm_from_templateA
[WRITE] Deploy a new VM by cloning from a vSphere template.
Args: template_name: Name of the source vSphere template. new_name: Name for the new VM. datastore_name: Target datastore (uses template's datastore if omitted). cpu: Override CPU count (optional). memory_mb: Override memory in MB (optional). power_on: Power on after deployment. snapshot_name: Create a baseline snapshot with this name (optional). target: Optional vCenter/ESXi target name from config.
Inputs: new_name (required), template_name (required), cpu, target, +4 more. Returns: result
list_vcenter_alarmsARead-onlyIdempotent
[READ] List active/triggered alarms across the vCenter inventory.
Returns alarms with severity (critical/warning/info), entity name and type, alarm name, acknowledged flag, and trigger time.
Args: target: Optional vCenter target name from config. Uses default if omitted. limit: Max number of alarms to return (None = all). Use when many alarms are active.
Inputs: limit, target. Returns: result
reset_vcenter_alarmA
[WRITE] Clear triggered vCenter alarms back to normal state.
Uses AlarmManager.ClearTriggeredAlarms. The named alarm no longer appears in the active alarm list. Use this after resolving the underlying issue. Use list_vcenter_alarms to find entity_name and alarm_name values.
Gotcha: vSphere has no per-alarm clear — this clears ALL triggered alarms matching the named alarm's entity type (host/VM/all) and current status (red/yellow). The response's 'scope' field states exactly what was cleared.
Args: entity_name: Name of the entity with the alarm (VM name, host name, or cluster name). alarm_name: Exact alarm definition name from list_vcenter_alarms output. target: Optional vCenter target name from config.
Inputs: alarm_name (required), entity_name (required), target.
scan_datastore_imagesARead-onlyIdempotent
[READ] Scan all accessible datastores for deployable images (OVA/ISO/OVF/VMDK).
Results are cached locally in ~/.vmware-aiops/image_registry.json for fast lookup via list_cached_images. Run this to refresh the cache.
Args: target: Optional vCenter/ESXi target name from config.
Inputs: target.
vm_apply_planA
[WRITE] Execute a previously created plan step by step.
Steps run sequentially. On failure: stops immediately, keeps the plan file with per-step results, and returns rollback_available flag. On success: deletes the plan file.
If a step fails and rollback_available is true, ask the user whether to rollback, then call vm_rollback_plan if confirmed.
Args: plan_id: The plan ID returned by vm_create_plan. target: Optional vCenter/ESXi target name from config.
Inputs: plan_id (required), target.
vm_cancel_ttlADestructive
[WRITE] Cancel an existing TTL for a VM (prevents auto-deletion).
Args: vm_name: Name of the VM whose TTL should be cancelled.
Inputs: vm_name (required). Returns: result
vm_clean_slateADestructive
[WRITE] Revert a VM to its baseline snapshot (Clean Slate).
Powers off the VM first if it is running, then reverts to the named snapshot. Use this to reset a lab/dev VM to a clean starting state after a task completes.
Args: vm_name: Name of the VM to revert. snapshot_name: Snapshot name to revert to (default: "baseline"). target: Optional vCenter/ESXi target name from config.
Inputs: vm_name (required), target, snapshot_name. Returns: result
vm_cloneA
[WRITE] Clone a VM. Without to_host/to_datastore the clone lands on the source's host+datastore.
Args: vm_name: Source VM (or template) name. new_name: Name for the new clone. to_host: Target ESXi host name (default: source's host). to_datastore: Target datastore name (default: source's datastore). power_on: Power on the clone after creation. target: vCenter/ESXi target name from config.
Inputs: vm_name (required), new_name (required), target, to_host, +2 more. Returns: result
vm_createA
[WRITE] Create a new empty VM with the given hardware sizing.
Creates a powered-off VM with one disk and one NIC. To populate it, attach an ISO (attach_iso_to_vm) and power it on, or use deploy_vm_from_ova / deploy_vm_from_template / vm_clone for a ready-to-run guest. Fails before creating anything if the datastore is not found. Audited to ~/.vmware/audit.db.
Args: vm_name: Name for the new VM; must not already exist. cpu: vCPU count (default 2). memory_mb: Memory in MB (default 4096). disk_gb: Primary disk size in GB (default 40). network_name: Port group for the VM's NIC (default "VM Network"). datastore_name: Target datastore name; omit to use the first accessible datastore. folder_path: vCenter VM folder path; omit to use the datacenter's root VM folder. target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: Status string with the new VM name, or an error naming the missing resource.
Inputs: vm_name (required), cpu, target, disk_gb, +4 more. Returns: result
vm_create_planA
[WRITE] Create an execution plan for multi-step VM operations.
Auto-triggered when operations involve 2+ steps or 2+ VMs. Validates actions, checks target existence in vSphere, and generates a plan with rollback info for each step.
Each operation is a dict with "action" key plus action-specific params. Allowed actions: power_on, power_off, reset, suspend, create_vm, delete_vm, reconfigure, create_snapshot, delete_snapshot, revert_snapshot, clone, migrate, deploy_ova, deploy_template, linked_clone, attach_iso, convert_to_template.
Example: operations=[ {"action": "power_off", "vm_name": "test-1"}, {"action": "revert_snapshot", "vm_name": "test-1", "snapshot_name": "baseline"}, {"action": "power_on", "vm_name": "test-1"} ]
Returns plan dict with plan_id, steps, summary (vms_affected, irreversible_steps, rollback_available). Show to user for confirmation before calling vm_apply_plan.
Args: operations: List of operation dicts, each with "action" + params. target: Optional vCenter/ESXi target name from config.
Inputs: operations (required), target.
vm_create_snapshotAIdempotent
[WRITE] Create a snapshot of a VM.
Args: vm_name: VM to snapshot. snapshot_name: Snapshot name. description: Optional description. memory: Include memory state (heavier, allows resume). quiesce: Quiesce guest filesystem (requires running VMware Tools). target: vCenter/ESXi target name from config.
Inputs: vm_name (required), snapshot_name (required), memory, target, +2 more. Returns: result
vm_deleteADestructive
[WRITE] Delete a VM (irreversible). VM must be powered off.
Args: vm_name: VM to delete. Must be powered off. target: vCenter/ESXi target name from config.
Inputs: vm_name (required), target. Returns: result
vm_delete_snapshotADestructive
[WRITE] Permanently delete a named snapshot, consolidating its delta disk into the parent.
Frees disk space and does NOT change the VM's current state (unlike vm_revert_snapshot, which discards changes since the snapshot). Works while the VM is powered on. Run vm_list_snapshots first for exact names — unknown names return the available list. Irreversible: confirm with the user before calling. Audited to ~/.vmware/audit.db.
Snapshot consolidation is slow for old/large delta disks (often minutes). By default (wait=False) this fires the delete and returns a task id immediately so it does not block your context — poll completion with vm_task_status. Set wait=True only for small snapshots where you want the final confirmation inline (blocks up to 30 min, then returns the task id).
Args: vm_name: Exact name of the VM owning the snapshot. snapshot_name: Exact snapshot name from vm_list_snapshots output. remove_children: False (default) = children are kept and consolidated; True = delete the entire snapshot subtree below this one as well. wait: False (default) = async, return task id immediately; True = block on consolidation. target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: Status string with a task id (poll via vm_task_status), or a not-found message.
Inputs: vm_name (required), snapshot_name (required), wait, target, +1 more. Returns: result
vm_guest_downloadARead-onlyIdempotent
[READ] Download a file from a VM to local machine via VMware Tools.
Requires VMware Tools running in the guest OS.
Args: vm_name: Target VM name. guest_path: File path inside the guest to download. local_path: Local destination path. username: Guest OS username (default "root"). password: Guest OS password. target: Optional vCenter/ESXi target name from config.
Inputs: vm_name (required), guest_path (required), local_path (required), target, +2 more. Returns: result
vm_guest_execA
[WRITE] Execute a command inside a VM via VMware Tools.
Requires VMware Tools running in the guest OS. Returns exit_code, stdout, stderr, and timed_out flag.
Note: VMware Guest Ops API does not capture stdout/stderr directly. To capture output, redirect to a file and use vm_guest_download: command="/bin/bash", arguments="-c 'ls -la /tmp > /tmp/output.txt'" Then download /tmp/output.txt.
Args: vm_name: Target VM name. command: Full path to program (e.g. "/bin/bash", "C:\Windows\System32\cmd.exe"). arguments: Command arguments (e.g. "-c 'whoami'"). username: Guest OS username (default "root"). password: Guest OS password. working_directory: Working directory inside guest (optional). target: Optional vCenter/ESXi target name from config.
Inputs: command (required), vm_name (required), target, password, +3 more.
vm_guest_exec_outputA
[WRITE] Execute a shell command inside a VM and capture stdout + stderr.
Automatically detects guest OS (Linux/Windows) and selects the correct shell. Output is captured by redirecting to a temp file, downloading it, then cleaning up — no manual redirection needed.
Returns exit_code, stdout, stderr, timed_out, os_family.
Args: vm_name: Target VM name. command: Shell command (e.g. "df -h", "ls /etc", "ipconfig"). username: Guest OS username (default "root"). password: Guest OS password. timeout: Max wait seconds (default 300). target: Optional vCenter/ESXi target name from config.
Inputs: command (required), vm_name (required), target, timeout, +2 more.
vm_guest_provisionA
[WRITE] Provision a VM by running a sequence of guest operations (exec / upload / service).
Combines key injection, software installation, and service startup into a single call. Steps execute in order; stops on first failure.
Step types:
exec: {"type": "exec", "command": "apt-get install -y nginx"}
upload: {"type": "upload", "local_path": "/tmp/id_rsa.pub", "guest_path": "/root/.ssh/authorized_keys"}
service: {"type": "service", "name": "nginx", "action": "start"}
Args: vm_name: Target VM name. username: Guest OS username. password: Guest OS password. steps: Ordered list of step dicts. timeout: Per-step timeout in seconds (default 300). target: Optional vCenter/ESXi target name from config.
Returns: dict with success, completed_steps, total_steps, results, error.
Example: steps = [ {"type": "upload", "local_path": "~/.ssh/id_rsa.pub", "guest_path": "/root/.ssh/authorized_keys"}, {"type": "exec", "command": "chmod 600 /root/.ssh/authorized_keys"}, {"type": "exec", "command": "apt-get install -y nginx"}, {"type": "service", "name": "nginx", "action": "enable"}, {"type": "service", "name": "nginx", "action": "start"}, ]
Inputs: steps (required), vm_name (required), password (required), username (required), +2 more.
vm_guest_uploadA
[WRITE] Upload a file from local machine to a VM via VMware Tools.
Requires VMware Tools running in the guest OS.
Args: vm_name: Target VM name. local_path: Local file path to upload. guest_path: Destination path inside the guest. username: Guest OS username (default "root"). password: Guest OS password. target: Optional vCenter/ESXi target name from config.
Inputs: vm_name (required), guest_path (required), local_path (required), target, +2 more. Returns: result
vm_list_plansARead-onlyIdempotent
[READ] List all pending/failed plans.
Returns plan summaries (plan_id, created_at, status, steps count, VMs affected). Stale plans (>24h) are auto-cleaned.
Inputs: no named parameters. Returns: result
vm_list_snapshotsARead-onlyIdempotent
[READ] List the full snapshot tree of a VM, including nested child snapshots.
Read-only, no side effects. Call this before vm_revert_snapshot, vm_delete_snapshot, or deploy_linked_clone to get exact snapshot names. Returns an empty list when the VM has no snapshots.
Args: vm_name: Exact VM name as shown in vCenter inventory. target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: One dict per snapshot: name, description, created (timestamp), state (poweredOn/poweredOff at snapshot time), level (0 = root, higher = nesting depth). No pagination — snapshot trees are small.
Inputs: vm_name (required), target. Returns: result
vm_list_ttlARead-onlyIdempotent
[READ] List all VMs with TTLs registered, including expiry time and status.
Returns a list of TTL entries with remaining_minutes and expired flag.
Inputs: no named parameters. Returns: result
vm_migrateA
[WRITE] Migrate (vMotion) a VM to another host, optionally with storage vMotion.
If the target host has no access to the VM's current datastore, you MUST pass to_datastore — vCenter rejects cross-host vMotion without shared storage.
Args: vm_name: VM to migrate. to_host: Target ESXi host name. to_datastore: Target datastore (required for cross-storage hosts). target: vCenter/ESXi target name from config.
Inputs: to_host (required), vm_name (required), target, to_datastore. Returns: result
vm_power_offADestructive
[WRITE] Power off a VM — graceful guest shutdown by default, hard power-off with force=True.
Graceful mode calls VMware Tools guest shutdown and waits up to 120s; if Tools is not running or shutdown stalls, the response tells you to retry with force=True. An already-off VM returns success without change. Audited to ~/.vmware/audit.db. Use vm_power_on to start a VM; vm_delete requires the VM to be off first.
Args: vm_name: Exact VM name as shown in vCenter inventory (case-sensitive). force: False (default) = graceful guest shutdown via VMware Tools; True = immediate hard power-off (risks guest filesystem damage). target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: Status string: shut down, force powered off, already off, or a Tools-unavailable hint.
Inputs: vm_name (required), force, target. Returns: result
vm_power_onAIdempotent
[WRITE] Power on a virtual machine.
Args: vm_name: Exact name of the virtual machine. target: Optional vCenter/ESXi target name from config. Uses default if omitted.
Inputs: vm_name (required), target. Returns: result
vm_reconfigureA
[WRITE] Change a VM's vCPU count and/or memory.
Pass only the fields you want to change; omitted fields are left untouched. Hot-add of CPU/memory requires it to be enabled on the VM and a running guest; otherwise power the VM off first (vm_power_off). Audited to ~/.vmware/audit.db.
Args: vm_name: Exact name of the VM to reconfigure. cpu: New vCPU count; omit to leave unchanged. memory_mb: New memory in MB; omit to leave unchanged. target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: Status string describing the applied change, or a VM-not-found error.
Inputs: vm_name (required), cpu, target, memory_mb. Returns: result
vm_revert_snapshotADestructive
[WRITE] Revert a VM to a named snapshot (loses changes since snapshot).
Args: vm_name: VM to revert. snapshot_name: Snapshot to revert to. target: vCenter/ESXi target name from config.
Inputs: vm_name (required), snapshot_name (required), target. Returns: result
vm_rollback_planADestructive
[WRITE] Rollback executed steps of a failed plan in reverse order.
Only call this after vm_apply_plan returns status='failed' and the user confirms they want to rollback. Irreversible steps (delete_vm, revert_snapshot, etc.) are skipped with a warning.
Args: plan_id: The plan ID of the failed plan. target: Optional vCenter/ESXi target name from config.
Inputs: plan_id (required), target.
vm_set_ttlA
[WRITE] Set a Time-To-Live (TTL) for a VM. The daemon auto-deletes it when expired.
The scheduler daemon must be running (vmware-aiops daemon start) for
automatic deletion. TTLs are persisted in ~/.vmware-aiops/ttl.json.
Args: vm_name: Name of the VM to auto-delete. minutes: Minutes until deletion (minimum 1). target: Optional vCenter/ESXi target name from config.
Inputs: minutes (required), vm_name (required), target. Returns: result
vm_task_statusARead-onlyIdempotent
[READ] Poll a long-running vSphere task by its id (from an async vm_delete_snapshot).
Use after vm_delete_snapshot returns a task id to check whether the consolidation has finished, instead of re-running the delete. Returns state (queued/running/success/error/ gone), progress percent, and the entity name. 'gone' means vCenter already garbage-collected a completed task — re-list the resource to confirm the final state.
Args: task_id: The task id string returned by an async write operation. target: vCenter/ESXi target name from config.yaml; omit to use the default target.
Returns: Dict with task_id, state, progress_pct, operation, entity, and error/note when relevant.
Inputs: task_id (required), target.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 44 tools
Most tools have clear, distinct purposes (e.g., deploy_vm_from_ova vs deploy_vm_from_template vs vm_clone). However, some overlap exists between vm_guest_exec and vm_guest_exec_output (both execute commands in a guest), and deploy_vm_from_template vs vm_clone (both clone a template/VM), which could cause misselection.
Naming is mostly consistent with a verb_noun pattern (e.g., list_vcenter_alarms, vm_power_on, cluster_create). Minor deviations: vm_set_ttl vs vm_cancel_ttl (inconsistent verb placement), and batch_clone_vms vs batch_linked_clone_vms (not starting with vm_ despite being VM operations).
At 44 tools, this is on the heavy side but covers a broad domain (VM lifecycle, clustering, guest operations, snapshot management). It feels excessive for a single server, but each tool addresses a specific need. The count is borderline, leaning toward too many.
Covers a very comprehensive VM lifecycle: create, deploy, clone, snapshot, power, guest ops, cluster management, alarm handling, and TTL management. Minor gaps: no direct VM rename or NIC management tool, and no datastore management (e.g., create datastore) but these are not core to the server's primary purpose.
Maintenance
Related MCP Connectors
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
MCP-Native LLM Orchestration Agent
Remote MCP for RunComfy: ComfyUI deployments, hosted models, LoRA training. 31 tools.
Self-hosted AI prompt library: prompts, collections, tags, teams, chains. 29 MCP tools for agents.
Related MCP Servers
- 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
- AlicenseAqualityBmaintenanceRead-only VMware vCenter/ESXi monitoring. 8 MCP tools for VM inventory, host status, datastore capacity, cluster info, alarms, events, and VM details. Code-level enforced safety — no destructive operations exist in the codebase. Supports vSphere 6.5–8.0. Works with local models via Ollama/LM Studio.33839 PyPI18MIT
- AlicenseNot gradedqualityDmaintenanceEnables management of VMware vCenter and ESXi environments, including VM operations, resource management, and automation with Ollama AI and n8n workflows.4MIT
- 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