VMware AIops

io.github.vmware-skills由 GitHub 帳號 vmware-skills 發布v2.4.4更新於 Nov 8, 2026

AI-powered VMware vCenter/ESXi VM lifecycle and deployment with 61 MCP tools.

概覽

AI 產生的概覽

管理 VMware vCenter/ESXi 虛擬機:電源狀態、從 OVA/範本/複製部署、叢集、資料存放區、網路及客體命令。

可以做什麼
  • 檢視並變更虛擬機電源狀態、快照、TTL 自動清理,以及可回滾的多步驟計畫
  • 從 OVA、範本、完整或連結複製部署虛擬機,並支援批次或 YAML 規格批次部署
  • 瀏覽資料存放區並掃描可部署映像,掛載 ISO,將虛擬機轉為範本
  • 建立、設定和刪除叢集,管理 HA/DRS 規則,新增或移除主機
  • 列出和建立 dvSwitch 連接埠群組,管理主機 VMkernel 介面並執行 MTU 路徑 ping
  • 透過 VMware Tools 在客體中執行命令、上傳下載檔案;查詢帳號權限
適用情境
當助理需要在 vCenter 或獨立 ESXi 環境中建立、調整或移除虛擬機與叢集,或在客體中執行命令時使用。若只需唯讀的清單與告警監控,README 建議改用搭配的監控伺服器。
執行需求
本機 Python 3.10+ 程序,從 PyPI 安裝(uv tool install 或 pip)或以 uvx 執行。需要 VMWARE_AIOPS_CONFIG 指向的設定檔(預設 ~/.vmware-aiops/config.yaml)列出 vCenter/ESXi 目標,並在 .env 中以 VMWARE_{TARGET}_PASSWORD 變數提供各目標密碼。需能連線 vCenter/ESXi 網路;客體操作需安裝 VMware Tools。
安裝前請注意
寫入操作會作用於真實基礎設施:多數破壞性工具會先預覽並需 confirm=True,但約 20 個寫入工具(建立、複製、部署、開機、重新設定、建立快照、新增主機、ISO 與範本操作、客體下載、告警確認)首次呼叫即執行,且沒有唯讀開關。run_vm_guest_command 以工具參數傳入的憑證在客體中執行任意命令,不受 vCenter RBAC 限制;upload_vm_guest_file 可讀取程序可讀的任意本機檔案。請使用最小權限的 vCenter 帳號,生產環境謹慎使用。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 VMware AIops,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

VMware AIops

For a read-only check of this skill with your model and agent host, use the shared model-fit self-test in the marketplace root.

Author: Wei Zhou, VMware by Broadcom — [email protected] 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 — 61 tools.

Scope also includes datastore file browsing and deployment image discovery, alarm acknowledgment and reset, and an explicitly started scanning/TTL daemon with optional configured webhooks. Alarm reset can clear multiple matching alarms; guest commands and file transfers retain the account and file-access boundaries documented in the capabilities reference.

Companion skills handle everything else:

SkillScopeInstall
vmware-monitorRead-only: inventory, health, alarms, events, metricsuv tool install vmware-monitor
vmware-storageDatastores, iSCSI, vSAN managementuv tool install vmware-storage
vmware-vksTanzu Namespaces, TKC cluster lifecycleuv tool install vmware-vks

Need read-only monitoring only? Use VMware-Monitor — zero destructive code in the codebase.

[ClawHub] [Skills.sh] [Claude Code Marketplace] [License: MIT]

Upgrading to 2.0

2.0 renames 38 of its MCP tools so every name starts with a verb (e.g. cluster_add_host → add_cluster_host, cluster_configure → configure_cluster, cluster_create → create_cluster). The full old → new table is in RELEASE_NOTES.md. Nothing else changes: same tools, parameters, safety gates and CLI commands. If an agent prompt, script or ~/.vmware/rules.yaml names a tool, update it (but not the action words in saved plan files — cluster_add_host, storage_rescan and the like are plan actions, not tool names, and keep their spelling) — though deny rules written with the old names keep working with vmware-policy ≥ 1.18 (vmware-audit policy lists any rule the renames widened), and vmware-pilot ≥ 1.13 translates old names in saved workflows. If an install older than 2.0 shares that rules.yaml, give it vmware-policy ≥ 1.18.2 too: it matches each rule against both the old and the new name, so one file serves both.

⚡ 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.

QuestionCommandWhat it correlates
"What needs attention now?" across all vCentersvmware-aiops attentionEvery vCenter merged into one globally-ranked issue list; unreachable targets degrade gracefully
"Is anything on fire?" across all clustersvmware-aiops summaryEvery 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
bash
vmware-aiops attention                            # what needs attention now, all vCentersvmware-aiops investigate vm web-01 --hours 72     # everything around a VM, then act on itvmware-aiops investigate vm web-01 --html         # → offline snapshot in ~/vmware-health/

Via MCP these are the tools get_cluster_health_summary, get_cross_vcenter_attention, investigate_vm, investigate_host, investigate_datastore. (Requires vmware-monitor installed.)

Quick Install (Recommended)

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

bash
# Via Skills.shnpx skills add vmware-skills/VMware-AIops
# Via ClawHubclawhub install @zw008/vmware-aiops

PyPI Install (No GitHub Access Required)

bash
# Install via uv (recommended)uv tool install vmware-aiops
# Or via pippip install vmware-aiops
# China mainland mirror (faster)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:

bash
# From the source tree — a normal (non-editable) install builds a wheel:pip install .              # NOT  pip install -e .
# ...or upgrade pip first, and editable works too:pip install --upgrade pip && pip install -e .

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

bash
# On a connected machine, collect this package + its dependencies as wheels:pip wheel . -w dist        # → dist/*.whl   (or: uv build, for just this package)
# Copy dist/ to the air-gapped host, then install offline:pip install --no-index --find-links dist vmware-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 serversThis 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

CategoryToolsCount
VM Lifecyclepower on/off, TTL auto-delete, clean slate6
DeploymentOVA, template, linked clone, batch clone/deploy8
Guest Opsexec commands, upload/download files, provision5
Plan/Applymulti-step planning with rollback4
Clustercreate, delete, HA/DRS config, add/remove hosts6
Datastorebrowse files, scan for images2
NetworkdvSwitch portgroup list/create, host VMkernel list/add/remove, DF-bit MTU-path ping6
Accesswhich account is in use, and whether it holds each tool's privileges (get_access_info, CLI access-info)1

CLI vs MCP: Which Mode to Use

ScenarioRecommendedWhy
Local/small models (Ollama, Qwen <32B)CLI~2K tokens context vs ~10K for MCP; small models struggle with many tool schemas
Token-sensitive workflowsCLISKILL.md + Bash tool = minimal overhead
Cloud models (Claude, GPT-4o)EitherBoth work; MCP gives structured JSON I/O
Automated pipelines / Agent chainingMCPType-safe parameters, structured output, no shell parsing
Monitoring / storage / K8sCompanion skillsSee 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    orESXi Standalone Host ──→ VM

Version Compatibility

vSphere / VCF VersionSupportNotes
VCF 9.1 / vSphere 9.1✅ FullReleased 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✅ FullpyVmomi 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✅ FullCreateSnapshot_Task deprecated → use CreateSnapshotEx_Task
7.0 / 7.0U1-U3✅ FullAll APIs supported
6.7✅ CompatibleBackward-compatible, tested
6.5✅ CompatibleBackward-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.

Official Broadcom References

Common Workflows

Deploy a Lab Environment

  1. Browse datastore for OVA images → vmware-aiops datastore browse <ds> --pattern "*.ova"
  2. Deploy VM from OVA → vmware-aiops deploy ova ./image.ova --name lab-vm --datastore ds1
  3. Install software inside VM → vmware-aiops vm guest-exec lab-vm --cmd /bin/bash --args "-c 'apt-get install -y nginx'" --user root
  4. Create baseline snapshot → vmware-aiops vm snapshot-create lab-vm --name baseline
  5. Set TTL for auto-cleanup → vmware-aiops vm set-ttl lab-vm --minutes 480

Batch Clone for Testing

  1. Create plan: create_vm_plan with multiple clone + reconfigure steps
  2. Review plan with user (shows affected VMs, irreversible warnings)
  3. Apply: apply_vm_plan executes sequentially, stops on failure
  4. If failed: rollback_vm_plan reverses executed steps
  5. Set TTL on all clones for auto-cleanup

Migrate VM to Another Host

  1. Check VM info via vmware-monitor → verify power state and current host
  2. Migrate: vmware-aiops vm migrate my-vm --to-host esxi-02
  3. Verify migration completed

VM Lifecycle

OperationCommandConfirmationvCenterESXi
Power Onvm power-on <name>—✅✅
Graceful Shutdownvm power-off <name>Double✅✅
Force Power Offvm power-off <name> --forceDouble✅✅
Resetplan action reset via create_vm_plan (MCP; no CLI command)—✅✅
Suspendplan action suspend via create_vm_plan (MCP; no CLI command)—✅✅
Create VMvm create <name> --cpu --memory --disk—✅✅
Delete VMvm delete <name>Double✅✅
Reconfigurevm reconfigure <name> --cpu --memoryDouble✅✅
Create Snapshotvm snapshot-create <name> --name <snap>—✅✅
List Snapshotsvm snapshot-list <name>—✅✅
Revert Snapshotvm snapshot-revert <name> --name <snap>Double✅✅
Delete Snapshotvm snapshot-delete <name> --name <snap> [--no-wait]Double✅✅
Task Statusvm task-status <task-id>—✅✅
Clone VMvm clone <name> --new-name <new>Double✅✅
vMotionvm migrate <name> --to-host <host>Double✅❌
Set TTLvm set-ttl <name> --minutes <n>Double✅✅
Cancel TTLvm cancel-ttl <name>—✅✅
List TTLsvm list-ttl—✅✅
Clean Slatevm clean-slate <name> [--snapshot baseline]Double✅✅
Guest Execvm guest-exec <name> --cmd /bin/bash --args "..." --user <account>Double✅✅
Guest Exec (with output)MCP only: run_vm_guest_command_with_output (username required) — no CLI command—✅✅
Guest Uploadvm guest-upload <name> --local f.sh --guest /tmp/f.sh --user <account>Double✅✅
Guest Downloadvm 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. run_vm_guest_command_with_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:

StepWhat Happens
1. Create PlanAI calls create_vm_plan — validates actions, checks targets in vSphere, generates plan with rollback info
2. ReviewAI shows plan to user: steps, affected VMs, irreversible warnings
3. Applyapply_vm_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 rollback_vm_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

OperationCommandSpeedvCenterESXi
Deploy from OVAdeploy ova <path> --name <vm>Minutes✅✅
Deploy from Templatedeploy template <tmpl> --name <vm>Minutes✅✅
Linked Clonedeploy linked-clone --source <vm> --snapshot <snap> --name <new>Seconds✅✅
Attach ISOdeploy iso <vm> --iso "[ds] path/to.iso"Instant✅✅
Convert to Templatedeploy mark-template <vm>Instant✅✅
Batch Clonedeploy batch-clone --source <vm> --count <n>Minutes✅✅
Batch Deploy (YAML)deploy batch spec.yamlAuto✅✅

Cluster Management

OperationCommandConfirmationvCenterESXi
Cluster Infocluster info <name>—✅❌
Create Clustercluster create <name> [--ha] [--drs]—✅❌
Delete Clustercluster delete <name>Double✅❌
Add Hostcluster add-host <cluster> --host <host>Double✅❌
Remove Hostcluster remove-host <cluster> --host <host>Double✅❌
Configure HA/DRScluster 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

OperationCommandConfirmationvCenterESXi
List Triggered Alarmsalarm list [--target <t>]—✅❌
Acknowledge Alarmalarm acknowledge <entity> <alarm>—✅❌
Clear (Reset) Alarmsalarm 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

FeaturevCenterESXiDetails
Browse Files✅✅List files/folders in any datastore path
Scan Images✅✅Discover ISO, OVA, OVF, VMDK across all datastores

Scheduled Scanning & Notifications

FeatureDetails
DaemonAPScheduler-based, configurable interval (default 15 min)
Multi-target ScanSequentially scan all configured vCenter/ESXi targets
Scan ContentEach cycle: triggered alarms, vCenter events from the last lookback_hours, and new lines in the ESXi host logs hostd, vmkernel, vpxa
Host LogsRead 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 AnalysisHost-log lines matching error, fail, critical, panic, lost access, cannot, timeout, refused, corrupt — lines with critical/panic/corrupt are critical, the rest warning
Structured LogJSONL output to ~/.vmware-aiops/scan.log — every issue, info rows included
WebhookSlack, 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 SummaryOne 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 Managementdaemon start/stop/status, PID file, graceful shutdown

Safety Features

FeatureDetails
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 → LogCLI 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 confirm23 of the 43 write tools an agent sees over MCP — every tool annotated destructive, plus migrate_vm and the network/DRS authoring tools — preview first and need confirm=True; the other 20 (creates, clones, deploys, power-on, reconfigure, snapshot create, host add, template and ISO operations, guest download, plan creation, alarm acknowledge) 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 LoggingDeclined CLI confirmations are recorded in the audit trail
Audit TrailAll operations logged to ~/.vmware-aiops/audit.log (JSONL) with before/after state
Input ValidationVM 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 Supportverify_ssl: false — only for ESXi with self-signed certs in isolated labs; production should use CA-signed certificates
Prompt Injection ProtectionvSphere event messages and host logs are truncated, stripped of control characters, and wrapped in boundary markers before output
Webhook Data ScopeDisabled 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 a generic connection failure class; operational text can include host names, IP addresses, and user names. No credentials from the skill's config or .env are sent
Task WaitingAll async operations wait for completion and report result
State ValidationPre-operation checks (VM exists, power state correct)

vCenter vs ESXi Comparison

CapabilityvCenterESXi 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 migrate_vm and the network/DRS authoring tools — 23 of the 43 write tools, including power_off_vm, migrate_vm, delete_cluster, the snapshot, guest, TTL, Clean Slate and plan tools, and reset_vcenter_alarm — 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. delete_vm also takes the preview's acknowledge_with echoed back, and is refused if the VM changed since, is powered on or suspended. The other 20 write tools — creates, clones, deploys, power-on, reconfigure, snapshot create, host add, template and ISO operations, guest download, plan creation, alarm acknowledge — 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.

run_vm_guest_command 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. upload_vm_guest_file 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 run_vm_guest_command_with_output instead of run_vm_guest_command — it auto-captures stdout/stderr. Basic run_vm_guest_command 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 rollback_vm_plan. Irreversible steps (delete_vm) are skipped during rollback.

Connection refused / SSL error

  1. Verify target is reachable: vmware-aiops doctor
  2. For self-signed certs: set verify_ssl: false in config.yaml (lab environments only)

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

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


Supported AI Platforms

PlatformStatusConfig FileAI Model
Claude Code✅ Native Skillskills/vmware-aiops/SKILL.mdAnthropic Claude
Gemini CLI✅ Context file + MCPskills/vmware-aiops/SKILL.mdGoogle Gemini
OpenAI Codex CLI✅ Skill + AGENTS.mdskills/vmware-aiops/SKILL.mdOpenAI GPT
Aider✅ Conventionsskills/vmware-aiops/SKILL.mdAny (cloud + local)
Continue CLI✅ Rulesskills/vmware-aiops/SKILL.mdAny (cloud + local)
Trae IDE✅ Rulesskills/vmware-aiops/SKILL.mdClaude/DeepSeek/GPT-4o/Doubao
Kimi Code CLI✅ Skillskills/vmware-aiops/SKILL.mdMoonshot Kimi
MCP Server✅ MCP Protocolvmware_aiops/mcp_server/Any MCP client
Python CLI✅ StandaloneN/AN/A

Platform Comparison

FeatureClaude CodeGemini CLICodex CLIAiderContinueTrae IDEKimi CLI
Cloud AIAnthropicGoogleOpenAIAnyAnyMultiMoonshot
Local models———OllamaOllama——
Skill systemSKILL.mdContext fileSKILL.md—RulesRulesSKILL.md
MCP supportNativeNativeVia SkillsThird-partyNative——
Free tier—60 req/min—Self-hostedSelf-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 / ToolLocal Model SupportConfig TemplateIntegration Guide
Xiaoguai (小怪)✅ Self-hosted, any LLMMCP setupGuide
Goose✅ Ollama, LM Studiogoose.jsonGuide
LocalCowork✅ Fully offlinelocalcowork.jsonGuide
mcp-agent✅ Ollama, vLLMmcp-agent.yamlGuide
VS Code Copilot—vscode-copilot.jsonGuide
Cursor—cursor.jsonGuide
Continue✅ Ollamacontinue.yamlGuide
Claude Code—claude-code.json—

Xiaoguai (小怪) — a self-hostable, audit-first agent platform (Rust, single binary + embedded SQLite) from the same maintainer. It runs the 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):

bash
# Aider + Ollama + vmware-aiops (via SKILL.md)aider --conventions skills/vmware-aiops/SKILL.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 format

Installation

Step 0: Prerequisites

bash
# Python 3.10+ requiredpython3 --version
# Node.js 18+ required for Gemini CLI and Codex CLInode --version

Step 1: Clone & Install Python Backend

All platforms share the same Python backend.

bash
git clone https://github.com/vmware-skills/VMware-AIops.gitcd VMware-AIopspython3 -m venv .venvsource .venv/bin/activatepip install -e .

Step 2: Configure

bash
mkdir -p ~/.vmware-aiopscp config.example.yaml ~/.vmware-aiops/config.yaml# Edit config.yaml with your vCenter/ESXi targets

Set passwords via .env file (recommended):

bash
# Use the templatecp .env.example ~/.vmware-aiops/.env
# Edit and fill in your passwords, then lock permissionschmod 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

Scanner notification failures report an HTTP status or exception class. Raw webhook response bodies, transport errors and connection exceptions are excluded from notification diagnostics and audit summaries to keep endpoint tokens out of them.

  • 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

Step 3: Connect Your AI Tool

Choose one (or more) of the following:


Option A: Claude Code

Method 1: Skills.sh or ClawHub (recommended)

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

bash
npx skills add vmware-skills/VMware-AIops# orclawhub install @zw008/vmware-aiops

Method 2: Manual skill install

bash
git clone https://github.com/vmware-skills/VMware-AIops.gitcd VMware-AIops
# Copy the skill into Claude Code's personal skills directorymkdir -p ~/.claude/skills/vmware-aiopscp -r skills/vmware-aiops/. ~/.claude/skills/vmware-aiops/

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

bash
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
bash
# Install Gemini CLInpm install -g @google/gemini-cli
# Load the skill as project context (Gemini CLI reads GEMINI.md on startup)cp skills/vmware-aiops/SKILL.md ./GEMINI.md

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

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
bash
# Install Codex CLInpm i -g @openai/codex# Or on macOS:# brew install --cask codex
# Copy skill to Codex skills directorymkdir -p ~/.codex/skills/vmware-aiopscp skills/vmware-aiops/SKILL.md ~/.codex/skills/vmware-aiops/SKILL.md
# Copy AGENTS.md to project rootcp skills/vmware-aiops/SKILL.md ./AGENTS.md

Then start Codex CLI:

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

Option D: Aider (supports local models)
bash
# Install Aiderpip install aider-chat
# Install Ollama for local models (optional)# macOS:brew install ollamaollama pull qwen2.5-coder:32b
# Run with cloud APIaider --conventions skills/vmware-aiops/SKILL.md
# Or with local model via Ollamaaider --conventions skills/vmware-aiops/SKILL.md \  --model ollama/qwen2.5-coder:32b

Option E: Continue CLI (supports local models)
bash
# Install Continue CLInpm i -g @continuedev/cli
# Copy rules filemkdir -p .continue/rulescp skills/vmware-aiops/SKILL.md .continue/rules/vmware-aiops.md

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

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

Then:

bash
cn> Check ESXi health and alarms

Option F: Trae IDE

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

bash
mkdir -p .trae/rulescp 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
bash
# Copy skill file to Kimi skills directorymkdir -p ~/.kimi/skills/vmware-aiopscp 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+):

bash
# Recommended — single command, no network re-resolvevmware-aiops mcp
# With a custom config pathVMWARE_AIOPS_CONFIG=/path/to/config.yaml vmware-aiops mcp

Claude Desktop config (claude_desktop_config.json):

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
bash
# 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-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)
bash
# Already installed in Step 1source .venv/bin/activate
vmware-aiops vm power-on my-vm --target home-esxivmware-aiops deploy ova ./ubuntu.ova --name my-vm --target home-esxivmware-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 ChannelUpdate Command
ClawHubclawhub install @zw008/vmware-aiops
Skills.shnpx skills add vmware-skills/VMware-AIops
Git clonecd VMware-AIops && git pull origin main && uv pip install --no-sources -e . (without --no-sources, uv looks for a sibling ../VMware-Monitor checkout)
uvuv 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.

bash
# Set DeepSeek API key (get from https://platform.deepseek.com)export DEEPSEEK_API_KEY="your-key"
# Run with Aideraider --conventions skills/vmware-aiops/SKILL.md \  --model deepseek/deepseek-coder

Persistent config ~/.aider.conf.yml:

yaml
model: deepseek/deepseek-coderconventions: skills/vmware-aiops/SKILL.md

Qwen (Alibaba Cloud)

Alibaba Cloud's coding model, free tier available.

bash
# Set DashScope API key (get from https://dashscope.console.aliyun.com)export DASHSCOPE_API_KEY="your-key"
aider --conventions skills/vmware-aiops/SKILL.md \  --model qwen/qwen-coder-plus

Or via OpenAI-compatible endpoint:

bash
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)

bash
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:

yaml
# DeepSeekmodels:  - name: deepseek-coder    provider: openai-compatible    apiBase: https://api.deepseek.com/v1    apiKey: your-deepseek-key    model: deepseek-coder
# Qwenmodels:  - 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

bash
# macOSbrew install ollama
# Linux — download from https://ollama.com/download and install manually# See https://github.com/ollama/ollama for platform-specific instructions

Step 2: Pull a model

ModelCommandSizeNote
Qwen 2.5 Coder 32Bollama pull qwen2.5-coder:32b~20GBBest local coding model
Qwen 2.5 Coder 7Bollama pull qwen2.5-coder:7b~4.5GBLow-memory option
DeepSeek Coder V2ollama pull deepseek-coder-v2~8.9GBStrong reasoning
CodeLlama 34Bollama pull codellama:34b~19GBMeta coding model

Hardware: 32B → ~20GB VRAM (or 32GB RAM for CPU). 7B → 8GB RAM.

Step 3: Run with Aider

bash
pip install aider-chatollama serve
# Aider + local Qwen (recommended)aider --conventions skills/vmware-aiops/SKILL.md \  --model ollama/qwen2.5-coder:32b
# Aider + local DeepSeekaider --conventions skills/vmware-aiops/SKILL.md \  --model ollama/deepseek-coder-v2
# Low-memory optionaider --conventions skills/vmware-aiops/SKILL.md \  --model ollama/qwen2.5-coder:7b

Persistent config ~/.aider.conf.yml:

yaml
model: ollama/qwen2.5-coder:32bconventions: 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

bash
# Diagnosticsvmware-aiops doctor                   # Check environment, config, connectivityvmware-aiops doctor --skip-auth       # Skip vSphere auth check (faster)vmware-aiops access-info [--tool <mcp-tool>] [--target <name>]  # Account in use + privileges per tool
# MCP Config Generatorvmware-aiops mcp-config generate --agent goose        # Generate config for Goosevmware-aiops mcp-config generate --agent claude-code  # Generate config for Claude Codevmware-aiops mcp-config list                          # List all supported agents
# VM operationsvmware-aiops vm power-on my-vm                                 # Power onvmware-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 VMvmware-aiops vm delete my-vm                                   # Delete VM (asks twice; --dry-run previews)vmware-aiops vm reconfigure my-vm --cpu 4 --memory 8192        # Reconfigure (2x confirm)vmware-aiops vm snapshot-create my-vm --name "before-upgrade"  # Create snapshotvmware-aiops vm snapshot-list my-vm                            # List snapshotsvmware-aiops vm snapshot-revert my-vm --name "before-upgrade"  # Revert snapshotvmware-aiops vm snapshot-delete my-vm --name "before-upgrade"  # Delete snapshot (waits ≤30 min for consolidation)vmware-aiops vm snapshot-delete my-vm --name "old-big" --no-wait  # Fire async, return a task idvmware-aiops vm task-status task-1234                          # Poll an async task by idvmware-aiops vm clone my-vm --new-name my-vm-clone             # Clone VMvmware-aiops vm migrate my-vm --to-host esxi-02                # vMotionvmware-aiops vm set-ttl my-vm --minutes 60                     # Auto-delete in 60 minvmware-aiops vm cancel-ttl my-vm                               # Cancel TTLvmware-aiops vm list-ttl                                       # Show all TTLsvmware-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 rootvmware-aiops vm guest-upload my-vm --local ./script.sh --guest /tmp/script.sh --user rootvmware-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
# Deployvmware-aiops deploy ova ./ubuntu.ova --name my-vm --datastore ds1      # Deploy from OVAvmware-aiops deploy template golden-ubuntu --name new-vm               # Deploy from templatevmware-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 ISOvmware-aiops deploy mark-template golden-vm                            # Convert VM to templatevmware-aiops deploy batch-clone --source base-vm --count 5 --prefix lab  # Batch clonevmware-aiops deploy batch deploy.yaml                                  # Batch deploy from YAML spec
# Clustervmware-aiops cluster info my-cluster                                   # Cluster details (HA/DRS status)vmware-aiops cluster create my-cluster --ha --drs                      # Create cluster with HA+DRSvmware-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)
# Alarm managementvmware-aiops alarm list                                                # List triggered alarmsvmware-aiops alarm acknowledge esxi-01 "Host memory usage"             # Acknowledge alarmvmware-aiops alarm reset esxi-01 "Host memory usage"                   # Clear alarms (2x confirm; clears ALL matching entity type + status)
# Datastore (browse and scan only — iSCSI/vSAN moved to vmware-storage)vmware-aiops datastore browse datastore1 --path "iso/"                 # Browse datastorevmware-aiops datastore scan-images --target home-esxi                  # Scan all datastores for images
# Scanvmware-aiops scan now              # One-time scan of alarms and events (host logs: daemon only)
# Daemonvmware-aiops daemon start          # Start scannervmware-aiops daemon status         # Check statusvmware-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 lifecycle

Configuration

See config.example.yaml for all options.

SectionKeyDefaultDescription
targetsname—Friendly name
targetshost—vCenter/ESXi hostname or IP
targetstypevcentervcenter or esxi
targetsport443Connection port
targetsverify_ssltrueVerify the target's TLS certificate (set false only for self-signed lab hosts)
scannerinterval_minutes15Scan frequency
scannerseverity_thresholdwarningMin severity: critical/warning/info
scannerlookback_hours1How far back to scan
scannerlog_types—Not read by any code — the daemon always reads the hostd, vmkernel and vpxa host logs. Setting it changes nothing
notifylog_file~/.vmware-aiops/scan.logJSONL log output
notifywebhook_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 ObjectUsage
vim.VirtualMachineVM lifecycle, snapshots, clone, migrate
vim.HostSystemESXi host info, sensors, services
vim.DatastoreStorage capacity, type, accessibility
vim.host.DatastoreBrowserFile browsing, image discovery (ISO/OVA/VMDK)
vim.OvfManagerOVA import and deployment
vim.ClusterComputeResourceCluster, DRS, HA
vim.NetworkNetwork listing
vim.alarm.AlarmManagerActive alarm monitoring
vim.event.EventManagerEvent/log queries

Related Projects

SkillScopeToolsInstall
vmware-aiopsVM lifecycle, deployment, guest ops, cluster, datastore browse, triage49uv tool install vmware-aiops
vmware-monitorRead-only monitoring, alarms, events, investigation bundles27uv tool install vmware-monitor
vmware-storageDatastores, iSCSI, vSAN11uv tool install vmware-storage
vmware-vksTanzu Namespaces, TKC cluster lifecycle20uv tool install vmware-vks
vmware-nsxNSX networking: segments, gateways, NAT, routing, IPAM33uv tool install vmware-nsx-mgmt
vmware-nsx-securityDFW policies/rules, security groups, Traceflow, IDS/IPS21uv tool install vmware-nsx-security
vmware-ariaAria Operations metrics, alerts, capacity, anomalies28uv tool install vmware-aria
vmware-aviAVI (NSX ALB) load balancing, AKO Kubernetes ops28uv tool install vmware-avi
vmware-hardenCompliance baselines (CIS / vSphere SCG / 等保 / PCI-DSS), drift detection6uv tool install vmware-harden

Troubleshooting & Contributing

If you encounter any errors or issues, please send the error message, logs, or screenshots to [email protected]. Contributions are welcome — feel free to join us in maintaining and improving this project!

Remote access (HTTPS) and limiting tools

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

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

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

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

bash
claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \    --header "Authorization: Bearer $VMWARE_MCP_TOKEN"
json
{  "mcpServers": {    "vmware-aiops": {      "type": "http",      "url": "https://mcp.example.com:8443/mcp",      "headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }    }  }}
  • The server will not start without a token, refuses Host/Origin values outside --public-name, and checks before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.
  • Behind a TLS-terminating reverse proxy on the same machine use --transport http --host 127.0.0.1 --public-name mcp.example.com and pass the Authorization header through.
  • Behind a load balancer or gateway on another machine, keep --transport https (a self-signed certificate is fine), list in --public-name the host name the balancer sends as Host, and have it forward Authorization. Its health probe can use GET /healthz, which needs no token and returns only {"status": "ok"} (vmware-policy ≥ 1.23.0).
  • Send traceparent or X-Request-ID with each request to have it stored on the audit row; vmware-audit log --correlation-id ID then finds the calls behind one platform request.
  • Tools that read or write files on this server (here: guest file upload/download, OVA and deployment-spec files) never touch its configuration, tokens, audit log or TLS key, and over the network they are off unless VMWARE_MCP_FILE_ROOT names a directory for them (vmware-policy ≥ 1.23.1).
  • The audit log records each caller as token:<name>. Calls run side by side, with up to VMWARE_MCP_POOL_SIZE (default 2) sessions per target; each session is a login on the target, and a call waits at most 300 s for one.
  • Everyone who can reach the endpoint acts with this server's account. Tokens identify callers; they grant nothing on the platform. Run one endpoint per privilege level.
  • Several people or roles on one endpoint: run vmware-audit roles enable once, then give each token a role (vmware-audit token create NAME --role reader, or a role in roles.yaml naming tools and targets; vmware-policy ≥ 1.24.0). A role limits what the token may call on this endpoint; it cannot grant more than the account has. See vmware-policy's README, "Roles for network callers".

Offer only read tools, plus the writes you choose:

bash
vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm# or: VMWARE_AIOPS_MCP_EXPOSE=read VMWARE_AIOPS_MCP_ALLOW_WRITE=acknowledge_vcenter_alarm vmware-aiops mcp

Tools not offered do not appear in the client's tool list. A bad value or an unknown write tool stops the server (exit 2). This limits what clients are offered; it is not authorization, so the account itself should be least-privilege.

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

License

MIT

來源:README.md,提交 aeff87a

工具

61

get_access_info

[READ] The account this server uses on a target, and whether it holds a tool's privileges. When to use: a tool failed with NoPermission, or before a write you want to know the configured account may run. Ask about one ``tool`` (e.g. clone_vm), or omit it to sort every tool of this server into granted / not granted / undetermined. What it returns: {target, account, checked_on, privileges {id: state}, and either ``tool`` {name, requires, verdict, meaning, missing_at_root} or the tools_* lists}, plus the account's direct permissions (role, on, propagate). Gotchas: privileges are checked on the vCenter/ESXi **root folder** only. ``not_granted_at_root`` does not mean no access — a permission on a cluster, folder or VM still lets the tool work there. ``undetermined`` means the platform did not answer, or the tool's deciding permission is not a vSphere privilege (ping_from_vmk); it is never to be read as granted. Changes nothing.

輸入參數tooltarget

list_vcenter_alarms

[READ] List active/triggered alarms across the vCenter inventory. Start here for alarm work: it supplies the exact entity_name/alarm_name pair that acknowledge_vcenter_alarm and reset_vcenter_alarm require. Returns the list envelope: 'items' holds severity (critical/warning/info), entity name and type, alarm name, acknowledged flag, and trigger time; 'returned'/'limit'/'total'/'truncated'/'hint' state completeness, so a limited page is never mistaken for the whole picture. 'total' is the real active-alarm count — every alarm is collected before the limit is applied.

輸入參數limittarget

acknowledge_vcenter_alarm

[WRITE] Acknowledge a triggered vCenter alarm — marks it as seen WITHOUT clearing it. This only marks the alarm; it does not clear it. The alarm stays in the active list with acknowledged=true until its condition clears or it is reset. To remove it entirely after fixing the root cause use reset_vcenter_alarm instead. Get exact entity_name and alarm_name from list_vcenter_alarms first; an unknown pair returns a not-found error. Returns: Dict: entity_name, alarm_name, action ("acknowledged"), acknowledged (true).

輸入參數targetalarm_name必填entity_name必填

reset_vcenter_alarm

[WRITE] Clear triggered vCenter alarms back to normal state. Use this after resolving the underlying issue; to merely mark an alarm seen use acknowledge_vcenter_alarm instead. Get entity_name and alarm_name from list_vcenter_alarms first. vSphere has no per-alarm clear: this clears EVERY triggered alarm with the named alarm's status (red/yellow) on its entity type (host/VM/all), usually more than the one named. Without confirm=True this only previews: it returns blast_radius with will_clear_count and the alarms it would clear, and changes nothing. Show it to the user and get their decision; do not set confirm=True on your own. Refused when the list of alarms cannot be read. Returns: Dict with action (preview, reset), blast_radius, and on reset the scope cleared.

輸入參數targetconfirmalarm_name必填entity_name必填

create_cluster

[WRITE] Create a new empty cluster in a datacenter, optionally enabling HA and DRS. Fails with a clear error (no partial state) if the name already exists or drs_behavior is invalid. Then add hosts with add_cluster_host, change HA/DRS later with configure_cluster, and verify with get_cluster_info. Returns a status string naming the features enabled.

輸入參數hadrsname必填targetdatacenterdrs_behavior

delete_cluster

[WRITE] Delete an empty cluster (no hosts must remain). Without confirm=True this only previews: it returns blast_radius (cluster name and id, host/VM/datastore counts and names, blockers) and deletes nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Refused: a cluster that still has hosts or VMs (evacuate members with remove_cluster_host first), or one whose members could not be read. Check get_cluster_info first. Returns a dict (action, blast_radius).

輸入參數name必填targetconfirm

add_cluster_host

[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 does NOT register brand-new hosts and takes no host credentials; use the vCenter UI for first-time registration. Idempotent: a host already in the cluster returns success without change. Maintenance mode is not required to join (it IS required by remove_cluster_host). Check membership first with get_cluster_info. Returns a status string: moved, already-in-cluster, or a not-found error.

輸入參數targethost_name必填cluster_name必填

remove_cluster_host

[WRITE] Remove a host from a cluster (host must be in maintenance mode). Without confirm=True this only previews: it returns blast_radius (host name and id, maintenance mode, VM count, powered-on VM count, blockers) and moves nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Refused: a host not in maintenance mode, a host with powered-on VMs, and a host whose state could not be read. Run get_cluster_info first for the exact member host names. The host is not deleted — it stays in vCenter inventory standalone; use add_cluster_host to move it back. Returns a dict.

輸入參數targetconfirmhost_name必填cluster_name必填

configure_cluster

[WRITE] Reconfigure cluster HA/DRS settings. Returns a status string naming what changed. Pass only the fields to change; None leaves a setting untouched — then verify with get_cluster_info. drs_behavior applies only when DRS is enabled.

輸入參數hadrsname必填targetdrs_behavior

get_cluster_info

[READ] Get detailed cluster information: member hosts, HA/DRS config, resource capacity. Read-only, no side effects. Use before add_cluster_host / remove_cluster_host (shows membership and per-host maintenance mode) and to verify configure_cluster changes. 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.

輸入參數name必填target

list_drs_rules

[READ] List a cluster's DRS rules: VM-VM affinity/anti-affinity and VM-Host. Per rule: key, name, type (affinity / antiAffinity / vmHost), enabled, mandatory, and the member VM names (VM-VM) or group names (VM-Host). The verify pair for create/delete/set_drs_rule_enabled. Returns: Dict with cluster, count, and rules sorted by name. Errors return a dict with "error" + hint.

輸入參數targetcluster必填

set_drs_rule_enabled

[WRITE] Enable or disable an existing DRS rule - preview/confirm gated. The day-2 toggle: anti-affinity rules often must be disabled while a cluster is temporarily too small to satisfy them, then re-enabled when hosts return. Idempotent - matching state returns a noop, no write. Names are matched exactly; ambiguous names refuse. Audited. Returns: Preview dict (action="preview"), noop dict (action="noop"), or result dict (action="set", rule_now). Errors return "error" + hint.

輸入參數targetcluster必填confirmenabled必填rule_name必填

create_drs_rule

[WRITE] Create a VM-VM DRS rule (affinity or anti-affinity) - preview/confirm gated. rule_type "affinity" keeps the listed VMs together; "antiAffinity" keeps them apart (e.g. redundant appliance pairs on separate hosts). Requires >=2 distinct VMs, all members of the cluster. VM-Host rules hang off cluster VM/host groups and are not created here. Verify with list_drs_rules. Audited. Returns: Preview dict (action="preview", would_create) or result dict (action="created", created incl. the assigned key). Errors return a dict with "error" + hint.

輸入參數targetcluster必填confirmenabledvm_names必填rule_name必填rule_type必填

delete_drs_rule

[WRITE] Delete a VM-VM DRS rule - confirm-gated, guarded. REFUSES non-VM-VM rules: VM-Host rules can carry licensing/compliance placement constraints (must-run-on licensed hosts) and hang off cluster groups - manage those in the vSphere UI. The preview and result both record the full rule definition so a mistaken delete can be recreated from the audit trail. Audited. Returns: Preview dict (action="preview", would_delete) or result dict (action="deleted", deleted). Errors return a dict with "error" + hint.

輸入參數targetcluster必填confirmrule_name必填

browse_datastore

[READ] Search a vSphere datastore folder and all its subfolders for files. Use this to find OVA/ISO/VMDK paths before calling deploy_vm_from_ova or attach_iso_to_vm; for an estate-wide image sweep use scan_all_datastore_images. Returns the list envelope: 'items' is one row per file, and 'returned'/'total'/'truncated' state completeness. Every match in the searched folders is returned, so truncated is always false.

輸入參數pathtargetpatterndatastore_name必填

scan_all_datastore_images

[READ] Scan all accessible datastores for deployable images (OVA/ISO/OVF/VMDK). Returns the images found and refreshes the cache at ~/.vmware-aiops/image_registry.json. Use this when you do not know which datastore holds an image; prefer browse_datastore once you do, because this walks every datastore and may take minutes on a large estate. Returns: The family list envelope {items, returned, limit, total, truncated, hint} plus `last_scan`; each item is one image. `images` is kept as a deprecated alias for `items`.

輸入參數target

deploy_vm_from_ova

[WRITE] Create a new VM by importing a local .ova file (OVF parse + VMDK upload). Use for local OVA files; for vSphere templates use deploy_vm_from_template, to copy an existing VM clone_vm. Returns a status string naming the new VM. Upload time scales with OVA size; fails before creating anything if the datastore is not found.

輸入參數targetvm_name必填ova_path必填power_onfolder_pathnetwork_namesnapshot_namedatastore_name必填

deploy_vm_from_template

[WRITE] Deploy a new VM by cloning from a vSphere template. Returns a status string. Use for VMs marked as templates; for a running source VM use clone_vm. Requires an existing template — convert_vm_to_template makes one.

輸入參數cputargetnew_name必填power_onmemory_mbtarget_hostsnapshot_nametemplate_name必填datastore_name

deploy_linked_clone

[WRITE] Create a linked clone from a VM snapshot — near-instant, minimal disk usage. The clone writes to a copy-on-write delta over the source's base disk, so it depends on the source staying intact. Fastest provisioning for test/dev fleets; use clone_vm for fully independent copies. Requires the named snapshot — run list_vm_snapshots first. Returns a status string with the new clone name.

輸入參數cputargetnew_name必填power_onmemory_mbsnapshot_name必填source_vm_name必填baseline_snapshot

attach_iso_to_vm

[WRITE] Mount a datastore ISO into a VM's virtual CD-ROM drive. Reconfigures the existing CD-ROM (replacing any mounted ISO) or adds one on the VM's IDE controller; fails with a clear message if the VM has no IDE controller. Works whether the VM is powered on or off. Find ISO paths first with browse_datastore using pattern "*.iso". Returns a status string confirming attachment, or a VM-not-found / no-IDE-controller error.

輸入參數targetvm_name必填iso_ds_path必填

convert_vm_to_template

[WRITE] Convert a powered-off VM to a vSphere template. Returns a status string. Use this to freeze a golden image: afterwards the VM cannot be powered on and serves only as a clone source for deploy_vm_from_template.

輸入參數targetvm_name必填

batch_clone_vms

[WRITE] Batch clone multiple VMs from a source VM (gold image). Each clone: full copy → optional reconfigure → optional snapshot → optional power on. Returns one dict per VM with its status. Clones run sequentially, so a long vm_names list may take a while — prefer batch_linked_clone_vms for disposable test copies.

輸入參數cputargetpower_onvm_names必填memory_mbsnapshot_namesource_vm_name必填

batch_linked_clone_vms

[WRITE] Batch create linked clones from a VM snapshot (fastest batch provisioning). Clones share the source disk via copy-on-write, so the source must stay intact. Returns one dict per clone. Prefer batch_clone_vms for independent copies.

輸入參數cputargetpower_onvm_names必填memory_mbsnapshot_name必填source_vm_name必填baseline_snapshot

batch_deploy_from_spec

[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, clone_vm, deploy_vm_from_ova, or deploy_linked_clone. The channel is chosen by spec keys: "source" (full clone), "template", "linked_clone: {source, snapshot}", per-VM "ova", else empty-VM creation (optionally "iso"). A "defaults" block sets cpu/memory_mb/disk_gb/network/ datastore/snapshot/power_on, overridable per VM. VMs deploy sequentially and one VM's failure does not stop the rest. Returns: One dict per VM: name, status ("ok" or "error"), and messages with per-step results.

輸入參數targetspec_path必填

run_vm_guest_command

[WRITE] Execute a command inside a VM via VMware Tools. Requires VMware Tools running in the guest OS. Returns exit_code, stdout, stderr, timed_out, and blast_radius. Without confirm=True this only previews: blast_radius names the VM (name, instance UUID), the guest account, the exact command, arguments and working directory, VMware Tools status and any blockers; nothing runs. Show it to the user. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Refused outright: VM not powered on, VMware Tools not running, an identity or status that cannot be read, or a name that matches more than one VM. Note: the Guest Ops API does not capture stdout/stderr directly, so use this only for fire-and-forget commands — prefer run_vm_guest_command_with_output whenever you need the output.

輸入參數targetcommand必填confirmvm_name必填passwordusername必填argumentsworking_directory

run_vm_guest_command_with_output

[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. Prefer this over run_vm_guest_command whenever you need the output. Requires VMware Tools running and a writable temp directory in the guest. Returns exit_code, stdout, stderr, timed_out, os_family, and blast_radius. Without confirm=True this only previews: blast_radius names the VM (name, instance UUID), the guest account, the exact command and the shell it runs through, VMware Tools status and any blockers; nothing runs. Show it to the user. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Refused outright: VM not powered on, VMware Tools not running, an unreadable identity or status, a name that matches more than one VM, or a rules.yaml deny on run_vm_guest_command or download_vm_guest_file (the preview lists it as a blocker).

輸入參數targetcommand必填confirmtimeoutvm_name必填passwordusername必填

upload_vm_guest_file

[WRITE] Upload a file from local machine to a VM via VMware Tools. Returns a dict with action, message and blast_radius (a status string before the confirmation gate). Requires VMware Tools running in the guest OS. An existing file at guest_path is replaced. Use download_vm_guest_file for the reverse direction, and provision_vm_guest instead when uploads and commands belong to one ordered provisioning run. Without confirm=True this only previews: blast_radius names the VM (name, instance UUID), the guest account, the local path and size, the guest path, VMware Tools status and any blockers; nothing is transferred. Show it to the user. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Refused outright: VM not powered on, VMware Tools not running, a local file that is missing or unreadable, an unreadable identity or status, or a name that matches more than one VM.

輸入參數targetconfirmvm_name必填passwordusername必填guest_path必填local_path必填

download_vm_guest_file

[WRITE] Download a file from a VM and write it to a local path. Reads from the guest, writes the local filesystem — the write is why this is not a read tool. Returns a status string. Requires VMware Tools running in the guest OS. Use upload_vm_guest_file for the reverse direction; to capture command output use run_vm_guest_command_with_output instead — it redirects and downloads for you. Refuses a destination that already exists unless overwrite=True, and never writes through a symlink or over a directory. Pick a path that does not exist yet rather than passing overwrite=True by default.

輸入參數targetvm_name必填passwordusername必填overwriteguest_path必填local_path必填

provision_vm_guest

[WRITE] Provision a VM by running an ordered sequence of guest operations. Prefer this over repeated run_vm_guest_command / upload_vm_guest_file calls when the steps form one provisioning run. Steps stop on the first failure, so a partial run leaves the guest half-configured. Requires VMware Tools running in the guest. Without confirm=True this only previews: blast_radius names the VM (name, instance UUID), the guest account and every step it would run, in order, with counts per type, local file sizes and any blockers; nothing runs. Show it to the user. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Refused outright: VM not powered on, VMware Tools not running, an empty step list, a step with an unknown type or a missing key, an upload whose local file is missing or unreadable, a service step on a Windows guest, an unreadable identity or status, a name that matches more than one VM, or a rules.yaml deny on a guest tool these steps run: exec and service steps run_vm_guest_command and run_vm_guest_command_with_output, upload steps upload_vm_guest_file (the preview lists it as a blocker). Step types: - exec: {"type": "exec", "command": "apt-get install -y nginx"} - upload: {"type": "upload", "local_path": "...", "guest_path": "..."} - service: {"type": "service", "name": "nginx", "action": "start"} Returns: dict with success, completed_steps, total_steps, results, error, and blast_radius.

輸入參數steps必填targetconfirmtimeoutvm_name必填password必填username必填

list_dvs_portgroups

[READ] List distributed virtual portgroups, optionally scoped to one dvSwitch. Per portgroup: name, parent dvSwitch, binding type (earlyBinding / ephemeral), VLAN setting (id, trunk ranges, or pvlan), configured port count, and whether it is the switch's uplink portgroup. Use to verify create_dvs_portgroup results or to survey network config before changes. Returns: The family list envelope {items, returned, limit, total, truncated, hint}; each item is one portgroup. `portgroups` is kept as a deprecated alias for `items`. Errors return a dict with "error" + hint.

輸入參數limitoffsettargetdvs_name

create_dvs_portgroup

[WRITE] Create a VLAN-tagged portgroup on a dvSwitch - preview/confirm gated. confirm=False (default) validates everything (switch exists, name free, binding and VLAN legal) and returns the exact spec that WOULD be created without writing anything. confirm=True creates the portgroup and waits for the task. Verify afterwards with list_dvs_portgroups. Audited. binding="ephemeral" creates a portgroup with no pre-created port pool, attachable from the ESXi host client even when vCenter is down - use for a self-hosted VCSA's own management portgroup. num_ports is ignored for ephemeral. lateBinding is deprecated by vSphere and not offered. Returns: Preview dict (action="preview", would_create) or result dict (action="created", created). Errors return a dict with "error" + hint.

輸入參數name必填targetbindingconfirmvlan_id必填dvs_name必填num_ports

list_host_vmks

[READ] List VMkernel adapters, optionally scoped to one ESXi host. Per vmk: device, IP/netmask/dhcp, MTU, MAC, portgroup (standard or DVS), netstack, and which host services it is selected for (management, vmotion, vsan, ...). The verify pair for add_host_vmk/remove_host_vmk. Gotcha - this list is not automatically a complete estate inventory. vCenter answers property reads for a host it has lost contact with out of its own cache, so hosts it never reached appear here as rows with `reachable: false`, `device: null` and a `note` naming the connectionState, rather than being dropped. Check `hosts_unreachable` (and the `unreachable_note` present only when it is non-zero) before reporting the result as the full picture, and do not read a null field on such a row as a measurement - it means nobody looked. Adapters shown for an unreachable host are vCenter's last cached view. Returns: The family list envelope {items, returned, limit, total, truncated, hint} plus `hosts_unreachable` (int) and, when that is non-zero, `unreachable_note` (str). Each item is one VMkernel adapter, or one unread host when `reachable` is false; `services` is null when a host's service map could not be read. `truncated` stays a paging fact - an incomplete estate is reported by `hosts_unreachable`, not by it. `vmks` is kept as a deprecated alias for `items`. Errors return "error" + hint.

輸入參數limitoffsettargethost_name

add_host_vmk

[WRITE] Add a static-IP VMkernel adapter on a DVS portgroup - preview/confirm gated. Deliberately minimal shape for throwaway test vmks on L2-only segments (e.g. a TEP VLAN): static IPv4, NO gateway, NO services enabled. The DVS port allocation is handled internally - pass the distributed portgroup name. confirm=False validates (host + portgroup exist, IP/netmask/MTU legal, IP not already on the host) and returns the exact spec without writing; confirm=True creates and returns the assigned device name. Verify with list_host_vmks; remove with remove_host_vmk. Audited. Returns: Preview dict (action="preview") or result dict (action="created", device=e.g. "vmk2"). Errors return a dict with "error" + hint.

輸入參數ip必填mtutargetconfirmnetmask必填host_name必填portgroup必填

remove_host_vmk

[WRITE] Remove a VMkernel adapter - confirm-gated, guarded, fail-closed. REFUSES (unless force_unprotected=True) when the vmk is selected for any host service (management/vmotion/vsan/...), lives on a non-default netstack (NSX TEPs on vxlan, dedicated vmotion/provisioning stacks - never visible in the service map), carries a default gateway route, or when any of that CANNOT be verified - unverifiable is treated as unsafe, never as clear. Test vmks created by add_host_vmk trip none of these and remove cleanly without force. ABSOLUTE, no override: the host's only management-enabled vmk is never removable - this call rides the interface it would delete. force_unprotected=True (together with confirm=True) overrides the non-absolute protections for deliberate teardown; the override and every bypassed protection are recorded in the result (and the audit trail). Returns: Preview dict (action="preview") or result dict (action="removed", plus forced/protections_bypassed when overridden). Errors return a dict with "error" + hint.

輸入參數vmk必填targetconfirmhost_name必填force_unprotected

set_vmk_service

[WRITE] Enable/disable a host service on an existing vmk - preview/confirm gated. Completes the add_host_vmk story: adapters are created serviceless by design, then tagged here (e.g. enable "vmotion" on a new vMotion vmk). Idempotent - re-applying the current state returns a no-write noop. Verify with list_host_vmks (the services field). Audited. Valid services are the vSphere nicType names: management, vmotion, vsan, vSphereProvisioning, faultToleranceLogging, vSphereReplication, vSphereReplicationNFC, vSphereBackupNFC, ptp, and the nvme/vsan variants. Note "vSphereProvisioning", not "provisioning". FAIL CLOSED: refuses both directions when the host's service map cannot be read. ABSOLUTE, no override: disabling management on the host's only management-enabled vmk - the call rides the interface it would untag. Returns: Preview dict (action="preview"), noop dict (action="noop") when the state already matches, or result dict (action="set", services_now). Errors return a dict with "error" + hint.

輸入參數vmk必填targetconfirmenabled必填service必填host_name必填

ping_from_vmk

[READ] DF-bit-capable ping sourced from a host vmk - MTU path validation. Runs `esxcli network diag ping` on the ESXi host through the vSphere API (no host SSH). df=True sets Don't-Fragment so an oversized packet FAILS instead of fragmenting - that failure is the diagnostic: - df=True size=1572 proves a >=1600 MTU path (overlay/TEP floor) - df=True size=8972 proves full jumbo (9000 minus 28 bytes overhead) A too-big result reports 'Message too long' in the fault field rather than erroring - read success + fault together. Returns: Dict with request, success, and summary (transmitted/received/loss/ rtt) or fault (the esxcli failure text). Errors return "error" + hint.

輸入參數dfsizecounttargetdest_ip必填netstackhost_name必填source_vmk必填

create_vm_plan

[WRITE] Create an execution plan for multi-step VM operations. Use for 2+ steps or 2+ VMs. Validates actions, checks the targets exist in vSphere, and generates a plan with rollback info per 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. Returns plan dict with plan_id, steps, summary (vms_affected, irreversible_steps, rollback_available). Show to user for confirmation before calling apply_vm_plan.

輸入參數targetoperations必填

apply_vm_plan

[WRITE] Execute a previously created plan step by step. Without confirm=True this only previews: it returns blast_radius listing every step (index, action, target object), the count and indices of the destructive ones (delete, power off, revert, guest commands...), and blockers — and runs nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Each step is shown with its full parameters (passwords redacted). Each destructive step is measured as its own tool would measure it (delete_vm, power_off_vm, revert_vm_snapshot, run_vm_guest_command, delete_cluster ...), and that tool's blockers refuse the plan. A step on something an earlier step creates or changes is marked check "deferred": it is measured immediately before it runs, and the plan stops there if it fails. Refused: a step that ~/.vmware/rules.yaml denies for the tool that does the same thing (a plan step delete_vm is authorized as delete_vm, power_off as power_off_vm, and so on, also just before it runs), a target other than the one the plan was created against (no target is a target of its own), a step its tool would refuse, anything it could not read, a delete_vm step without its acknowledge_blast_radius (from a delete_vm preview), and any iscsi_* or storage_rescan step — those are gated in vmware-storage; run enable_iscsi, add_iscsi_target, remove_iscsi_target or rescan_storage there. With confirm=True steps run sequentially. On failure: stops immediately, keeps the plan file with per-step results, and returns rollback_available. On success: deletes the plan file. If a step fails and rollback_available is true, ask the user whether to rollback, then call rollback_vm_plan.

輸入參數targetconfirmplan_id必填

rollback_vm_plan

[WRITE] Rollback executed steps of a failed plan in reverse order. Without confirm=True this only previews: it returns blast_radius listing the rollback steps that would run (in order, with the VMs a rollback deletes) and those skipped as irreversible — and runs nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Only call this after apply_vm_plan returns status='failed'; check list_vm_plans first for the plan_id. Irreversible steps (delete_vm, revert_snapshot, etc.) are skipped with a warning. Each destructive rollback step (power off, delete snapshot, cluster delete, host removal) is measured as its own tool measures it, in the preview and again just before it runs; a refused check stops the rollback there and the plan stays 'failed'. Refused on a target other than the one the plan was created against, and for any rollback step ~/.vmware/rules.yaml denies for its own tool (deleting a VM the plan created is authorized as delete_vm).

輸入參數targetconfirmplan_id必填

list_vm_plans

[READ] List all pending/failed plans. Use this first to find a plan_id for apply_vm_plan or rollback_vm_plan. Returns the list envelope: 'items' holds plan summaries (plan_id, created_at, status, steps count, VMs affected), and 'returned'/'total'/ 'truncated' state whether the listing is complete. Every plan file is read, so truncated is always false. Listing never deletes: stale plans (>24h) are swept by create_vm_plan, not by this tool.

無需輸入參數。

get_cluster_health_summary

[READ] One-glance health rollup for every cluster — "is anything on fire?". Aggregates hosts, VM power state, live CPU/memory pressure, triggered alarms and datastores thin-provisioned past 100% of capacity per cluster, assigns each a status ("ok"/"warn"/"critical"), and flattens the anomalies into a ranked ``top_issues`` focus list — the fast triage view for "what's wrong right now?". Read-only (delegates to the vmware-monitor library). Use it FIRST for a cross-cluster glance, then drill in with investigate_vm or investigate_host. Returns {totals, top_issues, issues_total, clusters, snapshot, customization_hint}. Lead with ``top_issues`` (worst first, each with a drill-down hint), ``clusters`` as context, ``customization_hint`` last. Point-in-time — no trending.

輸入參數top_ntargetinclude_vmscluster_filter

investigate_vm

[READ] "What is happening around this VM?" — one correlated drill-down. Correlates everything around one VM so you don't stitch it together yourself: the VM's state, its host, cluster context, backing datastores, snapshots, triggered alarms, live performance, and a merged **event timeline** across VM, host, cluster and datastores (newest first). Batched, cheap even on large fleets. Delegates to the vmware-monitor library (read-only). Explain the result in operational language; do not dump it raw. Use this AFTER get_cluster_health_summary points at a problem VM. Point-in-time.

輸入參數hourstargetvm_name必填

investigate_host

[READ] "What is happening around this ESXi host?" — one correlated drill-down. Correlates a host's state (connection, CPU/memory, ESXi version, uptime), its cluster context, a rollup of the VMs it runs, the datastores it mounts, alarms across host/cluster/datastore, live performance, and a merged **event timeline**. Delegates to the vmware-monitor library (read-only); do not dump the result raw. Use this AFTER get_cluster_health_summary flags a host. Point-in-time.

輸入參數hourstargethost_name必填

investigate_datastore

[READ] "What is happening around this datastore?" — one correlated drill-down. Correlates a datastore's capacity/free space/accessibility, the hosts that mount it, a rollup of the VMs it backs, alarms across datastore/host, and a merged **event timeline**. Delegates to the vmware-monitor library (read-only); do not dump the result raw. (Per-datastore latency is a separate perf report.) Use this AFTER get_cluster_health_summary flags storage pressure. Point-in-time.

輸入參數hourstargetdatastore_name必填

get_cross_vcenter_attention

[READ] "What needs attention now?" across EVERY configured vCenter — one list. Runs get_cluster_health_summary against every configured target and returns one globally ranked ``top_issues`` list (worst first, each tagged with its ``vcenter``) plus a per-target rollup — "where do I look first, anywhere in the estate?". Degrades gracefully: an unreachable target is listed under ``unreachable`` and the rest still aggregate, but it is never counted as healthy: ``totals.worst_status`` is at least ``warn`` (``critical`` when no target answered) and ``totals.status_reason`` says why. Delegates to the vmware-monitor library (read-only). Lead with ``top_issues``, then drill in with investigate_vm. Point-in-time.

輸入參數top_ncluster_filter

set_vm_ttl

[WRITE] Set a Time-To-Live (TTL) for a VM. The daemon auto-deletes it when expired. Without confirm=True this only previews: it returns blast_radius — the VM that will be deleted (identity, host, disks, total size, snapshot count), when (expires_at), and any TTL it replaces — and schedules nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Refused when the VM's identity or disks cannot be read. Use this for short-lived lab VMs so cleanup is not forgotten; cancel with cancel_vm_ttl and review pending expiries with list_vm_ttls. The scheduler daemon must be running (`vmware-aiops daemon start`) or nothing is ever deleted; it powers a running VM off first. TTLs persist in ~/.vmware-aiops/ttl.json. Returns a dict (action, blast_radius).

輸入參數targetconfirmminutes必填vm_name必填

cancel_vm_ttl

[WRITE] Cancel an existing TTL for a VM (prevents auto-deletion). Returns a status string. Use list_vm_ttls first for the exact vm_name. This only removes the schedule and never touches the VM itself.

輸入參數vm_name必填

list_vm_ttls

[READ] List all VMs with TTLs registered, including expiry time and status. Use this first to find the exact vm_name for cancel_vm_ttl. Returns the list envelope: 'items' holds TTL entries with remaining_minutes and expired flag, and 'returned'/'total'/'truncated' state whether the listing is complete. The whole TTL store is read, so truncated is always false.

無需輸入參數。

restore_vm_clean_slate

[WRITE] Revert a VM to its baseline snapshot (Clean Slate). Without confirm=True this only previews: it returns blast_radius (VM identity, power state and whether it is powered off first, the snapshot and when it was taken, snapshot count, blockers) and changes nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. With confirm=True: 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. Irreversible — everything written since the snapshot is lost. Refused: no snapshot of that name, more than one, a VM whose state cannot be read, or a rules.yaml deny on power_off_vm or revert_vm_snapshot (the preview lists it as a blocker). Returns a dict (action, blast_radius).

輸入參數targetconfirmvm_name必填snapshot_name

power_on_vm

[WRITE] Power on a virtual machine. Returns a status string; an already-on VM is a no-op. Reverse with power_off_vm. Call this first when a VM is off: guest tools such as run_vm_guest_command only work once VMware Tools has finished booting.

輸入參數targetvm_name必填

power_off_vm

[WRITE] Power off a VM — graceful guest shutdown by default, hard power-off with force=True. Without confirm=True this only previews: it returns blast_radius (VM name and instance UUID, host, power state, VMware Tools status, and whether this is a guest shutdown or a hard power-off) and changes nothing. Show it to the user and get their decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Graceful mode calls VMware Tools guest shutdown and waits up to 120s; if it does not finish, action is "still_running". Refused: a graceful shutdown when Tools is not running or the VM is suspended (preview force=True instead), and a VM whose identity or power state cannot be read. An already-off VM returns action "noop". Use power_on_vm to start a VM; delete_vm requires it off first. Returns: Dict with action (preview, noop, powered_off, still_running), blast_radius, and the executor's message under result.

輸入參數forcetargetconfirmvm_name必填

create_vm

[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 or clone_vm for a ready-to-run guest. Fails before creating anything if the datastore is not found. Returns a status string with the new VM name.

輸入參數cputargetdisk_gbvm_name必填memory_mbfolder_pathnetwork_namedatastore_name

reconfigure_vm

[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 (power_off_vm). Returns: Status string describing the applied change, or a VM-not-found error.

輸入參數cputargetvm_name必填memory_mb

clone_vm

[WRITE] Clone a VM. Without to_host/to_datastore the clone lands on the source's host+datastore. Returns a status string naming the clone. Full independent copy — slow and full disk cost; prefer deploy_linked_clone for near-instant test copies and batch_clone_vms for many at once. Cloning a running VM may capture a crash-consistent disk.

輸入參數targetto_hostvm_name必填new_name必填power_onto_datastore

migrate_vm

[WRITE] Migrate (vMotion) a VM to another host, optionally with storage vMotion. Without confirm=True this only previews: it returns blast_radius (VM and instance UUID, source host and datastores, target host with its connection and maintenance state, target datastore, and live vMotion vs cold migration) and moves nothing. Show it to the user and get their decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Refused: a target host that is not found, not connected, in maintenance mode or has no resource pool; a target datastore that is not found; a target host that does not mount the VM's datastores when to_datastore is omitted (vCenter rejects cross-host vMotion without shared storage — pass to_datastore); and anything above that cannot be read. The VM's current host with no to_datastore returns action "noop". Run get_cluster_info first for host names. Returns: Dict with action (preview, noop, migrated), blast_radius, and result.

輸入參數targetconfirmto_host必填vm_name必填to_datastore

delete_vm

[WRITE] Delete a VM and its disks and snapshots (irreversible). Without confirm=True this only previews: it returns blast_radius (identity, host, disks, total size, snapshot count, blockers) and destroys nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user said "delete" earlier: they have not seen what it destroys yet. To delete, call again with confirm=True and acknowledge_blast_radius set to the preview's acknowledge_with object, unchanged. The VM is re-measured first; if it changed (another snapshot, a different VM under the same name), nothing is deleted and you must preview again. Refused outright: a powered-on or suspended VM (power it off with power_off_vm first), a VM whose disks or identity cannot be read, and a name that matches more than one VM. Use set_vm_ttl instead when the VM should only expire later.

輸入參數targetconfirmvm_name必填acknowledge_blast_radius

create_vm_snapshot

[WRITE] Create a snapshot of a VM. Returns a status string. Use this before a risky change so revert_vm_snapshot can undo it, then reclaim the space with delete_vm_snapshot — snapshots left for days grow delta disks and must not be treated as backups.

輸入參數memorytargetquiescevm_name必填descriptionsnapshot_name必填

revert_vm_snapshot

[WRITE] Revert a VM to a named snapshot (loses changes since snapshot). Without confirm=True this only previews: it returns blast_radius (VM and instance UUID, the snapshot's name, id and creation time, total snapshot count, current power state and the power state after the revert) and changes nothing. Show it to the user and get their decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Irreversible — everything written since the snapshot is lost. Refused: a snapshot name that is not found, a name that matches more than one snapshot on the VM (vSphere allows duplicates; rename one first), and a VM whose snapshot tree, identity or power state cannot be read. Run list_vm_snapshots first for exact names. To reclaim space without changing state use delete_vm_snapshot. Returns: Dict with action (preview, reverted), blast_radius, and result.

輸入參數targetconfirmvm_name必填snapshot_name必填

delete_vm_snapshot

[WRITE] Permanently delete a named snapshot, consolidating its delta disk into the parent. Without confirm=True this only previews: it returns blast_radius (VM and instance UUID, the snapshot's name, id and creation time, remove_children, how many child snapshots sit below it and how many snapshots would be removed) and deletes nothing. Show it to the user and get their decision. Do not set confirm=True on your own because the user asked earlier: they have not seen the preview yet. Frees disk space and does NOT change the VM's current state (unlike revert_vm_snapshot). Works while the VM is powered on. Refused: a snapshot name that is not found, a name that matches more than one snapshot on the VM (vSphere allows duplicates; rename one first), and a snapshot tree that cannot be read. Run list_vm_snapshots first for exact names. Consolidation is slow for old/large deltas (often minutes). By default (wait=False) this returns a task id immediately so it does not block your context — poll it with get_vm_task_status. Set wait=True only for small snapshots (blocks up to 30 min). Returns: Dict with action (preview, snapshot_delete_started, snapshot_deleted), blast_radius, and result (carries the task id to poll via get_vm_task_status).

輸入參數waittargetconfirmvm_name必填snapshot_name必填remove_children

get_vm_task_status

[READ] Poll a long-running vSphere task by its id (from an async delete_vm_snapshot). Use after delete_vm_snapshot returns a task id, instead of re-running the delete. Returns state (queued/running/success/error/gone), progress percent, and the entity name. 'gone' means vCenter does not know the id: the task finished and was garbage-collected, or the id is wrong. It says nothing about success — re-list the resource to confirm the final state. A failed task reports its fault under 'task_error'; a top-level 'error' key would mean this poll itself failed. Returns: Dict with task_id, state, progress_pct, operation, entity, and task_error/note when relevant.

輸入參數targettask_id必填

list_vm_snapshots

[READ] List the full snapshot tree of a VM, including nested child snapshots. Read-only, no side effects. Call this before revert_vm_snapshot, delete_vm_snapshot, or deploy_linked_clone to get exact snapshot names. 'items' is empty when the VM has no snapshots. Returns: The list envelope. 'items' is one dict per snapshot: name, description, created, state (power state at snapshot time), level (0 = root). The whole tree is walked, so 'total' is the real count and 'truncated' is always false.

輸入參數targetvm_name必填

版本歷史

14
  1. v2.4.4最新Nov 8, 2026
  2. v2.4.3Nov 8, 2026
  3. v2.4.2Oct 19, 2026
  4. v2.4.1Oct 17, 2026
  5. v2.4.0Oct 16, 2026
  6. v2.3.1Oct 16, 2026
  7. v2.3.0Oct 15, 2026
  8. v2.1.0Oct 15, 2026
  9. v2.0.0Oct 14, 2026
  10. v1.12.1Oct 13, 2026
  11. v1.12.0Sep 20, 2026
  12. v1.11.0Sep 19, 2026
  13. v1.10.0Sep 19, 2026
  14. v1.9.7Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分