list_nodes
List all nodes in the Proxmox cluster with status, CPU, memory, and uptime.
Takes no parameters.

io.github.felhen-aiPublished by GitHub account felhen-aiv1.2.4Updated Nov 4, 2026
Manage Proxmox VE clusters through AI assistants — VMs, containers, and more
Manages a Proxmox VE cluster from an AI assistant: list nodes, VMs and containers, control power, snapshots, backups, storage, firewall and migration.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
MCP server for managing Proxmox VE clusters through AI assistants like Claude, Cursor, and Cline.
Provision, manage, and monitor your entire Proxmox infrastructure through natural language. Create VMs and containers, manage snapshots, browse storage, and more.
Set these environment variables (or create a .env file):
Optional:
VM.Audit — read VM/CT status and configVM.PowerMgmt — start/stop/shutdown/rebootVM.Snapshot — create/rollback/delete snapshotsVM.Allocate — create/delete/clone VMs and containersVM.Clone — clone operationsDatastore.Audit — list storages and browse contentDatastore.AllocateSpace — allocate disk space for new VMs/CTsSys.Audit — read node status and tasksVM.Config.Disk — resize disksVM.Config.CPU — change CPU allocationVM.Config.Memory — change memory allocationVM.Monitor — access QEMU monitor (for metrics)VM.Console — console interaction tools (screenshots, keyboard input)VM.Migrate — migrate VMs/CTs between nodesSys.Modify — manage firewall rulesVM.Config.Cloudinit — configure cloud-init parametersAdd to ~/.claude/claude_desktop_config.json:
Add to .claude/settings.json or ~/.claude/settings.json:
Add to Cursor Settings > MCP with the same configuration as above.
Note:
exec_commandrequiresqemu-guest-agentinstalled and running inside the VM. Not supported for LXC containers (Proxmox API limitation).
Note: Console tools do not require
qemu-guest-agentand need only theVM.Consoleprivilege.vm_screenshotopens the same VNC websocket tunnel the Proxmox web UI uses (RFB 3.8 with DES-based VNC auth) and is implemented in pure stdlib (custom WebSocket client + DES). Only QEMU VMs are supported. Text entry is layout-dependent:vm_send_textmaps ASCII to a US keyboard layout (Shift-mapping for uppercase and symbols); non-ASCII input (e.g. Cyrillic) is not supported by the sendkey protocol.
Destructive operations (stop_guest, reboot_guest, rollback_snapshot, delete_snapshot, delete_guest, resize_guest, restore_backup, delete_firewall_rule, migrate_guest, create_template) require explicit confirm=true. The first call returns a warning describing the impact; only a second call with confirmation executes the action.
Once connected, you can ask your AI assistant:
Missing required environment variablesThis error means one or more required connection settings are not available to the server process. Copy .env.example to .env, then set PROXMOX_HOST, PROXMOX_TOKEN_ID, and PROXMOX_TOKEN_SECRET. If you configure an MCP client directly, make sure the same variables are present in that client's env block.
403 Permission check failedA 403 usually means the API token is valid but does not have enough Proxmox privileges for the requested operation. Revisit Creating a Proxmox API Token and either uncheck "Privilege Separation" for full access or assign the specific privileges listed there, such as VM.Audit, VM.PowerMgmt, VM.Snapshot, or storage permissions for datastore operations.
exec_command fails for guest-agent or LXC reasonsexec_command only works for QEMU VMs with qemu-guest-agent installed and running inside the guest. If the tool reports that the QEMU guest agent is not responding, start or install the agent in the VM and retry. LXC containers are not supported by this Proxmox API path, so use another container access method instead.
ModuleNotFoundError: No module named 'mcp.server.fastmcp'The MCP Python SDK 2.0 removed the mcp.server.fastmcp module that mcp-proxmox 1.2.1 and earlier import. Fresh installs (uvx mcp-proxmox, uv tool install, pip install) resolved mcp 2.x and failed on startup — in Claude Desktop this only shows up as "Server disconnected". Upgrade to mcp-proxmox 1.2.2 or later, which pins mcp<2. If you must stay on an older mcp-proxmox, constrain the SDK yourself: uvx --with "mcp<2" mcp-proxmox.
Proxmox commonly runs on port 8006, so check that PROXMOX_HOST and PROXMOX_PORT point to the same endpoint you use for the Proxmox web UI. For homelab clusters with self-signed certificates, leave PROXMOX_VERIFY_SSL=false or set it explicitly. Use PROXMOX_VERIFY_SSL=true only when the Proxmox certificate chains to a CA trusted by your runtime.
MIT
The canonical repository is https://github.com/felhen-ai/mcp-proxmox. Existing GitHub clone and issue URLs redirect to this repository. Do not recreate a repository at the old address, which would remove those redirects.
The canonical MCP Registry identifier is io.github.felhen-ai/mcp-proxmox. The legacy identifier io.github.antonio-mello-ai/mcp-proxmox remains supported with a separate server.legacy.json manifest. Both identifiers install the same mcp-proxmox package from PyPI, and the package name and CLI command remain unchanged. Keep both ownership markers in this README so future releases can be registered under either identifier.
New Docker publications use ghcr.io/felhen-ai/mcp-proxmox. Existing images and tags at ghcr.io/antonio-mello-ai/mcp-proxmox are retained for compatibility; they are not deleted or silently replaced. The legacy Glama badge above remains a discovery link until that directory migrates its entry.
Source: README.md at commit e440334
List all nodes in the Proxmox cluster with status, CPU, memory, and uptime.
Takes no parameters.
Get detailed status for a specific node including CPU model, memory, disk, and versions. Args: node: Name of the Proxmox node (e.g. 'pve', 'node1').
noderequiredList all QEMU virtual machines across the cluster. Args: node: Optional. Filter by node name. status: Optional. Filter by status ('running', 'stopped').
nodestatusList all LXC containers across the cluster. Args: node: Optional. Filter by node name. status: Optional. Filter by status ('running', 'stopped').
nodestatusGet detailed status of a VM or container by VMID. Auto-detects type and node. Args: vmid: The numeric ID of the VM or container (e.g. 100, 200).
vmidrequiredStart a stopped VM or container. Args: vmid: The numeric ID of the VM or container to start.
vmidrequiredForce-stop a running VM or container. WARNING: May cause data loss. Args: vmid: The numeric ID of the VM or container to stop. confirm: Must be true to execute. First call without confirm shows a warning.
vmidrequiredconfirmGracefully shut down a VM or container via ACPI signal (VMs) or init (containers). Args: vmid: The numeric ID of the VM or container to shut down.
vmidrequiredReboot a running VM or container. Args: vmid: The numeric ID of the VM or container to reboot. confirm: Must be true to execute. First call without confirm shows a warning.
vmidrequiredconfirmList all snapshots for a VM or container. Args: vmid: The numeric ID of the VM or container.
vmidrequiredCreate a new snapshot for a VM or container. Args: vmid: The numeric ID of the VM or container. name: Snapshot name (alphanumeric, hyphens, underscores). description: Optional description for the snapshot.
namerequiredvmidrequireddescriptionRollback a VM or container to a previous snapshot. WARNING: All changes since the snapshot will be LOST. Args: vmid: The numeric ID of the VM or container. name: Name of the snapshot to rollback to. confirm: Must be true to execute. First call without confirm shows a warning.
namerequiredvmidrequiredconfirmDelete a snapshot from a VM or container. Args: vmid: The numeric ID of the VM or container. name: Name of the snapshot to delete. confirm: Must be true to execute. First call without confirm shows a warning.
namerequiredvmidrequiredconfirmList storage pools across the cluster with capacity and usage info. Args: node: Optional. Filter by node name.
nodeList content of a storage pool (ISOs, templates, backups, disk images). Args: node: Name of the Proxmox node. storage_name: Name of the storage pool (e.g. 'local', 'local-lvm'). content_type: Optional. Filter by type: 'iso', 'vztmpl', 'backup', 'images', 'rootdir'.
noderequiredcontent_typestorage_namerequiredCreate a new QEMU virtual machine. The VM is created stopped by default. Use start_after_create=true to auto-start. Args: node: Target node name (e.g. 'pve'). name: VM name. cores: Number of CPU cores (default 1). memory: Memory in MB (default 2048). disk_size: Disk size with unit (default '32G'). Examples: '10G', '100G', '1T'. storage_pool: Storage for disk (default 'local-lvm'). iso: Optional ISO volume ID for installation (e.g. 'local:iso/ubuntu-24.04.iso'). os_type: OS type (default 'l26' for Linux). Options: l26, l24, win11, win10, other. net_bridge: Network bridge (default 'vmbr0'). start_after_create: Start VM after creation (default false). vmid: Optional specific VMID. Auto-assigned if not provided.
isonamerequirednoderequiredvmidcoresmemoryos_typedisk_sizenet_bridgestorage_poolstart_after_createCreate a new LXC container from a template. Args: node: Target node name (e.g. 'pve'). name: Container hostname. template: Template volume ID (e.g. 'local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst'). Use list_storage_content with content_type='vztmpl' to find available templates. cores: Number of CPU cores (default 1). memory: Memory in MB (default 512). disk_size: Root disk size in GB (default 8). storage_pool: Storage for rootfs (default 'local-lvm'). net_bridge: Network bridge (default 'vmbr0'). password: Optional root password. ssh_public_keys: Optional SSH public keys for root access. start_after_create: Start container after creation (default false). vmid: Optional specific VMID. Auto-assigned if not provided.
namerequirednoderequiredvmidcoresmemorypasswordtemplaterequireddisk_sizenet_bridgestorage_poolssh_public_keysstart_after_createClone an existing VM or container. Auto-detects type and node. Creates a full (independent) clone by default. Set full_clone=false for a linked clone. Args: vmid: Source VM/container VMID to clone. new_name: Optional name for the clone. target_node: Optional target node for the clone (for cross-node cloning). full_clone: Full clone (true, default) or linked clone (false). target_storage: Optional target storage for the clone's disks. new_vmid: Optional VMID for the clone. Auto-assigned if not provided.
vmidrequirednew_namenew_vmidfull_clonetarget_nodetarget_storagePermanently delete a VM or container. IRREVERSIBLE. The guest must be stopped before deletion. All disk images will be destroyed. Args: vmid: The numeric ID of the VM or container to delete. confirm: Must be true to execute. First call without confirm shows a warning.
vmidrequiredconfirmList backup files across storages. Args: node: Optional. Filter by node name. storage_name: Optional. Filter by storage name. vmid: Optional. Filter by VMID to see backups of a specific guest.
nodevmidstorage_nameCreate a backup (vzdump) of a VM or container. Args: vmid: The numeric ID of the VM or container to back up. storage_name: Target storage for the backup (default 'local'). mode: Backup mode: 'snapshot' (no downtime, default), 'suspend', or 'stop'. compress: Compression: 'zstd' (default), 'lzo', 'gzip', or '0' (none). notes: Optional notes/description for the backup.
modevmidrequirednotescompressstorage_nameRestore a VM or container from a backup file. Args: volid: Volume ID of the backup (e.g. 'local:backup/vzdump-qemu-100-2024_03_04.vma.zst'). Use list_backups to find available backups. node: Target node for the restored guest. vmid: Optional VMID for the restored guest. Auto-assigned if not provided. storage_pool: Storage for restored disks (default 'local-lvm'). guest_type: Type of guest: 'vm' or 'container'. confirm: Must be true to execute. First call without confirm shows a warning.
noderequiredvmidvolidrequiredconfirmguest_typestorage_poolExecute a command inside a QEMU VM via the guest agent. Requires qemu-guest-agent to be installed and running inside the VM. Not supported for LXC containers. Args: vmid: The numeric ID of the VM. command: The command to execute (e.g. 'hostname', 'df -h', 'systemctl status nginx'). timeout: Max seconds to wait for command completion (default 30, max 300).
vmidrequiredcommandrequiredtimeoutCapture a PNG screenshot of a QEMU VM's display. The VM must be running. Returns the screenshot as a PNG image. Use this to see the current state of the VM console (login prompt, GUI, boot messages, installer screens, etc.). Args: vmid: The numeric ID of the QEMU VM.
vmidrequiredSend a key or key combination to a QEMU VM's console. The VM must be running. Key names are human-readable and auto-converted to QEMU Monitor key codes. Use vm_screenshot first to see the console state. Common keys and combos: - 'enter' — Enter key - 'esc' — Escape key - 'tab' — Tab key - 'space' — Space bar - 'backspace' — Backspace - 'up', 'down', 'left', 'right' — Arrow keys - 'f1'-'f12' — Function keys - 'ctrl-alt-delete' — Ctrl+Alt+Del (reboot) - 'ctrl-c' — Ctrl+C - 'win-r' — Win+R (opens Run dialog on Windows) - 'a'-'z', '0'-'9' — Single character keys Args: vmid: The numeric ID of the QEMU VM. key: Key name or hyphen-separated combo (e.g. 'enter', 'ctrl-alt-delete', 'win-r'). confirm: Must be true to send the key to the VM console.
keyrequiredvmidrequiredconfirmType a text string into a QEMU VM's console, character by character. Each character is sent as an individual keypress. Use this to type login credentials, commands, or other text into the VM console. Combine with vm_screenshot to verify the result. Supports printable ASCII characters. Newlines (' ') are sent as Enter. Note: characters requiring Shift (uppercase, symbols like '!', '@') are sent with shift automatically. Args: vmid: The numeric ID of the QEMU VM. text: Text string to type into the VM console (e.g. 'administrator admin '). delay: Delay between keypresses in seconds (default 0.05). confirm: Must be true to type the text into the VM console.
textrequiredvmidrequireddelayconfirmGet resource usage metrics (CPU, memory, network, disk I/O) for a VM or container. Args: vmid: The numeric ID of the VM or container. timeframe: Time range for metrics. Options: 'hour', 'day', 'week', 'month', 'year'.
vmidrequiredtimeframeList recent tasks on a Proxmox node (backups, migrations, snapshots, etc.). Args: node: Name of the Proxmox node. limit: Maximum number of tasks to return (default 20, max 100). status: Optional. Filter by task status ('ok', 'error', 'running').
noderequiredlimitstatusList network interfaces, bridges, and bonds on a Proxmox node. Args: node: Name of the Proxmox node (e.g. 'pve').
noderequiredResize CPU, memory, and/or disk of a VM or container. At least one of cores, memory, or disk_size must be provided. CPU and memory changes take effect on next reboot for running guests. Disk resize is immediate but IRREVERSIBLE (disks can only grow). Args: vmid: The numeric ID of the VM or container. cores: New number of CPU cores. memory: New memory size in MB. disk_size: Disk size change. Use '+10G' to add 10GB, or '50G' for absolute size. Supported units: K, M, G, T. disk: Disk name to resize (default 'scsi0' for VMs, auto-mapped to 'rootfs' for CTs). confirm: Must be true to execute. First call without confirm shows a warning.
diskvmidrequiredcoresmemoryconfirmdisk_sizeList firewall rules. Can target a specific VM/CT, a node, or the cluster. Args: vmid: Optional. List rules for this VM/container. node: Optional. List rules for this node. Ignored if vmid is provided. If neither vmid nor node is provided, lists cluster-level rules.
nodevmidAdd a firewall rule to a VM/CT, node, or cluster. Args: action: Rule action: 'ACCEPT', 'DROP', or 'REJECT'. type_: Rule direction: 'in' (incoming) or 'out' (outgoing). vmid: Optional. Add rule to this VM/container. node: Optional. Add rule to this node. Ignored if vmid is provided. proto: Optional. Protocol: 'tcp', 'udp', 'icmp', etc. dport: Optional. Destination port or range (e.g. '80', '8000-9000', '80,443'). sport: Optional. Source port or range. source: Optional. Source IP/CIDR (e.g. '192.168.1.0/24'). dest: Optional. Destination IP/CIDR. iface: Optional. Network interface (e.g. 'net0'). enable: Enable rule immediately (default true). comment: Optional description for the rule. pos: Optional position in the rule chain (0 = first). If neither vmid nor node is provided, adds a cluster-level rule.
posdestnodevmiddportifaceprotosporttype_requiredactionrequiredenablesource+1 moreDelete a firewall rule by its position number. Use list_firewall_rules first to see rule positions. Args: pos: Position of the rule to delete (from list_firewall_rules output). vmid: Optional. Delete from this VM/container's rules. node: Optional. Delete from this node's rules. Ignored if vmid is provided. confirm: Must be true to execute. First call without confirm shows a warning. If neither vmid nor node is provided, deletes from cluster-level rules.
posrequirednodevmidconfirmLive migrate a VM or container to another node in the cluster. Args: vmid: The numeric ID of the VM or container to migrate. target_node: Name of the destination node (e.g. 'pve2'). online: Live migration (true, default) or offline (false). Online keeps the guest running. confirm: Must be true to execute. First call without confirm shows a warning.
vmidrequiredonlineconfirmtarget_noderequiredList all VM templates available in the cluster for cloning.
Takes no parameters.
Convert a stopped VM into a template. IRREVERSIBLE. Once converted, the VM can no longer be started — it can only be cloned. Args: vmid: The numeric ID of the VM to convert. confirm: Must be true to execute. First call without confirm shows a warning.
vmidrequiredconfirmConfigure cloud-init settings on a VM for automated provisioning. At least one parameter must be provided. Changes take effect on next boot. Args: vmid: The numeric ID of the VM. user: Default user name for cloud-init. password: Password for the default user. ssh_keys: SSH public keys (URL-encoded, newline-separated for multiple keys). ip_config: IP configuration string (e.g. 'ip=dhcp' or 'ip=10.0.0.5/24,gw=10.0.0.1'). nameserver: DNS server IP(s), space-separated. searchdomain: DNS search domain(s), space-separated.
uservmidrequiredpasswordssh_keysip_confignameserversearchdomain90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
# Run directly with uvx (no install needed)uvx mcp-proxmox
# Or install with pippip install mcp-proxmoxPROXMOX_HOST=192.168.1.100 # Your Proxmox VE hostPROXMOX_TOKEN_ID=user@pam!mcp # API token IDPROXMOX_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx # API token secretPROXMOX_PORT=8006 # Default: 8006PROXMOX_VERIFY_SSL=false # Default: false{ "mcpServers": { "proxmox": { "command": "uvx", "args": ["mcp-proxmox"], "env": { "PROXMOX_HOST": "192.168.1.100", "PROXMOX_TOKEN_ID": "user@pam!mcp", "PROXMOX_TOKEN_SECRET": "your-token-secret" } } }}{ "mcpServers": { "proxmox": { "command": "uvx", "args": ["mcp-proxmox"], "env": { "PROXMOX_HOST": "192.168.1.100", "PROXMOX_TOKEN_ID": "user@pam!mcp", "PROXMOX_TOKEN_SECRET": "your-token-secret" } } }}git clone https://github.com/felhen-ai/mcp-proxmox.gitcd mcp-proxmoxpython -m venv .venvsource .venv/bin/activatepip install -e ".[dev]"
# Run testspytest
# Lintruff check src/ tests/ruff format src/ tests/
# Type checkmypy src/