Skip to main content
Glama
michaelrice
by michaelrice

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.

Related MCP server: VMWare MCP

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 instead source .venv/bin/activate once 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:

  1. A target name (e.g. lab-vcenter) — used to refer to this target later

  2. Host or IP of the vCenter / ESXi

  3. Username and password

  4. Target type: vcenter or esxi

  5. (vCenter only) Datacenter and cluster names

  6. Datastore name

  7. 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": "admin@vsphere.local",
      "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 templatesvm_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

list_vms

List VMs on a target using a single PropertyCollector RPC (no per-VM round trips).

Parameter

Type

Description

target

string (optional)

Target name from config. Defaults to default_target.

datacenter

string (optional)

vCenter only — datacenter to list. Defaults to the target's configured datacenter.

Each VM in the returned list includes:

Field

Description

name

Display name

moref

Managed object reference ID (e.g. vm-42)

uuid

BIOS UUID

power_state

poweredOn, poweredOff, or suspended

guest_id

Guest OS identifier (e.g. ubuntu64Guest)

guest_full_name

Full guest OS name

cpu_count

Number of vCPUs

memory_mb

Memory in MB

storage_used_bytes

Committed storage in bytes

primary_ip

Primary guest IP (requires VMware Tools)

nics

List of NICs — each with mac, network, and guest_ips (requires VMware Tools)

disks

List of virtual disks — each with capacity_bytes and file (datastore-relative path)

On error, returns a single dict with an error key.


create_vm

Create a VM that network-boots first.

Parameter

Type

Description

name

string

Display name for the new VM

vm_type

string

Template name from config (e.g. esxi, ubuntu, rhel)

target

string (optional)

Target name from config. Defaults to default_target.

network_profile

string (optional)

Named network profile from target config (e.g. standard, secure-boot). Defaults to default_network.

cpu

int (optional)

Override template CPU count

ram_mb

int (optional)

Override template memory in MB

disk_gb

int (optional)

Override template disk size in GB

disk_provisioning

string (optional)

thin (default) or thick


power_on_vm

Power on a VM by display name or moref ID (e.g. vm-42).

Parameter

Type

Description

name_or_id

string

Display name or moref ID

target

string (optional)

Target name from config. Defaults to default_target.


power_off_vm

Hard power off a VM by display name or moref ID (e.g. vm-42).

Parameter

Type

Description

name_or_id

string

Display name or moref ID

target

string (optional)

Target name from config. Defaults to default_target.


delete_vm

Permanently delete a VM (powers off first if running, then destroys from disk).

Parameter

Type

Description

name_or_id

string

Display name or moref ID

target

string (optional)

Target name from config. Defaults to default_target.

Connection management

vcenter-mcp maintains a shared ServiceInstance per user@host combination for the lifetime of the MCP server process rather than opening and closing a new connection on every tool call.

Session lifecycle:

  • Created on the first tool call for a given target

  • Reused on all subsequent calls with the same credentials

  • Reconnected automatically if a liveness ping (currentSession) detects the session has expired

  • Disconnected explicitly when a session is replaced (ping failure) or invalidated (NotAuthenticated / SecurityError fault)

Session sharing rules:

Scenario

Result

Same user, same vCenter

Single shared session

Different user, same vCenter

Separate session per user

Same user, different vCenter

Separate session per host

Concurrent tool calls are safe — a threading.Lock guards all cache reads and writes.

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

Apache-2.0

Available Tools

5 tools
create_vmA

Create a VM that network boots first. vm_type: esxi, ubuntu, rhel (or any type defined in config templates). disk_provisioning: thin (default) or thick. network_profile: named profile from target config (e.g. standard, secure-boot).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
vm_typeYes
targetNo
network_profileNo
cpuNo
ram_mbNo
disk_gbNo
disk_provisioningNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden but only mentions 'network boots first' as a behavioral trait. It does not disclose whether the operation is idempotent, requires authentication, or what happens on conflict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise, using four short lines with no unnecessary words. Each sentence adds value and is front-loaded with the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters and no output schema details, the description is incomplete: it omits required fields, resource constraints, and 5 parameters entirely. An output schema exists but does not compensate for missing parameter explanations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description only explains three parameters (vm_type, disk_provisioning, network_profile) out of eight. Critical parameters like name, cpu, ram_mb, and disk_gb are left undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Create' and the resource 'VM', and adds specificity with 'network boots first'. Sibling tools are management operations, so there is no confusion with alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives examples for vm_type and disk_provisioning defaults, but does not provide explicit guidance on when to use this tool versus alternatives, nor does it mention prerequisites or constraints.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_vmA

Permanently delete a VM (power off if running, then destroy from disk). Accepts display name or moref ID (e.g. 'vm-42').

ParametersJSON Schema
NameRequiredDescriptionDefault
name_or_idYes
targetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description shoulders full transparency. It discloses the irreversible destructive action, the pre-step (power off), and the input format. Missing details like permission requirements or error behavior, but core behavioral traits are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no extraneous information. Action and input format are front-loaded, making it efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the action and key parameter but lacks explanation for the optional 'target' parameter and does not mention output schema or return behavior, leaving gaps for a complete understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain all parameters. It clarifies that name_or_id accepts a display name or moref ID, but completely omits the 'target' parameter, leaving users without guidance on its purpose or usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Permanently delete a VM' and details the process ('power off if running, then destroy from disk'), clearly differentiating it from sibling tools like list_vms or power_on_vm.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to identify the VM (name or moref ID) but does not provide explicit guidance on when to use this tool versus alternatives, such as powering off or creating a snapshot.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_vmsA

List VMs on a target.

  • Standalone ESXi: lists all VMs on the host.

  • vCenter: groups VMs by host within the specified datacenter (defaults to the target's configured datacenter).

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNo
datacenterNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses significant behavioral differences between standalone ESXi and vCenter, including optional datacenter grouping. Without annotations, it carries the full burden and does so well. It implies read-only operation (list) but does not explicitly state lack of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two bullet points, front-loading the main action. Every sentence provides value, no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's core behavior and parameter roles. With an output schema present (context signal), return values need not be described. It is fairly complete for a list tool, though explicit mention of read-only nature would strengthen it further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must compensate. It explains the 'datacenter' parameter defaults to the target's configured datacenter but lacks detail on the 'target' parameter (e.g., format, valid values). Some meaning added, but insufficient given the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists VMs on a target, with specific behavior for standalone ESXi vs vCenter. It uniquely identifies the resource (VMs) and action (list), distinguishing it from sibling tools like create_vm, delete_vm, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (listing VMs on a target) and mentions key parameters (target, datacenter). However, it does not explicitly state when not to use or suggest alternative tools, though siblings are distinct actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

power_off_vmB

Hard power off a VM by display name or moref ID (e.g. 'vm-42').

ParametersJSON Schema
NameRequiredDescriptionDefault
name_or_idYes
targetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description should disclose more behavioral details. It states 'hard power off' implying forceful shutdown but does not mention risks (data loss), prerequisites, or behavior if VM is already off or not found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no wasted words, but lacks structure such as separate sections for usage or parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with an output schema, the description is adequate for the core action, but fails to explain the optional parameter and lacks behavioral context, leaving gaps for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It explains name_or_id (display name or moref ID) but completely ignores the 'target' parameter, leaving its purpose unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (hard power off) and the resource (VM), and specifies the identification methods (display name or moref ID), distinguishing it from siblings like power_on_vm or delete_vm.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (to hard power off a VM) but provides no explicit guidance on when not to use, such as preferring a soft shutdown or prerequisites like the VM being powered on.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

power_on_vmA

Power on a VM by display name or moref ID (e.g. 'vm-42').

ParametersJSON Schema
NameRequiredDescriptionDefault
name_or_idYes
targetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description only states the action without disclosing side effects (e.g., idempotency), required permissions, or error conditions. With no annotations, the agent lacks critical behavioral context for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no wasted words. Every piece of information earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two parameters and an output schema, the description covers the primary parameter but misses behavioral details (e.g., what happens if VM is already on) and the purpose of the 'target' parameter. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains that name_or_id accepts a display name or moref ID, adding value beyond the schema structure. However, the optional 'target' parameter is not explained, and schema coverage is 0%, so the description only partially compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Power on a VM') and the resource identifiers ('by display name or moref ID'), which distinguishes it from siblings like power_off_vm.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies how to identify the VM (name or moref ID) with an example, but does not provide guidance on when to choose one identifier over the other or mention when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.8/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: create, delete, list, power on, power off. No overlap in functionality.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (create_vm, delete_vm, list_vms, power_off_vm, power_on_vm). Minor plural variation for list_vms is acceptable.

Tool Count5/5

5 tools cover the essential VM lifecycle operations without being excessive or insufficient for a vCenter MCP server.

Completeness3/5

Missing common operations like get single VM details, update VM configuration, clone, or snapshot management. Basic CRUD and power actions are present but gaps exist for full lifecycle management.

Maintenance

ActivityStale
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage VMware vSphere virtual infrastructure through comprehensive operations including VM power control, snapshot management, resource monitoring, performance analytics, and bulk operations with built-in safety confirmations for destructive actions.
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage VMware vSphere infrastructure through 55 typed tools built on the govc CLI. It supports comprehensive operations including VM lifecycle management, snapshot control, datastore navigation, and networking configuration.
    25
    3
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    AI-powered VMware vCenter/ESXi monitoring and operations. 20 MCP tools for inventory queries, health monitoring, VM lifecycle management, fast provisioning (Linked Clone, OVA, template deploy), snapshot management, and datastore browsing. Supports vSphere 6.5–8.0. Works with local models via Ollama/LM Studio.
    2
    44
    70
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables management of VMware vCenter and ESXi environments, including VM operations, resource management, and automation with Ollama AI and n8n workflows.
    4
    MIT

Latest Blog Posts

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/michaelrice/vcenter-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server