Skip to main content
Glama
vmware-mcp

vmware-mcp

by havu0

vmware-mcp

npm version license

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-mcp

Quick 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:password

Or 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-mcp

Related 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

/Applications/VMware Fusion.app/Contents/Public/vmrun

Windows

C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe

Linux

/usr/bin/vmrun

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

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

VMWARE_MCP_<VM>_USER

Guest OS username

VMWARE_MCP_<VM>_PASS

Guest OS password

VMWARE_MCP_<VM>_ENCRYPTION_PASS

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

vm_start

Start a VM (gui or headless)

vm_stop

Graceful or forced shutdown

vm_suspend

Suspend to disk (encrypted VMs may not resume via vmrun)

vm_reset

Reboot (soft or hard)

vm_pause / vm_unpause

Pause/resume execution

vm_status

Running state + IP address

vm_list

Running VMs, or all configured VMs with all=true

vm_get_ip

Guest IP (optionally wait until ready)

Guest Execution (2)

Tool

Description

guest_run_command

Run shell command, return stdout. Auto-detects shell (cmd/bash/powershell)

guest_run_program

Launch a program (sync or fire-and-forget with no_wait)

File Operations (10)

Tool

Description

file_copy_to_guest

Host → Guest file copy

file_copy_from_guest

Guest → Host file copy

guest_read_file

Read guest file contents

guest_file_exists

Check if file exists

guest_directory_exists

Check if directory exists

guest_directory_create

Create directory

guest_delete_file

Delete file

guest_rename_file

Rename/move file

guest_list_directory

List directory contents

guest_create_tempfile

Create temp file, return path

Snapshots (4)

Tool

Description

vm_snapshot_create

Create named snapshot (may fail on running encrypted VMs)

vm_snapshot_revert

Revert to snapshot (optional auto_start)

vm_snapshot_list

List snapshots in tree format

vm_snapshot_delete

Delete snapshot

Process Management (2)

Tool

Description

guest_process_list

List all guest processes

guest_kill_process

Kill process by PID

Screen & Input (2)

Tool

Description

vm_capture_screen

Screenshot as base64 PNG or save to file (requires guest credentials)

guest_type_keystrokes

Send keystrokes to guest (requires macOS Accessibility permission)

Variables & Tools State (3)

Tool

Description

vm_read_variable

Read VM variable (runtimeConfig / guestVar / guestEnv)

vm_write_variable

Write VM variable

vm_check_tools

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

vm_suspend → vm_start fails on encrypted VMs

Use vm_stop / vm_start instead

Guest commands have a 5-minute hard timeout

Break long operations into smaller commands

guest_type_keystrokes needs macOS Accessibility

Grant permission in System Settings

vm_capture_screen requires guest credentials

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 --watch

License

MIT

Available Tools

32 tools
file_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

    B3.4/5.0

    Scored across 32 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables 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
      -
    • A
      license
      Not graded
      quality
      C
      maintenance
      Provider-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