mcpField
K
KVM/libvirt VMs and backups (Fedora)

KVM/libvirt VMs and backups (Fedora)

本地服务
github.com云与基础设施12 周前更新

关于 KVM/libvirt VMs and backups (Fedora)

KVM/libvirt VMs and backups (Fedora) 是用于在 Fedora 上管理 KVM/libvirt 虚拟机及 Borg 或 Timeshift 备份的本地 MCP 服务。工具会声明权限和破坏性,并验证参数、记录可审计的调用。

主要功能

  1. 01启动、停止、克隆和查看虚拟机
  2. 02管理虚拟机快照与迁移
  3. 03创建、恢复和验证备份
  4. 04使用 Zod 验证工具参数
  5. 05记录调用并标记破坏性操作

适用场景

  1. 01在 Fedora 上管理 KVM 虚拟机
  2. 02创建或恢复 Borg、Timeshift 备份
  3. 03在破坏性操作前审查风险

MCP 相关

向 MCP 客户端提供虚拟机和备份管理工具,包括状态查看、克隆、快照及备份操作。工具注释标明破坏性和只读属性,客户端可据此请求确认。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"amineutron-fedora-agents": {
"command": "npx",
"args": [
"-y",
"fedora-agents-mcp"
],
"env": {
"MCP_AGENTS_LOG_DIR": "<MCP_AGENTS_LOG_DIR>"
}
}
}
}
启动命令npx -y fedora-agents-mcp
需要配置的环境变量
MCP_AGENTS_LOG_DIRDirectory for the audit log (default: XDG state dir)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmfedora-agents-mcp1.3.0

工具

19

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

fedora-agents MCP 服务

CI npm License: MIT TypeScript

英文摘要。 MCP 服务让 AI Agent 能够直接操作 Fedora 上的 KVM/libvirt 虚拟机以及 Borg/Timeshift 备份。每个工具都会声明是否需要 sudo,以及是否具有破坏性;客户端必须确认具有破坏性的调用。任何脚本运行前,都会使用 Zod 验证参数。使用 npx fedora-agents-mcp 安装(--help 会列出设置),或运行 npm ci && npm run build。安全策略和工具表:SECURITY.md。

通过 MCP(Model Context Protocol,模型上下文协议)公开 VM-Controller 和 Backup-Manager Agent 的 MCP 服务。让 Claude Code 能够直接管理 KVM 虚拟机和备份。

为什么它是为 LLM Agent 设计的

对于能读取输出并做出响应的人来说,virsh 脚本就足够了。而操作机器的大模型 Agent 需要其他保障,这正是此服务围绕脚本提供的功能:

  • 每次调用都可追踪。 每次工具调用都会生成一个关联 ID,并贯穿所有日志行;JSON 审计日志会同步写入磁盘,确保在向 Agent 响应前完成写入(src/logger.ts)。
  • 重试取决于工具的性质。 只有幂等的读取操作(vm_status、backup_status、backup_list、backup_verify)会重试,最多三次,间隔依次为 1、2 和 5 秒;会修改状态的操作(启动、停止、恢复、清理)绝不会重试。验证或权限错误会立即终止(src/utils/executor.ts)。
  • 退出代码会转换为类型化错误。 脚本会返回代码(超时、锁已被占用、空间不足……),服务会将其转换为 Agent 可读的 ErrorCode,而不是需要自行解读的文本(EXIT_CODE_MAP、src/config.ts)。
  • root 权限按脚本授予。 不会为 virsh、virt-clone 或 qemu-img 配置 sudoers 规则;仅逐一授权确实需要权限的系统脚本(参见脚本和 sudoers 的位置)。
  • 长时间运行任务会发布进度。 克隆、导出或备份会通过 mcp-tracking 报告进度(scripts/utils/tracking.sh):Agent 可以稍后查看进度,无需一直等待。
  • 客户端无需维护列表,就能识别危险操作。 每个工具都会发布其 MCP 注解(readOnlyHint、destructiveHint、idempotentHint);Lyra 会据此判断危险性,并在执行破坏性操作前让用户确认。

本地优先且可自托管:所有内容都在本机(本地部署)运行,不依赖第三方服务;可在 Lyra 中通过 Ollama 使用本地模型,也可使用任何 MCP 客户端。

演示

MCP 客户端:19 个工具列表、帮助信息,然后显示 KVM 虚拟机状态

使用 docs/demo/record.sh 在实际机器上录制:一个最小 MCP 客户端(docs/demo/mcp_demo.py)通过 stdio 启动服务、列出工具、调用 help,然后调用 vm_status(只读)。IP 地址已替换为示例地址。

架构

fedora-agents/
  scripts/                -- scripts bash embarques (autonomes, plus de dependance a fedora-setup)
    agents/vm-controller/   vm-start, vm-stop, vm-status, vm-exec, vm-copy, vm-snapshot,
                            vm-destroy, vm-export, vm-import (+ common.sh)
    agents/backup-manager/  backup-create, backup-list, backup-restore, backup-verify,
                            backup-clean, backup-status (+ common.sh)
    kvm/                    kvm-clone, kvm-clone-system, kvm-snapshot, verify-vm-clone
                            (+ helpers fix-nm-connection-vm, _fix-grub-vm)
    backup/                 borg-backup, test-restore, get-borg-passphrase
    utils/tracking.sh       reporting optionnel vers MCP Tracking (127.0.0.1:8765)
    config.env.example      surcharges locales (KVM_IMAGES_DIR, VM_SSH_USER...)
  src/
    index.ts          -- point d'entree, enregistrement des outils MCP
    config.ts         -- timeouts, permissions, codes d'erreur
    logger.ts         -- logging JSON structure
    tools/
      vm-controller.ts    -- outils vm_start, vm_stop, vm_status, vm_exec, vm_copy,
                             vm_snapshot, vm_verify, vm_clone, vm_clone_system, vm_destroy
      backup-manager.ts   -- outils backup_create, backup_list, backup_restore,
                             backup_verify, backup_clean, backup_status
      vm-portability.ts   -- outils vm_export, vm_import
    utils/
      executor.ts     -- execution des scripts bash avec retry, timeout, gestion erreurs
      validation.ts   -- schemas Zod pour tous les parametres d'outils

已公开的 MCP 工具

help

列出所有可用工具及其说明。

  • 底层脚本:无(直接在 index.ts 中生成)
VM 控制器
工具底层脚本描述
vm_startvm-controller/vm-start.sh启动 VM,可选择等待 SSH 就绪
vm_stopvm-controller/vm-stop.sh停止 VM(正常停止或强制停止)
vm_destroyvm-controller/vm-destroy.sh删除 VM 定义和存储
vm_statusvm-controller/vm-status.sh显示 VM 状态(或列出所有 VM)
vm_execvm-controller/vm-exec.sh通过 SSH 在 VM 中执行命令
vm_copyvm-controller/vm-copy.sh通过 SCP 在主机与 VM 之间复制文件
vm_snapshotvm-controller/vm-snapshot.sh管理快照(create/list/restore/delete)
vm_verifykvm/verify-vm-clone.sh验证克隆是否忠实于主机系统
vm_clonekvm/kvm-clone.sh克隆现有 VM(完整克隆或链接克隆)
vm_clone_systemkvm/kvm-clone-system.sh将整个主机系统克隆到 VM
备份管理器
工具底层脚本描述
backup_statusbackup-manager/backup-status.sh备份总览仪表板
backup_listbackup-manager/backup-list.sh列出可用备份
backup_createbackup-manager/backup-create.sh创建备份(timeshift/borg/vm-snapshot/manual)
backup_verifybackup-manager/backup-verify.sh验证备份完整性
backup_restorebackup-manager/backup-restore.sh恢复备份(有破坏性)
backup_cleanbackup-manager/backup-clean.sh应用保留策略
VM 可移植性
工具底层脚本描述
vm_exportvm-controller/vm-export.sh将 VM 导出为经过清理的 .tar.gz 存档
vm_importvm-controller/vm-import.sh从 vm_export 存档导入 VM

未公开的辅助脚本

这些脚本在内部使用,但无法通过 MCP 直接访问:

脚本作用
agents/vm-controller/common.sh通用函数(virsh、SSH、日志记录)
agents/backup-manager/common.sh通用函数(borg、锁、通知)
kvm/kvm-snapshot.sh由 vm-snapshot.sh 调用的快照引擎
kvm/fix-nm-connection-vm.sh, kvm/_fix-grub-vm.sh克隆后的修复(NetworkManager、grub BLS)
backup/borg-backup.sh, backup/get-borg-passphrase.shBorg 备份;通过 systemd-creds 或 Bitwarden 获取密码短语,绝不以明文存储
backup/test-restore.sh由 backup-verify --deep 使用的恢复测试

脚本位置和 sudoers

src/config.ts 按以下顺序解析脚本根目录:

  1. LYRA_SCRIPTS_DIR(环境变量)
  2. /usr/local/lib/lyra/scripts:由 Lyra 安装程序安装的 root:root 0755 副本
  3. 仓库中的 scripts/(开发模式)

不使用 sudo 的工具(vm_status、vm_start、vm_stop、vm_exec、vm_copy、vm_snapshot、 vm_export、vm_verify)直接控制 libvirt:用户必须属于 libvirt 组,且 polkit 必须允许该组访问 qemu:///system:

sudo usermod -aG libvirt "$USER"   # puis se reconnecter
virsh -c qemu:///system list --all # doit repondre sans sudo

没有任何 sudoers 规则针对 virsh、virt-clone 或 qemu-img:对这些二进制文件设置 NOPASSWD 等同于授予 root 权限(一个域可以挂载主机磁盘)。需要 root 权限的工具 (vm_destroy、vm_clone、vm_clone_system、vm_import 和 backup_*)会通过 sudo 运行 整个脚本。这些规则仅针对系统副本中的单个脚本,绝不使用通配符匹配用户可写目录(否则,用户 UID 下的任意进程都可以在其中放入 .sh 文件以获取 root 权限):

user ALL=(ALL) NOPASSWD: /usr/local/lib/lyra/scripts/kvm/kvm-clone.sh
user ALL=(ALL) NOPASSWD: /usr/local/lib/lyra/scripts/kvm/kvm-clone-system.sh
...

Lyra 安装程序会生成此文件(/etc/sudoers.d/lyra),并在启用之前使用 visudo -cf 对其进行验证。手动安装:

sudo install -d -o root -g root -m 0755 /usr/local/lib/lyra/scripts
sudo cp -r scripts/. /usr/local/lib/lyra/scripts/
sudo chown -R root:root /usr/local/lib/lyra/scripts
sudo find /usr/local/lib/lyra/scripts -type f -name '*.sh' -exec chmod 0755 {} +

配置

变量作用默认值
SCRIPTS_DIR脚本目录(agents/、kvm/):生产环境使用根目录副本,测试使用仓库中的 scripts/Lyra 安装的根目录副本,否则为 scripts/
MCP_AGENTS_LOG_DIRJSON 日志(服务、错误、sudo 下或破坏性调用的审计)如果 /var/log/mcp-agents 可写则使用该目录,否则使用 $XDG_STATE_HOME/mcp-agents(~/.local/state/mcp-agents);文件权限为 0600,绝不写入 /tmp
scripts/config.envKVM、Borg、Timeshift 路径(参见 config.env.example)示例值
VM_SSH_USER、VM_SSH_USERSVM 的 SSH 账户:默认账户,然后是按 VM 指定的账户("fedora-base=fedora ubuntu-base=ubuntu"),配置于 config.env 或 ~/.config/vm-controller/config当前用户

该服务是 Lyra 的一个组件,但也能独立运行:SCRIPTS_DIR=./scripts node dist/index.js 无需 sudoers 即可启动(标记为 requiresSudo 的工具会正常报错)。

  • 超时:src/config.ts(TIMEOUTS)
  • sudo 权限:src/config.ts(TOOL_PERMISSIONS)
  • 重试:src/config.ts(RETRY_CONFIG)
  • 本地配置:scripts/config.env(从 scripts/config.env.example 复制)

日志

结构化 JSON 日志写入位置:

  1. /var/log/mcp-agents/(如果可写)
  2. ~/.local/state/mcp-agents/(用户级回退目录)
  3. /tmp/mcp-agents-logs/(最终回退目录)

一行安装

npx fedora-agents-mcp            # depuis npm ; `npx fedora-agents-mcp --help` pour les reglages
                                 # depuis un clone : npm ci && npm run build && node dist/index.js

Claude Desktop / Claude Code 配置(mcpServers):

{ "fedora-agents": { "command": "npx", "args": ["-y", "fedora-agents-mcp"] } }

安全策略和工具表:SECURITY.md。

安装与启动

需要在主机上安装的软件包(Fedora 软件包名称;名称不同时括号内为 Debian/Ubuntu 对应名称):

命令软件包相关工具
virshlibvirt-client(libvirt-clients)所有 vm_*
virt-clonevirt-install(virtinst)vm_clone
virt-installvirt-install(virtinst)vm_clone_system
qemu-imgqemu-img(qemu-utils)vm_status、vm_clone、vm_clone_system、vm_import、vm_export、vm_destroy
guestfishguestfs-tools(libguestfs-tools)vm_clone(克隆的网络和 GRUB)
ssh、scpopenssh-clients(openssh-client)vm_exec、vm_copy、vm_clone(克隆的主机名)
borgborgbackupbackup_*、vm_export
timeshifttimeshiftbackup_*、vm_clone_system
rsyncrsyncbackup_create、backup_list、backup_restore、vm_clone_system
nmap(可选)nmapvm_verify、vm_clone(在没有来宾 Agent 时搜索 IP)
Node.js >= 18nodejsMCP 服务

VM 的 SSH 主机密钥保存在 $XDG_STATE_HOME/fedora-agents/known_hosts(默认路径为 ~/.local/state/fedora-agents/known_hosts):首次连接时接受密钥,拒绝已更改的密钥。

npm install
npm run build

# Test local (scripts/ du depot, sans sudoers)
node dist/index.js

Claude Code 或 Claude Desktop 的 MCP 配置说明见 一行安装一节。

Lyra 生态系统的一部分

仓库作用
lyra法语优先的语音助手:语音 DevOps 助手,默认本地运行(AGPL-3.0);它会先通过规则理解口语法语,再调用模型,因此使用 0.5B 模型就足够
fedora-agentsMCP:KVM 虚拟机和备份
mcp-trackingMCP + API + 长时任务仪表板
neutroncorehomelab 的 PWA 中枢
hue-mcpPhilips Hue MCP(由 ThomasRohde/hue-mcp 分叉而来)
pylips-mcpPhilips TV MCP
denon-mcpDenon 功放 MCP
catt-mcpChromecast 和 DLNA MCP

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。