vcenter-mcp
MCP server for VMware vCenter / ESXi VM lifecycle. Built on pyVmomi
vcenter-mcp
A Model Context Protocol server that exposes VMware vCenter / ESXi VM lifecycle tools to Claude Code and other MCP clients. Built on pyVmomi.
What it does
- List VMs on a vCenter datacenter (grouped by host) or on a standalone ESXi host
- Create a VM (network-boot first; thin or thick provisioning; nested-virt option for ESXi targets)
- Power VMs on and off
- Delete VMs (powers off first if running, then destroys from disk)
Lookups accept either a display name or a moref ID (e.g. vm-42) — the moref path skips the inventory scan and is faster on large environments.
Prerequisites
- Python 3.10 or newer
- A vCenter Server or standalone ESXi host you can reach over the network
- A vSphere account with the privileges needed for whatever you plan to do (read-only is enough for
list_vms; create / delete need the corresponding VM and resource-pool privileges)
Install
Install into a project-local virtualenv. Using a venv keeps vcenter-mcp and its dependencies (notably pyVmomi) isolated from your system Python.
From a clone of this repository:
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -e .
For development (also installs pytest):
.venv/bin/pip install -e ".[dev]"
Throughout this README, commands use
.venv/bin/.... You can insteadsource .venv/bin/activateonce per shell and drop the prefix — same result.
Configure a target
Run the interactive setup using the venv's Python:
.venv/bin/python -m vcenter_mcp setup
You'll be prompted for:
- A target name (e.g.
lab-vcenter) — used to refer to this target later - Host or IP of the vCenter / ESXi
- Username and password
- Target type:
vcenteroresxi - (vCenter only) Datacenter and cluster names
- Datastore name
- One or more network profiles, each a name plus one or more portgroup names
The setup writes a config to ~/.config/vcenter-mcp/config.json (mode 0600). Re-run it any time to add another target or update an existing one.
Config file shape
{
"default_target": "lab-vcenter",
"targets": {
"lab-vcenter": {
"host": "vcenter.lab.example.com",
"user": "[email protected]",
"password": "...",
"type": "vcenter",
"datacenter": "Lab DC",
"cluster": "Lab Cluster",
"datastore": "datastore1",
"networks": {
"standard": ["VM Network"],
"secure-boot": ["pg-secure-1", "pg-secure-2"]
},
"default_network": "standard"
}
},
"templates": {
"esxi": { "cpu": 4, "ram_mb": 16384, "disk_gb": 100, "disk_provisioning": "thin", "guest_id": "vmkernel7Guest", "vhv": true },
"ubuntu": { "cpu": 2, "ram_mb": 4096, "disk_gb": 40, "disk_provisioning": "thin", "guest_id": "ubuntu64Guest", "vhv": false },
"rhel": { "cpu": 2, "ram_mb": 4096, "disk_gb": 40, "disk_provisioning": "thin", "guest_id": "rhel9_64Guest", "vhv": false }
}
}
A network profile is a list of portgroups; the first entry becomes the boot NIC. To add your own VM types, add entries to templates — vm_type strings passed to create_vm are matched against this dict.
Register with Claude Code
Register the MCP server using the venv's Python by absolute path. Claude Code launches the server in a fresh shell that does not inherit your activated venv, so the absolute path is required — pointing at a bare python here will fail to import vcenter_mcp.
VCENTER_MCP_DIR="$(pwd)" # run this from the repo root, after install
claude mcp add --scope user vcenter -- "$VCENTER_MCP_DIR/.venv/bin/python" -m vcenter_mcp
Or just inline the absolute path you want:
claude mcp add --scope user vcenter -- /absolute/path/to/vcenter-mcp/.venv/bin/python -m vcenter_mcp
Read tools (list_vms) are safe to allow without prompting. Add it to permissions.allow in ~/.claude/settings.json:
{
"permissions": {
"allow": [
"mcp__vcenter__list_vms"
]
}
}
The destructive tools (create_vm, power_on_vm, power_off_vm, delete_vm) are intentionally not in the default allow-list — Claude will prompt you per call.
Tools
| Tool | What it does |
|---|---|
list_vms | List VMs on a target. vCenter targets group by host within a datacenter; ESXi targets list everything on the host. |
create_vm | Create a VM that network-boots first. Pick a vm_type (template), optional CPU/RAM/disk overrides, optional network_profile. |
power_on_vm | Power on a VM by display name or moref ID. |
power_off_vm | Hard power off a VM by display name or moref ID. |
delete_vm | Permanently delete a VM (powers off first if running, then destroys from disk). |
Notes on TLS
vcenter-mcp connects with an unverified SSL context, which is the same default that govc and most pyVmomi sample code use because lab vCenters very commonly have self-signed certs. If your target uses a properly-signed certificate and you'd prefer real verification, swap _ssl_context() in src/vcenter_mcp/client.py.
Development
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
.venv/bin/pytest
Tests run on Python 3.10, 3.11, and 3.12 in CI (see .github/workflows/test.yml).
License
संबंधित सर्वर
Remote MCP Server (Authless)
A remote MCP server deployable on Cloudflare Workers without authentication.
ElevenLabs
Text-to-speech integration using the ElevenLabs API.
MCP Hive
MCP-Hive is a gateway to commerical-grade MCP Servers which can be only be accessed via paid subscriptions or pay-as-you-go access. AI applications pay for access to trusted and well-known industry data providers.
Azure Pricing MCP Server
Query Azure retail pricing information using the Azure Retail Prices API.
raigo cloud
One policy for all of your agents.
Flespi MCP Server
Interact with the Flespi telematics platform API for fleet management, device tracking, and telemetry data processing.
S2T Accelerators
36 enterprise MCP tools for AWS security, infrastructure generation, AI workflows, and AI agent governance.
Appwrite
Interact with the Appwrite API to manage databases, users, storage, and more. Requires configuration via environment variables.
Alpha Vantage MCP Server
Provides real-time financial market data using the Alpha Vantage API.
Elastic Email MCP
The Elastic Email MCP Server enables AI agents like GitHub Copilot, ChatGPT, Claude, and other compatible assistants to seamlessly integrate with your Elastic Email account.