使用说明
libvirt mcp
一个MCP服务器,用于通过SSH管理远程libvirt主机上的虚拟机。 设计用于在笔记本电脑上本地运行并连接到一个或多个管理程序。
需求
- Python 3.10+
libvirt本地安装的C库(用于libvirt-python)- 使用基于密钥的身份验证通过SSH访问libvirt主机
libvirtd在每个远程主机上运行
安装libvirt系统库
macOS(Homebrew):
brew install libvirt
Ubuntu/Debian:
sudo apt install libvirt-dev python3-dev
Fedora/RHEL:
sudo dnf install libvirt-devel python3-devel
安装
cd libvirt-mcp
pip install -e .
或使用紫外线(推荐):
uv pip install -e .
用法
手动运行服务器(用于测试)
python server.py
服务器使用 stdio传输 --它被设计为由MCP发射 客户端(Claude Code、Claude Desktop等),不作为长期守护进程运行。
测试
单元测试在没有真正的libvirt主机的情况下运行。集成测试需要
LIBVIRT_TEST_HOST.
如果 LIBVIRT_TEST_HOST 存储在 .env,将其导出到当前shell中
在运行pytest之前:
set -a; source .env; set +a
运行测试:
# Unit tests
uv run pytest tests/test_server.py -v
# Integration tests
uv run pytest tests/test_integration.py -v
# Full suite
uv run pytest tests/ -v
使用 -rs 诊断跳过时:
uv run pytest tests/test_integration.py -v -rs
MCP检验员测试
npx @modelcontextprotocol/inspector python server.py
使用Claude代码进行配置
添加到您的Claude Code MCP配置中(~/.claude/claude_mcp_config.json):
{
"mcpServers": {
"libvirt": {
"command": "python",
"args": ["/path/to/libvirt-mcp/server.py"]
}
}
}
或使用 uv run 如果您是通过uv安装的:
{
"mcpServers": {
"libvirt": {
"command": "uv",
"args": ["run", "--directory", "/path/to/libvirt-mcp", "python", "server.py"]
}
}
}
可用工具
连接管理
| 工具 | 说明 |
|---|---|
libvirt_connect_host |
打开与libvirt主机的SSH连接,在别名下注册 |
libvirt_disconnect_host |
关闭与主机的连接 |
libvirt_list_hosts |
显示所有活动主机连接 |
VM创建
| 工具 | 说明 |
|---|---|
libvirt_create_vm |
从模板创建虚拟机(配置磁盘、定义、启动) |
libvirt_list_templates |
列出可用的VM模板 |
VM迁移
| 工具 | 说明 |
|---|---|
libvirt_migrate_vm |
将脱机迁移作为异步作业启动(关闭、复制磁盘、定义/启动目标) |
libvirt_get_migration_status |
获取迁移作业状态、阶段时间线和最终结果/错误 |
迁移流程:
- 呼叫
libvirt_migrate_vm随着confirm=false和捕获job_id - 投票与
libvirt_get_migration_status直到状态为succeeded或failed - 呼叫
libvirt_migrate_vm随着confirm=true清理源定义/磁盘
域生命周期
| 工具 | 描述 | 破坏性? |
|---|---|---|
libvirt_list_domains |
列出所有虚拟机,可选择按状态筛选 | 否 |
libvirt_get_domain_info |
获取特定VM的详细信息 | 否 |
libvirt_get_domain_xml |
检索VM的完整XML定义 | 否 |
libvirt_define_domain |
从XML注册新VM | 否 |
libvirt_start_domain |
启动关闭VM | 否 |
libvirt_shutdown_domain |
发送优雅的ACPI关机信号 | 否 |
libvirt_destroy_domain |
强制停止VM(电源拉动) | 是 |
libvirt_reboot_domain |
发送优雅的重启信号 | 否 |
libvirt_suspend_domain |
暂停/冻结正在运行的虚拟机 | 否 |
libvirt_resume_domain |
取消暂停VM的暂停 | 否 |
libvirt_undefine_domain |
从libvirt中删除VM定义 | 是 |
本地环境配置
创建一个 .lab/hosts.json 用于定义libvirt主机的文件(此目录为
git忽略):
mkdir -p .lab
{
"hosts": [
{
"host": "myhost.example.com",
"alias": "myhost"
}
]
}
每个条目支持与以下相同的字段 libvirt_connect_host: host (必填),
alias (必填), user (可选), port (可选), ssh_key_path (可选)。
模板
VM模板是JSON文件 templates/ 目录。其中包括两个:
default--带有新的10GB空磁盘的基本KVM VMsuse-leap-micro--复制openSUSE Leap Micro基础映像
通过添加JSON文件来创建自己的文件 templates/。有关架构,请参阅现有模板。
创建虚拟机
“使用带有2个vCPU和2048 MB RAM的默认模板在实验室中创建一个名为'web01'的VM”
这将通过SSH在远程主机上提供磁盘,生成域XML,定义并启动VM。
与克劳德的对话示例
连接到我的实验室主机: 以用户ubuntu的身份连接到我的libvirt主机192.168.1.10,别名为“lab”
列出虚拟机: “列出实验室中所有正在运行的虚拟机”
启动虚拟机: 在实验室中启动名为“ubuntu服务器”的虚拟机
获取XML进行编辑: “在实验室中获取'ubuntu服务器'的XML,这样我就可以调整它的内存”
扩展服务器
要添加的未来模块(每个模块都在一个单独的文件中,导入到server.py中):
storage.py--存储池、卷、磁盘连接/分离networks.py--虚拟网络、接口snapshots.py--快照创建/列表/还原/删除clone.py--域克隆助手
安全须知
- 使用SSH进行传输——不需要打开libvirt TCP端口
- SSH密钥路径可以为每台主机指定,也可以依赖SSH代理
- 破坏性行动(
destroy,undefine)相应地进行了注释 因此MCP客户端可以在执行之前发出警告 - 从不存储凭据--依赖于SSH密钥基础架构
