Skip to main content
Glama

MCP Proxmox Server

by bsahane
README.md8.28 kB
# MCP Proxmox Server Advanced Proxmox Model Context Protocol (MCP) server in Python exposing rich Proxmox utilities for discovery, lifecycle, networking, snapshots/backups, metrics, pools/permissions, and orchestration. - Guide reference: [MCP Quickstart (Python)](https://modelcontextprotocol.io/quickstart/server#python) - Structure mirrors: [`bsahane/mcp-ansible`](https://github.com/bsahane/mcp-ansible/tree/main) ## Quick start ```bash git clone https://github.com/bsahane/mcp-proxmox.git cd mcp-proxmox python3 -m venv .venv source .venv/bin/activate python -m pip install -U pip pip install -r requirements.txt # (Optional) install the package locally pip install -e . ``` ## .env configuration - Copy `.env.example` to `.env` and edit values: ```bash cp .env.example .env ``` `.env` keys: ```bash PROXMOX_API_URL="https://proxmox.example.com:8006" PROXMOX_TOKEN_ID="root@pam!mcp-proxmox" PROXMOX_TOKEN_SECRET="<secret>" PROXMOX_VERIFY="true" PROXMOX_DEFAULT_NODE="pve" PROXMOX_DEFAULT_STORAGE="local-lvm" PROXMOX_DEFAULT_BRIDGE="vmbr0" ``` Notes: - Use an API token with appropriate ACLs; for discovery, `PVEAuditor` at `/` is sufficient; for lifecycle, grant narrower roles (e.g., `PVEVMAdmin`) on a pool. - Using `.env` avoids zsh history expansion issues with `!` in token IDs. ## Run the MCP server (stdio) Preferred (module form): ```bash source .venv/bin/activate python -m proxmox_mcp.server ``` Or installed console script: ```bash source .venv/bin/activate proxmox-mcp ``` ## Configure in Cursor Edit `~/.cursor/mcp.json` (portable example): ```json { "mcpServers": { "proxmox-mcp": { "command": "python", "args": ["-m", "proxmox_mcp.server"] } } } ``` ## Configure in Claude for Desktop Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: ```json { "mcpServers": { "proxmox-mcp": { "command": "python", "args": ["-m", "proxmox_mcp.server"] } } } ``` ## Tools reference All tools are available via MCP. Destructive tools accept `confirm`, and most write operations support `dry_run`, `wait`, `timeout`, `poll_interval`. Format below per tool: - Description - Example question → Possible answer (shape) ### Core discovery - `proxmox-list-nodes` - List cluster nodes (name, status, CPU/RAM/disk summary) - Example: "List cluster nodes" - Answer: `[ { "node": "pve", "status": "online", ... } ]` - `proxmox-node-status` - Detailed node health (load, uptime, versions) - Example: `{ "node": "pve" }` - Answer: `{ "kversion": "...", "uptime": 123456, ... }` - `proxmox-list-vms` - List VMs (filter by node, status, name substring) - Example: `{ "node": "pve", "status": "running" }` - Answer: `[ { "vmid": 100, "name": "web01", ... } ]` - `proxmox-vm-info` - Get VM details by `vmid` or `name` (+optional node), includes config - Example: `{ "name": "web01" }` - Answer: `{ "selector": {...}, "config": {...} }` - `proxmox-list-lxc` - List LXC containers (filterable) - Example: `{ "node": "pve" }` - Answer: `[ { "vmid": 50001, "name": "ct01", ... } ]` - `proxmox-lxc-info` - Get LXC details by `vmid` or `name` (+optional node) - Example: `{ "vmid": 50001 }` - Answer: `{ "selector": {...}, "config": {...} }` - `proxmox-list-storage` - List storages (types, free/used) - Example: `{}` - Answer: `[ { "storage": "local-lvm", "type": "lvmthin", ... } ]` - `proxmox-storage-content` - List storage content (ISOs, templates, images) - Example: `{ "node": "pve", "storage": "local" }` - Answer: `[ { "volid": "local:iso/foo.iso", ... } ]` - `proxmox-list-bridges` - List node bridges (vmbr...) - Example: `{ "node": "pve" }` - Answer: `[ { "iface": "vmbr0", ... } ]` - `proxmox-list-tasks` - Recent tasks (filter by node, user) - Example: `{ "node": "pve", "limit": 20 }` - Answer: `[ { "upid": "UPID:...", "status": "OK" }, ... ]` - `proxmox-task-status` - Check a task status - Example: `{ "upid": "UPID:..." }` - Answer: `{ "status": "stopped", "exitstatus": "OK" }` ### VM lifecycle - `proxmox-clone-vm` - Clone template VM to new VMID/name (supports target node, storage) - Example: `{ "source_vmid": 101, "new_vmid": 50009, "name": "web01", "storage": "local-lvm", "confirm": true, "wait": true }` - Answer: `{ "upid": "UPID:...", "status": {...} }` - `proxmox-create-vm` - Create new VM from ISO/template (minimal config) - Example: `{ "node": "pve", "vmid": 200, "name": "web02", "iso": "debian.iso", "confirm": true }` - Answer: `{ "upid": "UPID:..." }` - `proxmox-delete-vm` - Delete VM (confirm, purge) - Example: `{ "name": "web01", "purge": true, "confirm": true }` - Answer: `{ "upid": "UPID:..." }` - `proxmox-start-vm` / `proxmox-stop-vm` / `proxmox-reboot-vm` / `proxmox-shutdown-vm` - Manage power state (stop supports hard and timeout) - Example: `{ "name": "web01", "wait": true }` - Answer: `{ "upid": "UPID:...", "status": {...} }` - `proxmox-migrate-vm` - Live/offline migrate to another node - Example: `{ "name": "web01", "target_node": "pve2", "live": true }` - Answer: `{ "upid": "UPID:..." }` - `proxmox-resize-vm-disk` - Grow disk (GB) on target disk (e.g., scsi0) - Example: `{ "name": "web01", "disk": "scsi0", "grow_gb": 10, "confirm": true, "wait": true }` - Answer: `{ "upid": "UPID:...", "status": {...} }` - `proxmox-configure-vm` - Set whitelisted params (cores, memory, balloon, netX, agent, etc.) - Example: `{ "name": "web01", "params": { "memory": 4096, "cores": 4 }, "confirm": true }` - Answer: `{ "upid": "UPID:..." }` or `{ "result": null }` ### LXC lifecycle - `proxmox-create-lxc` - Create container from template (CPU/mem, rootfs size, net, storage) - Example: `{ "node": "pve", "vmid": 50050, "hostname": "ct01", "ostemplate": "debian-12.tar.zst", "confirm": true }` - Answer: `{ "upid": "UPID:..." }` - `proxmox-delete-lxc` / `proxmox-start-lxc` / `proxmox-stop-lxc` / `proxmox-configure-lxc` - Manage container lifecycle and config ### Cloud-init & networking - `proxmox-cloudinit-set` - Set CI params (ipconfig0, sshkeys, ciuser/cipassword) - Example: `{ "name": "web01", "ipconfig0": "ip=192.168.1.50/24,gw=192.168.1.1", "confirm": true }` - Answer: `{ "upid": "UPID:..." }` or `{ "result": null }` - `proxmox-vm-nic-add` / `proxmox-vm-nic-remove` - Add/remove NICs (bridge, model, VLAN) - `proxmox-vm-firewall-get` / `proxmox-vm-firewall-set` - Get/set per-VM firewall state and rules ### Images, templates, snapshots, backups - `proxmox-upload-iso` / `proxmox-upload-template` - Upload ISO or LXC template to storage - `proxmox-template-vm` - Convert VM to template - `proxmox-list-snapshots` / `proxmox-create-snapshot` / `proxmox-delete-snapshot` / `proxmox-rollback-snapshot` - Manage snapshots; rollback supports `wait` - `proxmox-backup-vm` / `proxmox-restore-vm` - Run vzdump and restore archives ### Metrics and monitoring - `proxmox-vm-metrics` - RRD metrics for VM (timeframe, cf) - `proxmox-node-metrics` - RRD metrics for node ### Pools, users, permissions - `proxmox-list-pools` / `proxmox-create-pool` / `proxmox-delete-pool` / `proxmox-pool-add` / `proxmox-pool-remove` - `proxmox-list-users` / `proxmox-list-roles` / `proxmox-assign-permission` ### Orchestration helpers - `proxmox-wait-task` - Poll a task until done/timeout - `proxmox-register-vm-as-host` - Emit JSON/INI snippet for Ansible inventory (hostname, IP, SSH user/key) - `proxmox-guest-exec` (optional) - Run a command via QEMU Guest Agent (requires agent in guest) ## Examples - List nodes: `{}` for `proxmox-list-nodes` - VMs on node `pve`: `{ "node": "pve" }` for `proxmox-list-vms` - Clone a template: `{ "source_vmid": 101, "new_vmid": 50009, "name": "web01", "storage": "local-lvm", "confirm": true, "wait": true }` - Configure Cloud-init IP: `{ "name": "web01", "ipconfig0": "ip=192.168.1.50/24,gw=192.168.1.1", "confirm": true }` ## Notes - Server uses stdio transport; prints only MCP protocol to stdout. Logs go to stderr. - Authentication uses your environment variables and/or `.env` file. - Name collisions across nodes return clear errors unless you specify `node`. ## Development ```bash # Lint/type-check as needed (not included by default) ``` ## License MIT

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/bsahane/mcp-proxmox'

If you have feedback or need assistance with the MCP directory API, please join our Discord server