proxmox-mcp
MCP server exposing your Proxmox VE cluster to Claude Code via the Proxmox REST API.
1. Create a Proxmox API token
On the Proxmox host (or via the web UI):
# Create a dedicated user
pveum user add mcp@pve
# Create a role with the permissions needed for this server.
# Start with PVEVMAdmin (covers create/clone/start/stop for VMs and CTs)
# plus PVEAuditor (read-only access to nodes/storage).
pveum aclmod / -user mcp@pve -role PVEVMAdmin
pveum aclmod / -user mcp@pve -role PVEAuditor
# Create an API token for that user (copy the secret shown, it's only displayed once)
pveum user token add mcp@pve mcp-token --privsep 0
This gives the token the same permission scope as the user. --privsep 0 means thetoken inherits the user's full permissions (simpler). Set --privsep 1 and assignACLs to the token specifically if you want tighter scoping.
Note on "no delete" by design: the role above does not grant VM.Allocateremoval/destroy actions are still possible under PVEVMAdmin in some Proxmoxversions — if you want to be stricter, create a custom role excludingVM.Config.* removal privileges. This server itself does not expose a destroytool, but a sufficiently broad token could still be used for destructive actionsvia raw API calls if compromised. Keep the secret safe.
2. Configure environment variables
export PROXMOX_HOST="https://192.168.100.10:8006" # your Proxmox node, port 8006
export PROXMOX_TOKEN_ID="mcp@pve!mcp-token"
export PROXMOX_TOKEN_SECRET="<the-uuid-secret-from-step-1>"
export PROXMOX_TLS_INSECURE="true" # set if using the default self-signed cert
Put these in a .env file or your shell profile — do not commit them.
3. Build
npm install
npm run build
4. Register with Claude Code
Add to your Claude Code MCP config (e.g. ~/.config/claude-code/mcp.json or viaclaude mcp add):
{
"mcpServers": {
"proxmox": {
"command": "node",
"args": ["/absolute/path/to/proxmox-mcp/dist/index.js"],
"env": {
"PROXMOX_HOST": "https://192.168.100.10:8006",
"PROXMOX_TOKEN_ID": "mcp@pve!mcp-token",
"PROXMOX_TOKEN_SECRET": "your-secret-here",
"PROXMOX_TLS_INSECURE": "true"
}
}
}
}
Run this on a machine with network access to your Proxmox API (VLAN 100 orwherever 192.168.100.x is reachable — e.g. your workstation on VLAN 10, oran LXC you SSH into).
Available tools
| Tool | Description |
|---|---|
list_nodes |
List cluster nodes and status |
get_node_status |
CPU/memory/uptime for a node |
list_storage |
Storage pools on a node |
list_resources |
All VMs and CTs on a node with status |
list_templates |
Available CT templates / ISOs |
get_resource_status |
Status of a specific VM/CT |
power_action |
start / stop / shutdown / reboot a VM/CT |
create_lxc |
Create a new LXC container from a template |
create_vm |
Create a new empty QEMU VM (optionally with ISO) |
clone_resource |
Clone a VM/CT template |
There is intentionally no destroy/delete tool. Removing VMs/CTs should bedone directly in the Proxmox UI.
Notes
- VMIDs must be unique cluster-wide — check
list_resourcesbefore creating. net0strings follow Proxmox syntax, e.g.name=eth0,bridge=vmbr0,ip=192.168.100.50/24,gw=192.168.100.1for static IPon VLAN 100, orip=dhcpfor DHCP.- For LXC templates, download them first via
pveam available/pveam downloadon the node, or via the Proxmox UI (Storage → CT Templates).