MCP Hub
Back to servers

proxmox-mcp

Minimal MCP server for Proxmox VE — 38 tools for nodes, VMs, LXC, storage, and snapshots. Read-only by default, single Docker image, multi-arch.

glama
Updated
May 2, 2026

Proxmox-mcp

proxmox-mcp — MCP server for Proxmox VE

CI Release License: MIT Python 3.14 GHCR 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:latest and you're done
  • Just env vars — no config files, no database, no state
  • Read-only by default — destructive ops are gated behind an explicit PROXMOX_RISK_LEVEL
  • Tiny 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=read

Reload: 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.

VariableDefaultDescription
PROXMOX_HOSTProxmox host (IP or hostname)
PROXMOX_USERroot@pamAPI user
Authtoken or password — see below
PROXMOX_PORT8006API port
PROXMOX_VERIFY_SSLfalseVerify TLS certificate
PROXMOX_RISK_LEVELreadread / lifecycle / all

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-xxxxxxxxxxxx

Password (fallback):

export PROXMOX_PASSWORD=your-password

Risk levels

PROXMOX_RISK_LEVEL gates destructive operations:

LevelAdds
read (default)read-only tools
lifecycle+ start / stop / reboot / suspend / clone / create-snapshot
all+ delete-snapshot / rollback-snapshot

Every elevated call is logged to stderr (ALLOW / DENY + tool + tier).

Tools

Nodes (7)

ToolDescription
list_nodesList all cluster nodes with status, CPU, memory, uptime
get_node_statusDetailed node metrics (CPU, memory, disk, load, kernel)
get_node_networksNetwork interfaces on a node
get_node_disksPhysical disks on a node
get_node_tasksRecent tasks on a node
get_task_statusStatus of a specific task by UPID
get_task_logLog output from a task

QEMU VMs (14)

ToolTierDescription
list_vmsreadList all VMs, optionally filter by node
get_vm_statusreadCurrent VM status (running/stopped, CPU, memory)
get_vm_configreadVM configuration (hardware, disks, network)
list_vm_snapshotsreadList all snapshots of a VM
start_vmlifecycleStart a VM
stop_vmlifecycleForce-stop a VM
shutdown_vmlifecycleGraceful ACPI shutdown with timeout
reboot_vmlifecycleReboot via ACPI
suspend_vmlifecycleSuspend a VM
resume_vmlifecycleResume a suspended VM
clone_vmlifecycleFull or linked clone
create_vm_snapshotlifecycleCreate a snapshot
delete_vm_snapshotallDelete a snapshot
rollback_vm_snapshotallRollback to a snapshot

LXC Containers (11)

ToolTierDescription
list_containersreadList all LXC containers, optionally filter by node
get_container_statusreadCurrent container status
get_container_configreadContainer configuration
list_container_snapshotsreadList all snapshots
start_containerlifecycleStart a container
stop_containerlifecycleForce-stop a container
shutdown_containerlifecycleGraceful shutdown with timeout
reboot_containerlifecycleReboot a container
create_container_snapshotlifecycleCreate a snapshot
delete_container_snapshotallDelete a snapshot
rollback_container_snapshotallRollback to a snapshot

Storage (2)

ToolDescription
list_storageStorage pools with usage, optionally filter by node
get_storage_contentContents of a storage pool (ISOs, backups, images, templates)

Cluster (4)

ToolDescription
get_cluster_statusCluster health, quorum, node membership
get_cluster_resourcesAll resources (VMs, containers, storage, nodes)
get_cluster_backupsConfigured backup jobs
get_next_vmidNext 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, cluster
  • Read-only by default — elevated tools gated by PROXMOX_RISK_LEVEL
  • Single 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:latest

Without Docker (UV)

git clone https://github.com/akmalovaa/proxmox-mcp.git && cd proxmox-mcp && uv sync

MCP 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

Reviews

No reviews yet

Sign in to write a review