KVM/libvirt VMs and backups (Fedora)

io.github.amineutron由 GitHub 账号 amineutron 发布v1.3.0更新于 Oct 24, 2026

Manage local KVM/libvirt VMs and Timeshift/Borg backups on Fedora: start, stop, clone, snapshot.

概览

AI 生成的概览

一个本地的 Fedora MCP 服务器,允许 AI 助手管理 KVM/libvirt 虚拟机并执行 Borg/Timeshift 备份。

可以做什么
在 Fedora 上管理本地 KVM/libvirt 虚拟机和 Timeshift/Borg 备份:启动、停止、克隆、快照。工具包括 VM 控制功能,如启动、停止和在虚拟机内部执行命令,以及备份管理功能,如列出、创建、验证和恢复备份。它提供高级功能,如可追踪的调用、幂等读取的重试以及为 AI 助手提供类型安全的错误代码。
适用场景
当您需要 AI 助手直接交互并管理 Fedora 主机上的虚拟机生命周期和系统备份时,请使用此服务器。
运行要求
作为用户机器上的本地进程运行。需要安装特定软件包,如 libvirt-client、qemu-utils、borgbackup 和 Node.js >= 18。某些操作需要 root 权限。
安装前请注意
此服务器执行会写入、更改或删除数据的操作(例如 vm_destroy、backup_restore)。它需要特定的系统软件包,并且某些操作可能需要 root 访问权限。请注意 SECURITY.md 中详细说明的安全策略。

安装

在 SourceWeft 中

  1. 打开 控制台中的 KVM/libvirt VMs and backups (Fedora),将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

fedora-agents MCP Server

[CI] [npm] [License: MIT] [TypeScript]

English summary. MCP server that gives an AI agent hands on KVM/libvirt virtual machines and Borg/Timeshift backups on Fedora. Each tool declares whether it needs sudo and whether it is destructive; the client must confirm destructive calls. Arguments are validated with Zod before any script runs. Install with npx fedora-agents-mcp (--help lists the settings) or npm ci && npm run build. Security policy and tool table: SECURITY.md.

Serveur MCP (Model Context Protocol) qui expose les agents VM-Controller et Backup-Manager via le protocole MCP. Permet a Claude Code de gerer les VMs KVM et les backups directement.

Pourquoi c'est conçu pour des agents LLM

Un script virsh suffit à un humain qui lit la sortie et réagit. Un agent LLM (grand modèle de langage) qui pilote des machines a besoin d'autres garanties, et c'est ce que ce serveur ajoute autour des scripts :

  • Chaque appel est traçable. Un identifiant de corrélation est créé par appel d'outil et suit toutes les lignes du journal ; le journal d'audit JSON est écrit de façon synchrone, sur disque avant la réponse à l'agent (src/logger.ts).
  • Le réessai dépend de la nature de l'outil. Seules les lectures idempotentes (vm_status, backup_status, backup_list, backup_verify) sont retentées, trois fois avec un délai croissant de 1, 2 puis 5 s ; une action qui modifie (démarrer, arrêter, restaurer, nettoyer) ne l'est jamais. Une erreur de validation ou de permission arrête tout de suite (src/utils/executor.ts).
  • Le code de sortie devient une erreur typée. Les scripts renvoient un code (délai dépassé, verrou déjà pris, espace insuffisant...) que le serveur traduit en ErrorCode lisible par l'agent, au lieu d'un texte à interpréter (EXIT_CODE_MAP, src/config.ts).
  • Les droits root sont donnés script par script. Aucune règle sudoers sur virsh, virt-clone ou qemu-img ; seuls les scripts système qui en ont besoin sont autorisés, un par un (voir Emplacement des scripts et sudoers).
  • La progression des tâches longues est publiée. Clone, export ou sauvegarde reportent leurs étapes à mcp-tracking (scripts/utils/tracking.sh) : l'agent vérifie l'avancement plus tard au lieu de bloquer.
  • Le client sait ce qui est dangereux sans liste à maintenir. Chaque outil publie ses annotations MCP (readOnlyHint, destructiveHint, idempotentHint) ; Lyra y lit la dangerosité et fait confirmer l'humain avant une action destructrice.

Local-first et self-hosted : tout tourne sur la machine (on-prem), sans service tiers, avec un modèle local via Ollama dans Lyra ou n'importe quel client MCP.

Demo

[Client MCP : liste des 19 outils, aide, puis etat des VMs KVM]

Enregistree sur la machine reelle avec docs/demo/record.sh : un client MCP minimal (docs/demo/mcp_demo.py) demarre le serveur en stdio, liste les outils, appelle help puis vm_status (lecture seule). Les adresses IP sont remplacees par des adresses d'exemple.

Architecture

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

Outils MCP exposes

help

Liste tous les outils disponibles avec leurs descriptions.

  • Script sous-jacent: aucun (genere directement dans index.ts)

VM Controller

OutilScript sous-jacentDescription
vm_startvm-controller/vm-start.shDemarre une VM, attend optionnellement SSH
vm_stopvm-controller/vm-stop.shArrete une VM (proprement ou force)
vm_destroyvm-controller/vm-destroy.shSupprime definition + stockage d'une VM
vm_statusvm-controller/vm-status.shAffiche l'etat d'une VM (ou liste toutes)
vm_execvm-controller/vm-exec.shExecute une commande dans une VM via SSH
vm_copyvm-controller/vm-copy.shCopie des fichiers hote <-> VM via SCP
vm_snapshotvm-controller/vm-snapshot.shGere les snapshots (create/list/restore/delete)
vm_verifykvm/verify-vm-clone.shVerifie qu'un clone est fidele au systeme hote
vm_clonekvm/kvm-clone.shClone une VM existante (complet ou lie)
vm_clone_systemkvm/kvm-clone-system.shClone le systeme hote entier vers une VM

Backup Manager

OutilScript sous-jacentDescription
backup_statusbackup-manager/backup-status.shDashboard global des backups
backup_listbackup-manager/backup-list.shListe les backups disponibles
backup_createbackup-manager/backup-create.shCree un backup (timeshift/borg/vm-snapshot/manual)
backup_verifybackup-manager/backup-verify.shVerifie l'integrite des backups
backup_restorebackup-manager/backup-restore.shRestaure un backup (destructif)
backup_cleanbackup-manager/backup-clean.shApplique les politiques de retention

VM Portabilite

OutilScript sous-jacentDescription
vm_exportvm-controller/vm-export.shExporte une VM en archive .tar.gz sanitarisee
vm_importvm-controller/vm-import.shImporte une VM depuis une archive vm_export

Scripts helpers non exposes

Ces scripts sont utilises en interne mais pas directement accessibles via MCP:

ScriptRole
agents/vm-controller/common.shFonctions communes (virsh, SSH, logging)
agents/backup-manager/common.shFonctions communes (borg, locks, notifications)
kvm/kvm-snapshot.shMoteur de snapshots appele par vm-snapshot.sh
kvm/fix-nm-connection-vm.sh, kvm/_fix-grub-vm.shCorrections post-clone (NetworkManager, grub BLS)
backup/borg-backup.sh, backup/get-borg-passphrase.shSauvegarde Borg ; passphrase via systemd-creds ou Bitwarden, jamais en clair
backup/test-restore.shTest de restauration utilise par backup-verify --deep

Emplacement des scripts et sudoers

src/config.ts resout la racine des scripts dans cet ordre :

  1. LYRA_SCRIPTS_DIR (variable d'environnement)
  2. /usr/local/lib/lyra/scripts : copie root:root 0755 installee par l'installeur Lyra
  3. scripts/ du depot (mode developpement)

Les outils sans sudo (vm_status, vm_start, vm_stop, vm_exec, vm_copy, vm_snapshot, vm_export, vm_verify) pilotent libvirt directement : l'utilisateur doit etre membre du groupe libvirt, que polkit autorise sur qemu:///system :

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

Aucune regle sudoers ne vise virsh, virt-clone ou qemu-img : un NOPASSWD sur ces binaires equivaut a root (un domaine peut monter le disque de l'hote). Les outils qui demandent root (vm_destroy, vm_clone, vm_clone_system, vm_import et les backup_*) lancent leur script entier via sudo. Ces regles visent uniquement la copie systeme, script par script, jamais un glob sur un dossier inscriptible par l'utilisateur (sinon n'importe quel processus de son uid obtient root en y deposant un .sh) :

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

L'installeur Lyra genere ce fichier (/etc/sudoers.d/lyra) et le valide avec visudo -cf avant de l'activer. Installation manuelle :

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

Configuration

VariableRôleDéfaut
SCRIPTS_DIRdossier des scripts (agents/, kvm/) : copie root pour la production, scripts/ du dépôt pour les testscopie root installée par Lyra, sinon scripts/
MCP_AGENTS_LOG_DIRjournaux JSON (serveur, erreurs, audit des appels sous sudo ou destructifs)/var/log/mcp-agents s'il est inscriptible, sinon $XDG_STATE_HOME/mcp-agents (~/.local/state/mcp-agents) ; fichiers en 0600, jamais dans /tmp
scripts/config.envchemins KVM, Borg, Timeshift (voir config.env.example)valeurs d'exemple
VM_SSH_USER, VM_SSH_USERScompte SSH des VMs : par defaut, puis par VM ("fedora-base=fedora ubuntu-base=ubuntu"), dans config.env ou ~/.config/vm-controller/configutilisateur courant

Le serveur est un composant de Lyra mais fonctionne seul : SCRIPTS_DIR=./scripts node dist/index.js démarre sans sudoers (les outils marqués requiresSudo échoueront alors proprement).

  • Timeouts: src/config.ts (TIMEOUTS)
  • Permissions sudo: src/config.ts (TOOL_PERMISSIONS)
  • Retry: src/config.ts (RETRY_CONFIG)
  • Config locale: scripts/config.env (copier depuis scripts/config.env.example)

Logs

Les logs JSON structures sont ecrits dans:

  1. /var/log/mcp-agents/ (si accessible en ecriture)
  2. ~/.local/state/mcp-agents/ (fallback utilisateur)
  3. /tmp/mcp-agents-logs/ (fallback final)

Installation en une ligne

bash
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

Configuration Claude Desktop / Claude Code (mcpServers) :

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

Politique de securite et tableau des outils : SECURITY.md.

Installation et demarrage

Paquets a installer sur l'hote (noms Fedora ; Debian/Ubuntu entre parentheses quand ils different) :

CommandePaquetOutils concernes
virshlibvirt-client (libvirt-clients)tous les 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 (reseau et GRUB du clone)
ssh, scpopenssh-clients (openssh-client)vm_exec, vm_copy, vm_clone (nom d'hote du clone)
borgborgbackupbackup_*, vm_export
timeshifttimeshiftbackup_*, vm_clone_system
rsyncrsyncbackup_create, backup_list, backup_restore, vm_clone_system
nmap (optionnel)nmapvm_verify, vm_clone (recherche d'IP sans agent invite)
Node.js >= 18nodejsle serveur MCP

Les cles d'hote SSH des VMs sont conservees dans $XDG_STATE_HOME/fedora-agents/known_hosts (a defaut ~/.local/state/fedora-agents/known_hosts) : premier contact accepte, cle modifiee refusee.

bash
npm installnpm run build
# Test local (scripts/ du depot, sans sudoers)node dist/index.js

La configuration MCP pour Claude Code ou Claude Desktop est decrite dans la section Installation en une ligne.

Part of the Lyra ecosystem

DépôtRôle
lyraFrench-first voice assistant : assistant DevOps vocal, local par défaut (AGPL-3.0) ; le français familier est compris par des règles avant même d'appeler un modèle, ce qui lui suffit d'un modèle de 0.5B
fedora-agentsMCP : machines virtuelles KVM et sauvegardes
mcp-trackingMCP + API + tableau de bord des tâches longues
neutroncorehub PWA du homelab
hue-mcpMCP Philips Hue (fork de ThomasRohde/hue-mcp)
pylips-mcpMCP TV Philips
denon-mcpMCP ampli Denon
catt-mcpMCP Chromecast et DLNA

来源:README.md,提交 12eaed2

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

2
  1. v1.3.0最新Sep 25, 2026
  2. v1.2.2Sep 24, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分