vmware-mcp
Controls VMware Fusion/Workstation virtual machines via the vmrun CLI, providing 32 tools for VM lifecycle, guest execution, file operations, and more.
Click on "Deploy 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-mcp list all running virtual machines"
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
MCP server for controlling VMware Fusion/Workstation virtual machines via the vmrun CLI.
Unlike existing VMware MCP servers that depend on the REST API (vmrest), this server calls vmrun directly — no additional daemon required.
npx vmware-mcpQuick Start
Add to your MCP client config — the agent gets 32 tools for full VM control.
Credentials can be passed as CLI args, or omitted if stored in config file, env vars, or OS secret store.
For tool usage workflows and known limitations, see AGENT_GUIDE.md.
~/.config/opencode/opencode.json:
{
"mcp": {
"vmware": {
"type": "local",
"command": ["npx", "-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password",
"--encryption-pass", "my-vm:encpass"
],
"timeout": 300000
}
}
}~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}claude mcp add --transport stdio vmware -- npx -y vmware-mcp \
--guest-user my-vm:admin --guest-pass my-vm:passwordOr manually in ~/.claude.json or .mcp.json (project-level):
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp", "--guest-user", "my-vm:admin", "--guest-pass", "my-vm:password"]
}
}
}~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}.vscode/mcp.json (workspace):
{
"servers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}Note: uses servers key, not mcpServers.
Configure via Cline sidebar → MCP Servers, or manually:
macOS: ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
],
"disabled": false
}
}
}~/.roo/mcp_settings.json (global) or .roo/mcp.json (project):
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}~/.aws/amazonq/mcp.json (global) or .amazonq/mcp.json (project):
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}~/.config/zed/settings.json — note: uses context_servers key with different structure:
{
"context_servers": {
"vmware": {
"command": {
"path": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}
}~/.continue/config.json:
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}~/.config/cody/mcp_servers.json:
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}Settings → Tools → AI Assistant → Model Context Protocol (MCP) → Add:
{
"mcpServers": {
"vmware": {
"command": "npx",
"args": ["-y", "vmware-mcp",
"--guest-user", "my-vm:admin",
"--guest-pass", "my-vm:password"
]
}
}
}Manual / Global Install
npm install -g vmware-mcp
vmware-mcpRelated MCP server: VMware Workstation MCP
Configuration
Create ~/.config/vmware-mcp/config.json:
{
"vmrun_path": "/Applications/VMware Fusion.app/Contents/Public/vmrun",
"default_vm": "my-vm",
"vms": {
"my-vm": {
"vmx_path": "/path/to/VM.vmwarevm/VM.vmx",
"os_type": "windows",
"guest_user": "admin",
"guest_password": "password"
},
"linux-vm": {
"vmx_path": "/path/to/Ubuntu.vmwarevm/Ubuntu.vmx",
"os_type": "linux",
"guest_user": "ubuntu",
"guest_password": "password"
}
}
}The config file is optional. VMs can also be specified by full .vmx path, and credentials can come from other sources.
vmrun Path Defaults
Platform | Default Path |
macOS |
|
Windows |
|
Linux |
|
Credential Resolution
Credentials are resolved in this order (first match wins):
Priority | Source | Platforms |
1 | Config file | All |
2 | CLI arguments | All |
3 | Environment variables | All |
4 | OS secret store | macOS Keychain, Linux libsecret, Windows PasswordVault |
If credentials exist in config or OS secret store, no CLI args or env vars are needed.
CLI Arguments
vmware-mcp --guest-user my-vm:admin --guest-pass my-vm:password --encryption-pass my-vm:encpassNote: Passwords with
!,$, or other shell special characters may be mangled by bash history expansion. Use single quotes in bash ('my-vm:p@ss!word'), or prefer config file / OS secret store for passwords with special characters.
Environment Variables
Variable | Description |
| Guest OS username |
| Guest OS password |
| VM encryption password |
<VM> is the uppercase VM name from config (e.g., VMWARE_MCP_MY-VM_USER).
OS Secret Store
Store credentials securely — no plaintext files. The server reads from the native store automatically.
macOS (Keychain)
security add-generic-password -s vmware-mcp -a "my-vm/guest_user" -w "admin"
security add-generic-password -s vmware-mcp -a "my-vm/guest_password" -w "password"
security add-generic-password -s vmware-mcp -a "my-vm/encryption_password" -w "encpass"Linux (libsecret — GNOME Keyring / KDE Wallet)
secret-tool store --label="vmware-mcp" service vmware-mcp account "my-vm/guest_user" <<< "admin"
secret-tool store --label="vmware-mcp" service vmware-mcp account "my-vm/guest_password" <<< "password"
secret-tool store --label="vmware-mcp" service vmware-mcp account "my-vm/encryption_password" <<< "encpass"Windows (Credential Locker / PasswordVault)
$vault = New-Object Windows.Security.Credentials.PasswordVault
$vault.Add((New-Object Windows.Security.Credentials.PasswordCredential("vmware-mcp", "my-vm/guest_user", "admin")))
$vault.Add((New-Object Windows.Security.Credentials.PasswordCredential("vmware-mcp", "my-vm/guest_password", "password")))
$vault.Add((New-Object Windows.Security.Credentials.PasswordCredential("vmware-mcp", "my-vm/encryption_password", "encpass")))Tools (32)
VM Lifecycle (9)
Tool | Description |
| Start a VM (gui or headless) |
| Graceful or forced shutdown |
| Suspend to disk (encrypted VMs may not resume via vmrun) |
| Reboot (soft or hard) |
| Pause/resume execution |
| Running state + IP address |
| Running VMs, or all configured VMs with |
| Guest IP (optionally wait until ready) |
Guest Execution (2)
Tool | Description |
| Run shell command, return stdout. Auto-detects shell (cmd/bash/powershell) |
| Launch a program (sync or fire-and-forget with |
File Operations (10)
Tool | Description |
| Host → Guest file copy |
| Guest → Host file copy |
| Read guest file contents |
| Check if file exists |
| Check if directory exists |
| Create directory |
| Delete file |
| Rename/move file |
| List directory contents |
| Create temp file, return path |
Snapshots (4)
Tool | Description |
| Create named snapshot (may fail on running encrypted VMs) |
| Revert to snapshot (optional |
| List snapshots in tree format |
| Delete snapshot |
Process Management (2)
Tool | Description |
| List all guest processes |
| Kill process by PID |
Screen & Input (2)
Tool | Description |
| Screenshot as base64 PNG or save to file (requires guest credentials) |
| Send keystrokes to guest (requires macOS Accessibility permission) |
Variables & Tools State (3)
Tool | Description |
| Read VM variable (runtimeConfig / guestVar / guestEnv) |
| Write VM variable |
| Check VMware Tools state (unknown / installed / running) |
Known Limitations
These are vmrun CLI constraints, not bugs in this server. All errors include actionable hints.
Limitation | Workaround |
Snapshot ops fail on running encrypted VMs | Stop the VM first |
| Use |
Guest commands have a 5-minute hard timeout | Break long operations into smaller commands |
| Grant permission in System Settings |
| Configure guest_user / guest_password |
Port forwarding is Windows-host only | Not available on macOS Fusion |
Development
git clone https://github.com/havu0/vmware-mcp.git
cd vmware-mcp
npm install
npm run build # tsc
npm test # vitest (70 tests)
npm run dev # tsc --watchLicense
Available Tools
32 toolsfile_copy_from_guestCopy File from GuestA
Copy a file from the guest VM to the host machine.
Inputs: host_path (required), guest_path (required), vm.
file_copy_to_guestCopy File to GuestA
Copy a file from the host machine to the guest VM.
Inputs: host_path (required), guest_path (required), vm.
guest_create_tempfileCreate Temp File in GuestC
Create a temporary file inside the guest VM and return its path.
Inputs: vm.
guest_delete_fileDelete Guest FileB
Delete a file inside the guest VM.
Inputs: guest_path (required), vm.
guest_directory_createCreate Guest DirectoryB
Create a directory inside the guest VM.
Inputs: guest_path (required), vm.
guest_directory_existsCheck Guest DirectoryA
Check if a directory exists inside the guest VM.
Inputs: guest_path (required), vm.
guest_file_existsCheck Guest FileA
Check if a file exists inside the guest VM.
Inputs: guest_path (required), vm.
guest_kill_processKill Guest ProcessA
Kill a process inside the guest VM by its PID.
Inputs: pid (required), vm.
guest_list_directoryList Guest DirectoryB
List the contents of a directory inside the guest VM.
Inputs: guest_path (required), vm.
guest_process_listList Guest ProcessesA
List all running processes inside the guest VM. Requires guest credentials.
Inputs: vm.
guest_read_fileRead Guest FileA
Read the contents of a file inside the guest VM. Copies to host, reads, then cleans up.
Inputs: guest_path (required), vm.
guest_rename_fileRename Guest FileA
Rename or move a file inside the guest VM.
Inputs: new_path (required), old_path (required), vm.
guest_run_commandRun Command in GuestA
Execute a shell command inside the guest VM and return stdout. Uses the appropriate shell based on guest OS type (cmd/bash). Requires guest credentials in config and VMware Tools running in guest.
Inputs: command (required), vm, shell, timeout_seconds.
guest_run_programRun Program in GuestC
Launch a program inside the guest VM. Can run asynchronously with no_wait. Requires full path to the program.
Inputs: program (required), vm, args, no_wait, +1 more.
guest_type_keystrokesType Keystrokes in GuestA
Send keystrokes to the guest VM. Useful for GUI automation when combined with vm_capture_screen. Requires macOS Accessibility permission for VMware Fusion in System Settings.
Inputs: keystrokes (required), vm.
vm_capture_screenCapture VM ScreenA
Capture a screenshot of the VM screen. Returns the image as base64-encoded PNG, or saves to a specified host path. Requires guest credentials in config.
Inputs: vm, host_path.
vm_check_toolsCheck VMware ToolsA
Check the VMware Tools state in the guest. Returns "unknown", "installed", or "running".
Inputs: vm.
vm_get_ipGet VM IPA
Get the IP address of a running virtual machine.
Inputs: vm, wait.
vm_listList VMsA
List virtual machines. By default shows only running VMs. Use all=true to include configured VMs from config.
Inputs: all.
vm_pausePause VMB
Pause a running virtual machine without shutting it down.
Inputs: vm.
vm_read_variableRead VM VariableB
Read a variable from the VM state.
Inputs: name (required), var_type (required), vm.
vm_resetReset VMA
Reset (reboot) a virtual machine. "soft" runs shutdown scripts first.
Inputs: vm, mode.
vm_snapshot_createCreate SnapshotA
Create a snapshot of a virtual machine. Do not use "/" in snapshot names. Note: may fail on running encrypted VMs due to vmrun limitations — stop the VM first if needed.
Inputs: snapshot_name (required), vm.
vm_snapshot_deleteDelete SnapshotB
Delete a snapshot from a virtual machine.
Inputs: snapshot_name (required), vm, delete_children.
vm_snapshot_listList SnapshotsA
List all snapshots of a virtual machine in tree format.
Inputs: vm.
vm_snapshot_revertRevert to SnapshotA
Revert a VM to a previous snapshot. The VM will be in suspended state after revert. Use auto_start to automatically power it back on.
Inputs: snapshot_name (required), vm, auto_start.
vm_startStart VMC
Start a VMware virtual machine.
Inputs: vm, gui, wait_for_ip.
vm_statusVM StatusB
Get the running status and IP address of a virtual machine.
Inputs: vm.
vm_stopStop VMA
Stop a virtual machine. "soft" attempts graceful shutdown, "hard" forces power off.
Inputs: vm, mode.
vm_suspendSuspend VMA
Suspend a virtual machine, preserving its current state to disk. Warning: encrypted VMs may not resume via vmrun after suspend — use vm_stop instead if unsure.
Inputs: vm, mode.
vm_unpauseUnpause VMB
Resume a paused virtual machine.
Inputs: vm.
vm_write_variableWrite VM VariableC
Write a variable to the VM state.
Inputs: name (required), value (required), var_type (required), vm.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 32 tools
Most tools are clearly separated by resource area: VM power, snapshots, guest files, guest processes, and VM variables. A few neighboring tools could be confused (vm_status vs vm_get_ip both expose IP, and vm_stop/vm_suspend/vm_pause are all power-management actions), but the descriptions sufficiently distinguish their behaviors.
Names are uniformly snake_case and generally follow a domain-prefixed action pattern (vm_start, guest_read_file, vm_snapshot_create). Minor deviations like file_copy_to_guest/file_copy_from_guest and ordering differences between vm_list and vm_snapshot_list prevent a perfect consistency score.
32 tools is a large surface, exceeding the typical well-scoped range. Some tools are redundant or could be consolidated, such as vm_status/vm_get_ip and guest_read_file/file_copy_from_guest, making the set feel heavier than necessary for its core VM-management purpose.
The tool set covers the operational lifecycle well: VM power control, snapshots, guest command execution, file operations, process management, screen capture/input, variables, and VMware Tools status. The main gaps are VM lifecycle provisioning operations like create/delete/clone and configuration/resource management, which appear to be outside the intended vmrun-style scope.
Maintenance
Related MCP Connectors
MCP server for Superserve sandboxes: create, exec, and manage Firecracker microVMs
Linux server administration over OAuth MCP: shell, Docker, systemd, files and monitoring.
Self-hosted MCP server: 26 deterministic dev, security, and EVM tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA VMware ESXi/vCenter management server based on MCP (Machine Control Protocol), providing simple REST API interfaces for virtual machine management.64MIT
- AlicenseBqualityDmaintenanceA stdio MCP server that controls VMware Workstation via vmrun, enabling VM lifecycle management and snapshot operations.14MIT
- FlicenseNot gradedqualityDmaintenanceEnables managing VMware Workstation Pro VMs via MCP tools, including power operations, snapshots, guest processes, and network configuration through the vmrest, vmrun, and vmcli interfaces.1-
- AlicenseNot gradedqualityCmaintenanceProvider-neutral MCP server for managing VirtualBox, VMware Fusion, and VMware Workstation, offering tools for VM lifecycle, configuration, snapshots, guest operations, networking, and artifact resolution.MIT