通过 REST API、vmrun 和 vmcli 控制 VMware Workstation Pro 虚拟机的 MCP 服务器。
136 个工具,覆盖 VMware Workstation Pro 全部自动化能力:
| 来源 | 工具数 | 描述 |
|---|---|---|
| 本地状态与任务 | 11 | 当前 VM、注册表列举、电源状态、异步任务、客户机凭据 |
| REST API | 18 | 虚拟机管理、网卡、共享文件夹、端口转发 |
| vmrun | 46 | 电源、快照、克隆、客户机文件/进程操作、设备 |
| vmcli | 61 | 芯片组、磁盘、网卡、SATA、NVMe、串口、VProbes |
计数与 server.py 的 list_tools() 逐条对应(按分节横幅统计)。
vm_id 在所有工具中都是可选的:省略时使用当前 VM(由 vm_select 设定);显式传入并成功解析后,该 VM 成为当前 VM。选择器按顺序匹配:
.vmx路径(文件必须存在,否则立即报missing_vmx)- UUID(对空格/连字符不敏感)
- DisplayName(大小写不敏感,精确匹配)
- DisplayName / vmx 路径的唯一子串
- 仅 REST 工具:上述都未命中时回退到 vmrest 的 VM 列表
无当前 VM 且注册表恰好 1 台时自动选中;多台时返回 ambiguous 并列出候选。VMWARE_DEFAULT_VM 可在启动后第一次解析时把一台 VM 固定为当前。
身份与状态来源是 %APPDATA%\VMware\inventory.vmls(可用 VMWARE_INVENTORY 覆盖)+ vmrun list + vmcli <vmx> Power query。vmrun/vmcli 工具不依赖 vmrest,只有 REST 工具需要。
vm_delete / vmrun_delete 在没有显式 vm_id 且没有当前 VM 时直接拒绝,避免误删。
vmrun 的 *InGuest 命令和 vmcli 的 Guest * 命令都要客户机 OS 的用户名/密码。首次调用没凭据时直接返回 auth_required,不猜、不空跑:
{"ok": false, "status": "auth_required", "error_type": "auth_required",
"error": "guest_ls needs guest credentials for Windows 11 x64; ask the user for the guest OS username and password, then call vm_credentials_set with vm_id=\"Windows 11 x64\", user, password",
"hint": "call vm_credentials_set with {vm_id, user, password}"}按提示向用户要密码,vm_credentials_set {vm_id, user, password} 存一次,之后同一 VM 的客户机工具自动复用;调用参数里显式给的 user/password 优先于存储值。密码用 Windows DPAPI(当前用户范围)加密后存到 %LOCALAPPDATA%\vmware-mcp\credentials.json(VMWARE_CREDENTIALS 可改路径),文件内没有明文;vm_credentials_status 只回显用户名和时间,vm_credentials_clear 删除。密码被客户机拒绝时同样回 auth_required(CLI 原文附在 error 里),重新 set 即可。
vmrun_var_read / vmrun_var_write 只有 guestEnv / guestVar 需要凭据,runtimeConfig 不需要。
每条 CLI 调用都有硬超时;超时只杀 CLI 进程本身(不杀进程树,避免连带杀掉 vmware-vmx.exe),错误信息会提示用 vm_status / job_status 复查。长操作在软等待(默认 2.5s)内没完成时返回 job_id,用 job_wait / job_status / job_cancel 跟进。
| 环境变量 | 默认 | 用途 |
|---|---|---|
VMWARE_TIMEOUT |
30 | 普通查询/配置(秒) |
VMWARE_POWER_TIMEOUT |
300 | start/stop/reset/suspend/pause/unpause |
VMWARE_LONG_TIMEOUT |
1800 | clone/delete/upgrade/install tools/snapshot/disk/template |
VMWARE_GUEST_TIMEOUT |
120 | 客户机 run/copy/file 操作 |
VMWARE_POWER_QUERY_TIMEOUT |
5 | vmcli <vmx> Power query |
VMWARE_LIST_TIMEOUT |
5 | vmrun list |
VMWARE_REST_TIMEOUT |
10 | vmrest HTTP 请求 |
VMWARE_SOFT_WAIT_MS |
2500 | MCP 工具软等待(毫秒;0 = 一律返回 job) |
VMWARE_CREDENTIALS |
%LOCALAPPDATA%\vmware-mcp\credentials.json |
客户机凭据存储路径 |
所有工具返回 JSON 信封(成功 ok:true,失败 ok:false + isError:true):
{"ok": true, "operation": "power_query", "status": "succeeded",
"target": {"name": "Windows 11 x64", "uuid": "564D4FB7D945E2794873A904C2731E70",
"vmx": "D:\\VMs\\Windows 11 x64\\Windows 11 x64.vmx",
"power": "on", "registered": true, "running": true, "current": true},
"duration_ms": 412, "result": "PowerState: on"}status:成功侧succeeded | noop | running;失败侧failed | timed_out | busy | not_found | ambiguous | cancelled | auth_required- 未在软等待内完成时返回
job_id+hint,不含result - 预检会拒绝与电源状态矛盾的调用(客户机工具要求开机、
ethernet_set_pci_slot要求关机),并把“已开机又 start”这类操作变成noop - 解析类错误附带
candidates;同一 VM 上并发的破坏性操作返回busy和活动 job id
- VMware Workstation Pro 17+
- Python 3.10+
- vmrest 服务运行中(REST API 工具需要)
git clone https://github.com/xiaobfly/vmware-mcp
cd vmware-mcp
python -m venv .venv
.venv\Scripts\pip install -e .omp 插件清单把命令固定为
./.venv/Scripts/vmware-mcp.exe,所以必须装在本仓库的.venv里。
启动 vmrest 服务:
# 首次配置
"C:\Program Files (x86)\VMware\VMware Workstation\vmrest.exe" -C
# 启动服务
"C:\Program Files (x86)\VMware\VMware Workstation\vmrest.exe"添加到 Claude Code:
claude mcp add vmware-mcp \
-e VMWARE_USERNAME=your_username \
-e VMWARE_PASSWORD=your_password \
-- vmware-mcp仓库自带 omp 插件清单:package.json + Agent Plugins 1.0.0 的 plugin.json / mcp.json(声明 mcpServers.vmware,命令用相对路径 ./.venv/Scripts/vmware-mcp.exe)。先完成上面的安装,然后:
cd vmware-mcp
omp plugin install .- 插件根目录就是仓库目录(linked,不复制),改代码后无需重装插件
omp plugin list查看、omp plugin uninstall vmware-mcp移除、omp plugin doctor自检- 已在用户级
~/.omp/agent/mcp.json手动配过vmware的,先删掉那条再装插件,避免同名 server 重复 - 重启 omp 生效,工具前缀
mcp__vmware_*(136 个) - VMware 不在
D:\VMware\...时改mcp.json里的VMRUN_PATH/VMCLI_PATH - 非交互
omp -p的首轮可能早于 MCP 连接完成(默认启动窗口 250ms):需要时调大mcp.startupTimeoutMs,例如omp --config E:\omp.yml -p ...,omp.yml写mcp: { startupTimeoutMs: 8000 }
手动配置(与插件二选一):用户级 ~/.omp/agent/mcp.json。$schema 必须存在且等于下面这行,否则整个文件被判为 disabled:
{
"$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/src/config/mcp-schema.json",
"mcpServers": {
"vmware": {
"command": "E:\\tools\\vmware-mcp\\.venv\\Scripts\\vmware-mcp.exe",
"env": {
"VMRUN_PATH": "D:\\VMware\\VMware Workstation\\vmrun.exe",
"VMCLI_PATH": "D:\\VMware\\VMware Workstation\\vmcli.exe"
},
"timeout": 600000
}
}
}timeout单位毫秒,600000覆盖 clone / disk extend 等长操作;工具内部仍按软等待返回job_idVMRUN_PATH/VMCLI_PATH只在 VMware 装在非默认路径时需要;REST 工具另需VMWARE_USERNAME/VMWARE_PASSWORD(vmrun/vmcli 工具不需要)
| 工具 | 描述 |
|---|---|
vm_list |
列出已注册虚拟机(inventory.vmls + vmrun list,不需要 vmrest) |
vm_select |
固定当前 VM,之后可省略 vm_id |
vm_current |
显示当前 VM 与注册表候选 |
vm_status |
刷新一台或全部 VM 的电源状态(不需要 vmrest) |
vm_credentials_set |
存客户机用户名/密码(DPAPI 加密),后续客户机工具自动复用 |
vm_credentials_status |
列出已存凭据的 VM(只回显用户名) |
vm_credentials_clear |
删除某 VM 的客户机凭据 |
job_list |
列出运行中/最近完成的任务 |
job_status |
查询任务状态与结果 |
job_wait |
等待任务完成(默认 30s,最大 300s) |
job_cancel |
取消任务(终止 CLI 进程) |
| 工具 | 描述 |
|---|---|
vm_get |
获取虚拟机设置 |
vm_create |
克隆虚拟机 |
vm_delete |
删除虚拟机 |
vm_update |
更新虚拟机 CPU/内存 |
vm_power_get |
获取电源状态 |
vm_power_set |
设置电源状态(开/关/挂起/暂停) |
vm_nic_list |
列出网络适配器 |
vm_nic_create |
创建网络适配器 |
vm_nic_delete |
删除网络适配器 |
vm_ip_get |
获取虚拟机 IP 地址 |
vm_folder_list |
列出共享文件夹 |
vm_folder_create |
创建共享文件夹 |
vm_folder_delete |
删除共享文件夹 |
network_list |
列出虚拟网络 |
network_create |
创建虚拟网络 |
network_portforward_list |
列出端口转发 |
network_portforward_set |
设置端口转发 |
network_portforward_delete |
删除端口转发 |
| 工具 | 描述 |
|---|---|
vmrun_list |
列出运行中的虚拟机 |
vmrun_start |
启动虚拟机 |
vmrun_stop |
停止虚拟机(软/硬) |
vmrun_reset |
重置虚拟机 |
vmrun_suspend |
挂起虚拟机 |
vmrun_pause |
暂停虚拟机 |
vmrun_unpause |
恢复暂停的虚拟机 |
vmrun_clone |
克隆虚拟机(完整/链接) |
vmrun_upgrade |
升级虚拟机格式 |
vmrun_delete |
删除虚拟机 |
vmrun_snapshot_list |
列出快照 |
vmrun_snapshot_take |
创建快照 |
vmrun_snapshot_delete |
删除快照 |
vmrun_snapshot_revert |
恢复快照 |
vmrun_file_exists |
检查客户机文件是否存在 |
vmrun_dir_exists |
检查目录是否存在 |
vmrun_ls |
列出客户机目录 |
vmrun_mkdir |
在客户机创建目录 |
vmrun_rmdir |
删除客户机目录 |
vmrun_rm |
删除客户机文件 |
vmrun_rename |
重命名客户机文件 |
vmrun_copy_to |
复制文件到客户机 |
vmrun_copy_from |
从客户机复制文件 |
vmrun_temp_file |
在客户机创建临时文件 |
vmrun_run |
在客户机运行程序 |
vmrun_script |
在客户机运行脚本 |
vmrun_ps |
列出客户机进程 |
vmrun_kill |
终止客户机进程 |
vmrun_shared_enable |
启用共享文件夹 |
vmrun_shared_disable |
禁用共享文件夹 |
vmrun_shared_add |
添加共享文件夹 |
vmrun_shared_remove |
移除共享文件夹 |
vmrun_shared_set |
设置共享文件夹状态 |
vmrun_device_connect |
连接设备 |
vmrun_device_disconnect |
断开设备 |
vmrun_var_read |
读取虚拟机变量 |
vmrun_var_write |
写入虚拟机变量 |
vmrun_screenshot |
截取屏幕 |
vmrun_keystrokes |
发送按键 |
vmrun_tools_install |
安装 VMware Tools |
vmrun_tools_state |
检查 Tools 状态 |
vmrun_guest_ip |
获取客户机 IP |
vmrun_host_networks |
列出主机网络 |
vmrun_portforward_list |
列出端口转发 |
vmrun_portforward_set |
设置端口转发 |
vmrun_portforward_delete |
删除端口转发 |
| 工具 | 描述 |
|---|---|
snapshot_list |
列出快照 |
snapshot_take |
创建快照 |
snapshot_revert |
恢复快照 |
snapshot_delete |
删除快照 |
snapshot_clone |
从快照克隆 |
guest_run |
运行程序 |
guest_ps |
列出进程 |
guest_kill |
终止进程 |
guest_ls |
列出文件 |
guest_mkdir |
创建目录 |
guest_rm |
删除文件 |
guest_rmdir |
删除目录 |
guest_copy_to |
复制到客户机 |
guest_copy_from |
从客户机复制 |
guest_env |
获取环境变量 |
mks_screenshot |
截取屏幕 |
mks_send_key |
发送按键序列 |
mks_query |
查询 MKS 状态 |
chipset_query |
查询 CPU/内存配置 |
chipset_set_cpu |
设置 CPU 数量 |
chipset_set_memory |
设置内存大小 |
chipset_set_cores |
设置每插槽核心数 |
tools_query |
查询 Tools 状态 |
tools_install |
安装 Tools |
tools_upgrade |
升级 Tools |
template_create |
创建虚拟机模板 |
template_deploy |
部署虚拟机模板 |
disk_query |
查询磁盘配置 |
disk_create |
创建磁盘 |
disk_extend |
扩展磁盘 |
config_query |
查询配置参数 |
config_set |
设置配置参数 |
power_query |
查询电源状态 |
power_start |
启动虚拟机 |
power_stop |
停止虚拟机 |
power_pause |
暂停虚拟机 |
power_unpause |
恢复虚拟机 |
power_reset |
重置虚拟机 |
power_suspend |
挂起虚拟机 |
ethernet_query |
查询网卡配置 |
ethernet_set_type |
设置连接类型 |
ethernet_set_present |
设置适配器存在 |
ethernet_set_connected |
设置启动时连接 |
ethernet_set_device |
设置虚拟设备 |
ethernet_set_network |
设置网络名称 |
ethernet_set_pci_slot |
设置 PCI 槽位(需虚拟机关机) |
ethernet_purge |
移除适配器 |
hgfs_query |
查询共享文件夹(本版 vmcli 的 HGFS setter 已损坏,共享文件夹请用 vmrun_shared_*) |
serial_query |
查询串口 |
serial_set_present |
设置串口存在 |
serial_purge |
移除串口 |
sata_query |
查询 SATA 配置 |
sata_set_present |
设置 SATA 存在 |
sata_purge |
移除 SATA 适配器 |
nvme_query |
查询 NVMe 配置 |
nvme_set_present |
设置 NVMe 存在 |
nvme_purge |
移除 NVMe 适配器 |
vprobes_query |
查询 VProbes |
vprobes_enable |
启用 VProbes |
vprobes_load |
加载 VProbes 脚本 |
vprobes_reset |
重置 VProbes |
MIT