From 3813f98c1d3adfe6251ee0d93bb0b63a18bde59e Mon Sep 17 00:00:00 2001 From: root Date: Sat, 4 Jul 2026 20:47:40 +0000 Subject: [PATCH] Proxmox MCP medium: P5 live migration tool --- src/proxmox_mcp/tools/guests.py | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/proxmox_mcp/tools/guests.py b/src/proxmox_mcp/tools/guests.py index a4f8556..b1e5b8d 100644 --- a/src/proxmox_mcp/tools/guests.py +++ b/src/proxmox_mcp/tools/guests.py @@ -322,6 +322,41 @@ def register(mcp: FastMCP) -> None: except (GuardError, ProxmoxAPIError) as exc: return json.dumps({"status": "error", "message": str(exc)}, indent=2) + + # ── Migration tools ────────────────────────────────────────── + + @mcp.tool() + def proxmox_migrate_vm( + node: str, + vmid: int, + target_node: str, + online: bool = True, + target: str = "", + ) -> str: + """Migrate a VM or LXC container to another node. + + For QEMU VMs: set online=True for live migration. + For LXC containers: migration is always offline. + """ + try: + require_writes() + client = get_client(target=target) + try: + # Try QEMU first — supports live migration + data: dict = {"target": target_node} + if online: + data["online"] = 1 + result = client.post(f"nodes/{node}/qemu/{vmid}/migrate", data=data) + except ProxmoxAPIError: + # Fall back to LXC — containers cannot be live-migrated + result = client.post( + f"nodes/{node}/lxc/{vmid}/migrate", + data={"target": target_node}, + ) + return json.dumps(result, indent=2, default=str) + except (GuardError, ProxmoxAPIError) as exc: + return json.dumps({"status": "error", "message": str(exc)}, indent=2) + # ── Snapshot tools ─────────────────────────────────────────── @mcp.tool()