VMware-MCP
Provides tools for interacting with VMware vSphere (vCenter/ESXi), enabling management of VMs (power, snapshots, clone, reconfigure, migrate), inventory browsing, monitoring, events, alarms, and performance counters.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@VMware-MCPList all VMs in the datacenter with their power state and host"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
VMware MCP
A Model Context Protocol server for VMware vSphere. It gives an AI assistant read access to your vCenter Server or standalone ESXi host — inventory, performance counters, events and alarms — and, when you explicitly allow it, the ability to power VMs on and off, take snapshots, clone, reconfigure and migrate them.
It talks to vSphere with pyVmomi, the official VMware Python SDK, over the same vSphere Web Services API the vSphere Client uses. No agent, no appliance, and nothing to install on your hosts.
Read-only by default. Out of the box the server refuses every operation that would change your environment. Enabling writes is a deliberate, separate step.
Contents
Related MCP server: vsphere-mcp
Quick start
Requires Python 3.10 or newer and network access to port 443 on vCenter or ESXi.
git clone https://github.com/ISH2YU/VMware-MCP.git
cd VMware-MCP
pip install -e .Set the connection details and check that they work before wiring anything up to an AI client:
export VMWARE_HOST=vcenter.example.com
export VMWARE_USERNAME='svc-mcp@vsphere.local'
export VMWARE_PASSWORD='...'
vmware-mcp --check--check logs in, prints the vCenter version, the account it authenticated as and the number of
inventory objects it can see, then exits:
{
"endpoint": "vcenter.example.com:443",
"permission_mode": "read-only",
"verify_ssl": true,
"authenticated_as": "svc-mcp@vsphere.local",
"server": {
"name": "VMware vCenter Server 8.0.3 build-24022515",
"product": "VMware vCenter Server",
"version": "8.0.3",
"build": "24022515",
"api_version": "8.0.3.0",
"api_type": "VirtualCenter",
"os_type": "linux-x64",
"vendor": "VMware, Inc.",
"instance_uuid": "aaaa-bbbb-cccc",
"license_product": "VMware VirtualCenter Server"
},
"inventory_objects_indexed": 214
}If the TLS handshake fails, either point VMWARE_CA_BUNDLE at your vCenter's CA certificate or, for
a lab, set VMWARE_VERIFY_SSL=false.
Then run the server. It speaks stdio by default, which is what desktop MCP clients expect:
vmware-mcpConfiguring an MCP client
Cursor
Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"vmware": {
"command": "vmware-mcp",
"env": {
"VMWARE_HOST": "vcenter.example.com",
"VMWARE_USERNAME": "svc-mcp@vsphere.local",
"VMWARE_PASSWORD": "...",
"VMWARE_PERMISSION_MODE": "read-only"
}
}
}
}Claude Desktop
Add to claude_desktop_config.json (macOS:
~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"vmware": {
"command": "vmware-mcp",
"env": {
"VMWARE_HOST": "vcenter.example.com",
"VMWARE_USERNAME": "svc-mcp@vsphere.local",
"VMWARE_PASSWORD": "..."
}
}
}
}Over HTTP
To run the server once and share it, use the streamable HTTP transport:
vmware-mcp --transport streamable-http --host 127.0.0.1 --port 8000The endpoint has no authentication of its own, so bind it to localhost or put it behind a proxy that does.
Permission modes
VMWARE_PERMISSION_MODE decides how much damage the server can do. Modes are cumulative.
Mode | What it allows |
| Inventory, monitoring, events, alarms and performance counters. Every mutating tool refuses with an explanation. |
| Adds power operations, snapshot creation, clone, reconfigure and migrate. |
| Adds deleting VMs and reverting or deleting snapshots. |
The mode is enforced server-side, before any call reaches vCenter, and it is stated in the server
instructions so the model knows what it can attempt. Deleting a VM additionally requires an explicit
confirm=true argument and refuses while the VM is powered on.
Belt and braces: give the service account only the vCenter privileges it needs. The permission mode protects against a confused model, not against a compromised one — vCenter roles are the real boundary.
Tools
All 27 tools are prefixed vsphere_.
Inventory
Tool | Purpose |
| Product, version, API type, authenticated user and the active permission mode. |
| Every datacenter. |
| Clusters with capacity, DRS and HA configuration. |
| ESXi hosts with hardware, version and live CPU/memory utilisation. |
| One host in full, including its VMs, datastores and networks. |
| Reservations, limits and current usage. |
| Search by name across object types when you don't know what a name refers to. |
Virtual machines
Tool | Purpose |
| VMs filtered by name, power state, datacenter, cluster, host, guest OS or IP. |
| One VM in full: hardware, disks, NICs, guest networking and filesystems, snapshots. |
| VM counts and vCPU/memory overcommitment per host. |
Storage and networking
Tool | Purpose |
| Capacity, free space, provisioned space and over-provisioning. |
| Standard port groups, distributed port groups (with VLAN and switch) and opaque networks. |
Monitoring
Tool | Purpose |
| Recent tasks, optionally scoped to an object. |
| Poll a single task by id. |
| What vCenter is doing right now. |
| The audit trail: logins, changes, HA actions, hardware problems. |
| Every currently triggered alarm, red first. |
| CPU, memory, disk and network counters for a VM or host, summarised. |
Power, snapshots and lifecycle
Tool | Mode | Purpose |
|
| Power on/off, suspend, reset, or ask the guest to shut down or reboot. |
| read | Snapshot tree plus a flat list with paths. |
|
| Take a snapshot, optionally with memory or quiesced. |
|
| Revert, discarding later changes. |
|
| Delete one snapshot, a subtree, or all of them. |
|
| Clone a VM or deploy from a template. |
|
| Change vCPU count, cores per socket, memory or notes. |
|
| vMotion, storage vMotion, or both. |
|
| Delete a VM and its disks. Needs |
Long operations (clone, migrate, snapshot) accept wait=false and return a task_id you can poll
with vsphere_get_task. When waiting, progress is streamed to the client as MCP progress
notifications.
Resources and prompts
Two resources:
vsphere://inventory/summary— counts and totals for the whole environment, useful as ambient context.vsphere://vm/{identifier}— full detail for one VM, by name, moid, UUID or path.
Two prompts:
troubleshoot_vm(vm)— a diagnostic walkthrough for a slow, stuck or unreachable VM: performance counters for the VM and its host, recent events and tasks, alarms, snapshot age and datastore pressure.capacity_report(scope)— cluster and host utilisation, overcommitment ratios, datastores nearing full, and a prioritised list of recommendations.
Configuration reference
Every setting is an environment variable; the flags shown override them.
Variable | Default | Description |
| required | vCenter Server or ESXi hostname or IP. Also |
| required | vSphere account. Also |
| required | Password. Also |
|
| API port. |
|
| Verify the TLS certificate. |
|
| Shorthand for disabling verification. |
| — | CA certificate bundle to trust instead of the system store. |
|
|
|
|
| HTTP connection timeout in seconds. |
|
| How long to wait for a vSphere task before handing back its id. |
|
| Hard cap on items returned by any listing. |
|
| Page size when a tool call omits |
|
| Seconds to cache the inventory tree used for path resolution. |
|
| Maximum simultaneous calls to vCenter. |
|
| Log level. Logs go to stderr. |
|
|
|
Command line flags: --vsphere-host, --vsphere-port, --username, --insecure, --ca-bundle,
--permission-mode, --transport, --host, --port, --log-level, --check. Run
vmware-mcp --help for details. There is deliberately no --password flag; passwords on a command
line end up in the process list and shell history.
Referring to objects
Every tool that takes a VM, host, datastore, network or cluster accepts any of:
the object name —
web-01, matched case-insensitivelya glob, where a name filter is accepted —
web-*,db-0?the managed object id —
vm-1024,host-42a UUID, for VMs and hosts — BIOS or instance UUID
the inventory path —
/Prod/vm/Tier1/web-01, or any suffix of it
When several objects match, the tool lists the candidates with their managed object ids rather than
picking one. Listings are paginated and report truncated, so a model can tell the difference
between "that's all of them" and "there are more".
Security notes
Create a dedicated service account in vSphere rather than reusing an administrator. Grant it a read-only role for the default mode; add only the specific privileges you need if you enable writes.
The password is never returned by any tool.
vsphere_aboutreports the connection settings with the password omitted.Certificate verification is on by default. Disabling it is logged as a warning at startup.
Anything an MCP client can call, a model can call. Permission modes and the
confirmflag on deletion exist because prompt injection through, for example, a VM annotation is a real risk. Keep the server inread-onlyunless a task genuinely needs more.Secrets in client config files are stored in plain text by most MCP clients. Prefer a secret manager or environment variables where your client supports them.
Development
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest # 200+ tests, no vCenter required
ruff check src tests # lint
ruff format src tests # format
mypy # type checkThe test suite runs against an in-memory vCenter double (tests/fake_vsphere.py) that implements
the two seams the server actually depends on: pyVmomi's SOAP stub and the PropertyCollector.
Everything above those seams — the real client, the real property specs, the real mappers and the
real tools — runs unmodified, so tests exercise the same code paths that talk to a live vCenter.
How it is put together
src/vmware_mcp/
├── config.py Environment parsing and permission modes
├── errors.py Error types, all with client-safe messages
├── server.py MCPServer assembly, resources and prompts
├── cli.py Argument parsing, --check, transports
├── vsphere/
│ ├── session.py Connection, TLS, reconnect on session expiry
│ ├── client.py Async facade; runs pyVmomi on a bounded thread pool
│ ├── query.py PropertyCollector batching and inventory paths
│ ├── mappers.py Pure vSphere-to-JSON translation
│ ├── lookup.py Name/moid/UUID/path resolution
│ ├── tasks.py Task polling with progress reporting
│ ├── perf.py Performance counter queries
│ └── monitoring.py Events, tasks and alarms
└── tools/ One module per area of vSphereTwo decisions worth knowing about:
Everything reads through the PropertyCollector. Touching managed object attributes one at a time
costs a round trip each, which is unusable against a vCenter with thousands of VMs. A listing here
is a single RetrievePropertiesEx call regardless of how many objects come back.
pyVmomi is synchronous, MCP is not. Blocking calls run on a thread pool bounded by
VMWARE_MAX_CONCURRENCY, and vSphere tasks are polled from the event loop rather than blocking a
thread, so progress can be streamed and a cancelled request does not strand a worker.
License
MIT. See LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityFmaintenanceA VMware ESXi/vCenter management server based on MCP (Machine Control Protocol), providing simple REST API interfaces for virtual machine management.63MIT
- Alicense-qualityDmaintenanceMCP server for VMware vSphere/vCenter operations, enabling natural language control of VMs, hosts, and infrastructure.Apache 2.0
- Flicense-qualityCmaintenanceA comprehensive MCP server for VMware vSphere management, enabling AI agents to perform VM operations, monitoring, snapshots, and reporting through a secure, Dockerized environment.19
- AlicenseAqualityCmaintenanceMCP server for VMware vSphere infrastructure management, enabling VM operations, monitoring, and network discovery.171MIT
Related MCP Connectors
MCP server for Vonage API documentation, code snippets, tutorials, and troubleshooting.
MCP server for managing Prisma Postgres.
MCP server for Appcircle mobile CI/CD platform.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ISH2YU/VMware-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server