proxmox-mcp
Provides tools for managing Proxmox VE environments, including nodes, QEMU VMs, LXC containers, storage, cluster resources, and backups with configurable risk levels for destructive operations.
Allows management of QEMU virtual machines, including start, stop, shutdown, reboot, suspend, resume, clone, and snapshot operations.
Proxmox-mcp
Simple Proxmox MCP
MCP server for managing Proxmox VE
38 tools — nodes, QEMU VMs, LXC containers, storage, cluster, snapshots.
Why this one?
One image, multi-arch —
docker run ghcr.io/akmalovaa/proxmox-mcp:latestand you're doneJust env vars — no config files, no database, no state
Read-only by default — destructive ops are gated behind an explicit
PROXMOX_RISK_LEVELTiny codebase — pure stdio MCP over Proxmoxer, no HTTP server, no auth layer, no extras
Raw JSON out — no formatting, no emoji; LLM gets clean data
Quick start
Image: ghcr.io/akmalovaa/proxmox-mcp:latest (multi-arch: amd64 + arm64).
1. Export credentials in your shell profile (~/.zprofile, ~/.zshrc or ~/.bashrc):
# base environment:
export PROXMOX_HOST=192.168.1.100
export PROXMOX_USER=root@pam
export PROXMOX_PASSWORD=your-password
# or use token auth (recommended):
export PROXMOX_TOKEN_NAME=mcp
export PROXMOX_TOKEN_VALUE=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# optional:
export PROXMOX_RISK_LEVEL=readReload: source ~/.zprofile (or restart the shell).
2. Add to ~/.claude/settings.json (Claude Code) or claude_desktop_config.json (Claude Desktop):
{
"mcpServers": {
"proxmox": {
"command": "docker",
"args": ["run", "-i", "--rm",
"-e", "PROXMOX_HOST",
"-e", "PROXMOX_USER",
"-e", "PROXMOX_PASSWORD",
"ghcr.io/akmalovaa/proxmox-mcp:latest"]
}
}
}or token auth:
{
"mcpServers": {
"proxmox": {
"command": "docker",
"args": ["run", "-i", "--rm",
"-e", "PROXMOX_HOST",
"-e", "PROXMOX_USER",
"-e", "PROXMOX_TOKEN_NAME",
"-e", "PROXMOX_TOKEN_VALUE",
"ghcr.io/akmalovaa/proxmox-mcp:latest"]
}
}
}docker run -e VAR without a value passes the host variable through — no secrets in the config file. Restart the client — 38 Proxmox tools become available.
For password auth, swap the token vars for PROXMOX_PASSWORD.
Note: Claude Desktop on macOS is launched via launchd and does not inherit
~/.zprofile/~/.zshrc. Either put the exports in~/.zshenv, or fall back to an inline"env": { ... }block in the config.
Configuration
All settings are environment variables — set them in your shell profile, pass them inline to docker run -e, or declare them in your MCP client's env block.
Variable | Default | Description |
| — | Proxmox host (IP or hostname) |
|
| API user |
Auth | — | |
|
| API port |
|
| Verify TLS certificate |
|
|
|
Authentication: token or password
Pick one. If both are set, the token wins.
Token (recommended) — create in Proxmox UI: Datacenter → Permissions → API Tokens → Add (uncheck Privilege Separation). Then:
export PROXMOX_TOKEN_NAME=mcp
export PROXMOX_TOKEN_VALUE=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxPassword (fallback):
export PROXMOX_PASSWORD=your-passwordRisk levels
PROXMOX_RISK_LEVEL gates destructive operations:
Level | Adds |
| read-only tools |
| + start / stop / reboot / suspend / clone / create-snapshot |
| + delete-snapshot / rollback-snapshot |
Every elevated call is logged to stderr (ALLOW / DENY + tool + tier).
Tools
Nodes (7)
Tool | Description |
| List all cluster nodes with status, CPU, memory, uptime |
| Detailed node metrics (CPU, memory, disk, load, kernel) |
| Network interfaces on a node |
| Physical disks on a node |
| Recent tasks on a node |
| Status of a specific task by UPID |
| Log output from a task |
QEMU VMs (14)
Tool | Tier | Description |
| read | List all VMs, optionally filter by node |
| read | Current VM status (running/stopped, CPU, memory) |
| read | VM configuration (hardware, disks, network) |
| read | List all snapshots of a VM |
| lifecycle | Start a VM |
| lifecycle | Force-stop a VM |
| lifecycle | Graceful ACPI shutdown with timeout |
| lifecycle | Reboot via ACPI |
| lifecycle | Suspend a VM |
| lifecycle | Resume a suspended VM |
| lifecycle | Full or linked clone |
| lifecycle | Create a snapshot |
| all | Delete a snapshot |
| all | Rollback to a snapshot |
LXC Containers (11)
Tool | Tier | Description |
| read | List all LXC containers, optionally filter by node |
| read | Current container status |
| read | Container configuration |
| read | List all snapshots |
| lifecycle | Start a container |
| lifecycle | Force-stop a container |
| lifecycle | Graceful shutdown with timeout |
| lifecycle | Reboot a container |
| lifecycle | Create a snapshot |
| all | Delete a snapshot |
| all | Rollback to a snapshot |
Storage (2)
Tool | Description |
| Storage pools with usage, optionally filter by node |
| Contents of a storage pool (ISOs, backups, images, templates) |
Cluster (4)
Tool | Description |
| Cluster health, quorum, node membership |
| All resources (VMs, containers, storage, nodes) |
| Configured backup jobs |
| Next available VM/container ID |
Architecture
src/proxmox_mcp/
├── server.py # FastMCP instance + entry point
├── config.py # Pydantic Settings (PROXMOX_ prefix)
├── client.py # Proxmoxer connection via lifespan
└── tools/ # nodes, vms, containers, storage, clusterRead-only by default — elevated tools gated by
PROXMOX_RISK_LEVELSingle connection — Proxmoxer client created once at startup, shared via lifespan
Raw JSON output — no formatting; LLM consumes data directly
Development
Run standalone (testing)
export PROXMOX_HOST=192.168.1.100
export PROXMOX_USER=root@pam
export PROXMOX_TOKEN_NAME=mcp
export PROXMOX_TOKEN_VALUE=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
docker run -i --rm \
-e PROXMOX_HOST -e PROXMOX_USER \
-e PROXMOX_TOKEN_NAME -e PROXMOX_TOKEN_VALUE \
ghcr.io/akmalovaa/proxmox-mcp:latestWithout Docker (UV)
git clone https://github.com/akmalovaa/proxmox-mcp.git && cd proxmox-mcp && uv syncMCP client config:
{
"mcpServers": {
"proxmox": {
"command": "uv",
"args": ["run", "--directory", "/path/to/proxmox-mcp", "proxmox-mcp"],
"env": {
"PROXMOX_HOST": "192.168.1.100",
"PROXMOX_TOKEN_NAME": "mcp",
"PROXMOX_TOKEN_VALUE": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}Build from source
git clone https://github.com/akmalovaa/proxmox-mcp.git
cd proxmox-mcp
docker build -t proxmox-mcp .License
MIT
Maintenance
Latest Blog Posts
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/akmalovaa/proxmox-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server