🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@samik081/mcp-pve

Package Overview
Dependencies
Maintainers
1
Versions
21
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@samik081/mcp-pve

Manage Proxmox VE through AI assistants

latest
Source
npmnpm
Version
0.7.0
Version published
Maintainers
1
Created
Source

npm version Docker image License: MIT Node.js Version

MCP PVE

MCP server for Proxmox VE. Manage virtual machines, containers, storage, networking, and clusters through natural language in Cursor, Claude Code, and Claude Desktop.

Features

  • 117 tools across 12 categories covering the Proxmox VE REST API
  • Three access tiers (read-only, read-execute, full) for granular control
  • Category filtering via PVE_CATEGORIES to expose only the tools you need
  • Zero HTTP dependencies -- uses native fetch (Node 18+)
  • Self-signed cert support via PVE_VERIFY_SSL=false
  • Docker images for linux/amd64 and linux/arm64 on GHCR
  • Remote MCP via HTTP transport (MCP_TRANSPORT=http) using the Streamable HTTP protocol
  • TypeScript/ESM with full type safety

API Compatibility

Tested with Proxmox VE 9.2.4.

Quick Start

Run the server directly with npx:

PVE_BASE_URL="https://pve.example.com:8006" \
PVE_TOKEN_ID="root@pam!mcp" \
PVE_TOKEN_SECRET="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
npx -y @samik081/mcp-pve

The server validates your PVE connection on startup and fails immediately with a clear error if credentials are missing or invalid.

Docker

Run with Docker (stdio transport, same as npx):

docker run --rm -i \
  -e PVE_BASE_URL=https://pve.example.com:8006 \
  -e PVE_TOKEN_ID=root@pam!mcp \
  -e PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  -e PVE_VERIFY_SSL=false \
  ghcr.io/samik081/mcp-pve

To run as a remote MCP server with HTTP transport:

docker run -d -p 3000:3000 \
  -e MCP_TRANSPORT=http \
  -e PVE_BASE_URL=https://pve.example.com:8006 \
  -e PVE_TOKEN_ID=root@pam!mcp \
  -e PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  -e PVE_VERIFY_SSL=false \
  ghcr.io/samik081/mcp-pve

The MCP endpoint is available at http://localhost:3000 and a health check at http://localhost:3000/health.

Configuration

Claude Code CLI (recommended):

# Using npx
claude mcp add --transport stdio pve \
  --env PVE_BASE_URL=https://pve.example.com:8006 \
  --env PVE_TOKEN_ID=root@pam!mcp \
  --env PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  --env PVE_VERIFY_SSL=false \
  -- npx -y @samik081/mcp-pve

# Using Docker
claude mcp add --transport stdio pve \
  --env PVE_BASE_URL=https://pve.example.com:8006 \
  --env PVE_TOKEN_ID=root@pam!mcp \
  --env PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
  --env PVE_VERIFY_SSL=false \
  -- docker run --rm -i ghcr.io/samik081/mcp-pve

# Using remote HTTP (connect to a running Docker container or HTTP server)
claude mcp add --transport http pve http://localhost:3000

JSON config (works with Claude Code .mcp.json, Claude Desktop claude_desktop_config.json, Cursor .cursor/mcp.json):

{
  "mcpServers": {
    "pve": {
      "command": "npx",
      "args": ["-y", "@samik081/mcp-pve"],
      "env": {
        "PVE_BASE_URL": "https://pve.example.com:8006",
        "PVE_TOKEN_ID": "root@pam!mcp",
        "PVE_TOKEN_SECRET": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "PVE_VERIFY_SSL": "false"
      }
    }
  }
}

Docker (stdio):

{
  "mcpServers": {
    "pve": {
      "command": "docker",
      "args": ["run", "--rm", "-i",
        "-e", "PVE_BASE_URL=https://pve.example.com:8006",
        "-e", "PVE_TOKEN_ID=root@pam!mcp",
        "-e", "PVE_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "-e", "PVE_VERIFY_SSL=false",
        "ghcr.io/samik081/mcp-pve"
      ]
    }
  }
}

Remote MCP (connect to a running Docker container or HTTP server):

{
  "mcpServers": {
    "pve": {
      "type": "streamable-http",
      "url": "http://localhost:3000"
    }
  }
}

Access Tiers

Control which tools are available using the PVE_ACCESS_TIER environment variable:

TierToolsDescription
full (default)117Read, execute, and write -- full control
read-execute75Read and execute -- no resource creation/deletion
read-only53Read only -- safe for exploration, no state changes

Tier details:

  • full: All 117 tools. Includes creating/deleting VMs, containers, storage, users, firewall rules, and more.
  • read-execute: 75 tools. All read tools plus power actions (start, stop, migrate), bulk guest actions, OCI image pull, backup execution, and task management.
  • read-only: 53 tools. List, get, status, and log tools only. No state changes.

Tools that are not available in your tier are not registered with the MCP server. They will not appear in your AI tool's tool list, keeping the context clean.

Environment Variables

VariableRequiredDefaultDescription
PVE_BASE_URLYes--URL of your PVE instance (e.g. https://pve:8006)
PVE_TOKEN_IDYes--API token ID (user@realm!tokenname)
PVE_TOKEN_SECRETYes--API token UUID secret
PVE_ACCESS_TIERNofullread-only, read-execute, or full
PVE_CATEGORIESNo(all)Comma-separated category allowlist
PVE_TOOL_BLACKLISTNo(none)Comma-separated list of tool names to exclude (e.g., pve_delete_qemu_vm)
PVE_TOOL_WHITELISTNo(none)Comma-separated list of tool names to force-include, bypassing access tier and category filters
PVE_VERIFY_SSLNotrueSet false for self-signed certs
DEBUGNofalseEnable debug logging to stderr
MCP_TRANSPORTNostdioTransport mode: stdio (default) or http
MCP_PORTNo3000HTTP server port (only used when MCP_TRANSPORT=http)
MCP_HOSTNo0.0.0.0HTTP server bind address (only used when MCP_TRANSPORT=http)
MCP_EXCLUDE_TOOL_TITLESNofalseSet true to omit tool titles from registration (saves tokens)

Create API tokens in the PVE UI under Datacenter > Permissions > API Tokens. Make sure to uncheck "Privilege Separation" if you want the token to inherit the user's full permissions.

Available Categories

nodes, qemu, lxc, storage, cluster, access, pools, network, firewall, backup, tasks, ha

Tools

mcp-pve provides 117 tools organized by category. Each tool's Access column shows the minimum tier required: read-only (available in all tiers), read-execute (requires read-execute or full), or full (requires full tier only). The Hints column shows tool behavior: read-only (no state changes), destructive (modifies existing state), idempotent (same result if called twice).

Nodes (8 tools)
ToolDescriptionAccessHints
pve_list_nodesList all nodes in the clusterread-onlyread-only, idempotent
pve_get_node_statusGet detailed node status (CPU, memory, uptime, load)read-onlyread-only, idempotent
pve_get_node_versionGet PVE version info for a noderead-onlyread-only, idempotent
pve_get_node_dnsGet DNS settings for a noderead-onlyread-only, idempotent
pve_get_node_timeGet time and timezone info for a noderead-onlyread-only, idempotent
pve_get_node_syslogGet system log entries from a noderead-onlyread-only, idempotent
pve_list_node_servicesList all system services on a noderead-onlyread-only, idempotent
pve_manage_node_serviceStart, stop, restart, or reload a node serviceread-executedestructive
QEMU Virtual Machines (20 tools)
ToolDescriptionAccessHints
pve_list_qemu_vmsList all QEMU VMs on a noderead-onlyread-only, idempotent
pve_get_qemu_statusGet current VM status (CPU, memory, disk, network)read-onlyread-only, idempotent
pve_get_qemu_configGet VM configurationread-onlyread-only, idempotent
pve_get_qemu_rrddataGet RRD statistics over a time periodread-onlyread-only, idempotent
pve_list_qemu_snapshotsList all VM snapshotsread-onlyread-only, idempotent
pve_start_qemu_vmStart a VMread-executedestructive
pve_stop_qemu_vmStop a VM (immediate)read-executedestructive
pve_shutdown_qemu_vmGracefully shut down a VMread-executedestructive
pve_reboot_qemu_vmReboot a VMread-executedestructive
pve_suspend_qemu_vmSuspend a VMread-executedestructive
pve_resume_qemu_vmResume a suspended VMread-executedestructive
pve_reset_qemu_vmReset a VM (hard)read-executedestructive
pve_migrate_qemu_vmMigrate a VM to another noderead-executedestructive
pve_create_qemu_vmCreate a new VMfull
pve_delete_qemu_vmDelete a VM and all its datafulldestructive
pve_update_qemu_configUpdate VM configurationfulldestructive, idempotent
pve_clone_qemu_vmClone a VMfull
pve_create_qemu_snapshotCreate a VM snapshotfull
pve_delete_qemu_snapshotDelete a VM snapshotfulldestructive
pve_rollback_qemu_snapshotRollback a VM to a snapshotfulldestructive, idempotent
LXC Containers (18 tools)
ToolDescriptionAccessHints
pve_list_lxc_containersList all LXC containers on a noderead-onlyread-only, idempotent
pve_get_lxc_statusGet current container statusread-onlyread-only, idempotent
pve_get_lxc_configGet container configurationread-onlyread-only, idempotent
pve_get_lxc_rrddataGet RRD statistics over a time periodread-onlyread-only, idempotent
pve_list_lxc_snapshotsList all container snapshotsread-onlyread-only, idempotent
pve_start_lxc_containerStart a containerread-executedestructive
pve_stop_lxc_containerStop a container (immediate)read-executedestructive
pve_shutdown_lxc_containerGracefully shut down a containerread-executedestructive
pve_reboot_lxc_containerReboot a containerread-executedestructive
pve_suspend_lxc_containerSuspend (freeze) a containerread-executedestructive
pve_resume_lxc_containerResume (unfreeze) a containerread-executedestructive
pve_create_lxc_containerCreate a new containerfull
pve_delete_lxc_containerDelete a container and all its datafulldestructive
pve_update_lxc_configUpdate container configurationfulldestructive, idempotent
pve_clone_lxc_containerClone a containerfull
pve_create_lxc_snapshotCreate a container snapshotfull
pve_delete_lxc_snapshotDelete a container snapshotfulldestructive
pve_rollback_lxc_snapshotRollback a container to a snapshotfulldestructive, idempotent
Storage (9 tools)
ToolDescriptionAccessHints
pve_list_storageList all configured storage backendsread-onlyread-only, idempotent
pve_get_storage_configGet storage backend configurationread-onlyread-only, idempotent
pve_list_node_storageList available storage on a node with usage inforead-onlyread-only, idempotent
pve_get_storage_statusGet storage status and usage on a noderead-onlyread-only, idempotent
pve_list_storage_contentList storage content (images, ISOs, backups)read-onlyread-only, idempotent
pve_pull_oci_imagePull an OCI container image into a storage's template cache (PVE 9.1+)read-execute
pve_create_storageCreate a new storage backendfull
pve_update_storageUpdate storage configurationfulldestructive, idempotent
pve_delete_storageDelete a storage backendfulldestructive
Cluster (13 tools)
ToolDescriptionAccessHints
pve_get_cluster_statusGet cluster status (membership, quorum)read-onlyread-only, idempotent
pve_list_cluster_resourcesList all cluster resources with optional type filterread-onlyread-only, idempotent
pve_get_next_vmidGet the next available VMIDread-onlyread-only, idempotent
pve_get_cluster_logGet recent cluster log entriesread-onlyread-only, idempotent
pve_get_cluster_optionsGet datacenter optionsread-onlyread-only, idempotent
pve_list_cluster_backup_infoList guests not covered by backup jobsread-onlyread-only, idempotent
pve_get_cluster_ha_statusGet HA manager statusread-onlyread-only, idempotent
pve_list_cluster_replicationList all replication jobsread-onlyread-only, idempotent
pve_bulk_start_guestsBulk start VMs/containers cluster-wide (PVE 9.1+)read-executedestructive
pve_bulk_shutdown_guestsBulk shutdown VMs/containers cluster-wide (PVE 9.1+)read-executedestructive
pve_bulk_suspend_guestsBulk suspend VMs cluster-wide (PVE 9.1+)read-executedestructive
pve_bulk_migrate_guestsBulk migrate VMs/containers to a target node (PVE 9.1+)read-executedestructive
pve_update_cluster_optionsUpdate datacenter optionsfulldestructive, idempotent
Access Control (10 tools)
ToolDescriptionAccessHints
pve_list_usersList all usersread-onlyread-only, idempotent
pve_get_userGet user detailsread-onlyread-only, idempotent
pve_list_rolesList all roles and privilegesread-onlyread-only, idempotent
pve_list_groupsList all user groupsread-onlyread-only, idempotent
pve_list_aclsList all ACL entriesread-onlyread-only, idempotent
pve_list_domainsList authentication domains/realmsread-onlyread-only, idempotent
pve_create_userCreate a new userfull
pve_update_userUpdate user propertiesfulldestructive, idempotent
pve_delete_userDelete a userfulldestructive
pve_update_aclGrant or revoke ACL permissionsfulldestructive, idempotent
Pools (5 tools)
ToolDescriptionAccessHints
pve_list_poolsList all resource poolsread-onlyread-only, idempotent
pve_get_poolGet pool details and membersread-onlyread-only, idempotent
pve_create_poolCreate a resource poolfull
pve_update_poolUpdate pool members and settingsfulldestructive, idempotent
pve_delete_poolDelete a resource poolfulldestructive
Network (5 tools)
ToolDescriptionAccessHints
pve_list_networksList all network interfaces on a noderead-onlyread-only, idempotent
pve_get_networkGet network interface configurationread-onlyread-only, idempotent
pve_create_networkCreate a network interfacefull
pve_update_networkUpdate network interface configurationfulldestructive, idempotent
pve_delete_networkDelete a network interfacefulldestructive
Firewall (8 tools)
ToolDescriptionAccessHints
pve_get_firewall_optionsGet cluster firewall optionsread-onlyread-only, idempotent
pve_list_firewall_rulesList cluster firewall rulesread-onlyread-only, idempotent
pve_list_firewall_aliasesList firewall aliasesread-onlyread-only, idempotent
pve_list_firewall_ipsetsList firewall IP setsread-onlyread-only, idempotent
pve_update_firewall_optionsUpdate cluster firewall optionsfulldestructive, idempotent
pve_create_firewall_ruleCreate a firewall rulefull
pve_update_firewall_ruleUpdate a firewall rulefulldestructive, idempotent
pve_delete_firewall_ruleDelete a firewall rulefulldestructive
Backup (5 tools)
ToolDescriptionAccessHints
pve_list_backup_jobsList all scheduled backup jobsread-onlyread-only, idempotent
pve_get_backup_jobGet backup job configurationread-onlyread-only, idempotent
pve_run_backupRun an immediate backup (vzdump)read-execute
pve_create_backup_jobCreate a scheduled backup jobfull
pve_delete_backup_jobDelete a scheduled backup jobfulldestructive
Tasks (4 tools)
ToolDescriptionAccessHints
pve_list_tasksList recent tasks on a noderead-onlyread-only, idempotent
pve_get_task_statusGet task status by UPIDread-onlyread-only, idempotent
pve_get_task_logGet task log output by UPIDread-onlyread-only, idempotent
pve_stop_taskStop a running taskread-executedestructive
High Availability (12 tools)
ToolDescriptionAccessHints
pve_list_ha_resourcesList all HA-managed resourcesread-onlyread-only, idempotent
pve_get_ha_resourceGet HA configuration for a resourceread-onlyread-only, idempotent
pve_list_ha_rulesList HA rules (node/resource affinity)read-onlyread-only, idempotent
pve_get_ha_ruleGet HA rule configurationread-onlyread-only, idempotent
pve_create_ha_resourceAdd a VM/container to HA managementfull
pve_update_ha_resourceUpdate HA resource configurationfulldestructive, idempotent
pve_delete_ha_resourceRemove a resource from HA managementfulldestructive
pve_create_ha_ruleCreate an HA rulefull
pve_update_ha_ruleUpdate an HA rulefulldestructive, idempotent
pve_delete_ha_ruleDelete an HA rulefulldestructive
pve_disarm_haDisarm the HA stack for maintenance (PVE 9.2+)fulldestructive, idempotent
pve_arm_haRe-arm the HA stack (PVE 9.2+)fulldestructive, idempotent

Note: HA groups are deprecated in PVE 9 in favor of HA rules. The per-service group field was removed from HA status output in PVE 9.1.

Verify It Works

After configuring your MCP client, ask your AI assistant:

"What nodes are in my Proxmox cluster?"

If the connection is working, the assistant will call pve_list_nodes and return your nodes with their current status.

Usage Examples

Once configured, ask your AI tool questions in natural language:

  • "List all VMs on node pve1" -- calls pve_list_qemu_vms to show VMs with their status, CPU, and memory usage.

  • "What's the status of VM 100?" -- calls pve_get_qemu_status to show real-time resource utilization.

  • "Start container 200 on pve1" -- calls pve_start_lxc_container to start the container and returns the task UPID.

  • "Create a snapshot of VM 100 called pre-upgrade" -- calls pve_create_qemu_snapshot to create a snapshot before changes.

  • "Show me the cluster resources" -- calls pve_list_cluster_resources to show all VMs, containers, storage, and nodes.

  • "Migrate VM 100 to node pve2" -- calls pve_migrate_qemu_vm to live-migrate the VM to another node.

  • "Shut down VMs 103, 104 and 105 in parallel" -- calls pve_bulk_shutdown_guests to shut down multiple guests cluster-wide in a single request.

Troubleshooting

Connection refused / ECONNREFUSED

Check that PVE_BASE_URL is correct and includes the port (default: 8006). Ensure the PVE host is reachable from where the MCP server is running.

SSL certificate errors

If your PVE instance uses a self-signed certificate, set PVE_VERIFY_SSL=false. This disables TLS verification for all requests.

Tools not showing up

Check your access tier setting. In read-only mode, only 53 tools are registered. In read-execute mode, 75 tools are registered. Use full (or omit PVE_ACCESS_TIER) for all 117 tools. Check PVE_CATEGORIES -- only tools in listed categories are registered. Also verify the server started without errors by checking stderr output.

Development

# Install dependencies
npm install

# Build the project
npm run build

# Run in development mode (auto-reload)
npm run dev

# Open the MCP Inspector for interactive testing
npm run inspect

License

MIT

Keywords

proxmox

FAQs

Package last updated on 15 Jul 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts