loading…
Search for a command to run...
loading…
Enables interaction with Proxmox VE for managing VMs, containers, storage, and cluster resources via natural language through the Model Context Protocol.
Enables interaction with Proxmox VE for managing VMs, containers, storage, and cluster resources via natural language through the Model Context Protocol.

Python uv MCP License: MIT PRs Welcome
A Model Context Protocol (MCP) server for interacting with Proxmox Virtual Environment API. This server provides comprehensive tools for managing VMs, containers, storage, and cluster resources through the MCP interface.
Built with Python and uv for fast, reliable dependency management.
This server implements the A2A protocol for seamless agent-to-agent communication. The included agent-card.json file provides:
Use Cases:
See the A2A Protocol Documentation section below for integration details.
# 1. Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. Run setup script
chmod +x setup.sh
./setup.sh
# 3. Set environment variables
export PROXMOX_HOST="192.168.1.100"
export PROXMOX_USER="root@pam"
export PROXMOX_TOKEN_NAME="automation"
export PROXMOX_TOKEN_VALUE="your-token-here"
# 4. Test connection
./test-connection.sh
# 5. Configure Claude Desktop and restart
See QUICKSTART.md for detailed instructions.
uv package manager# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone or download this repository
cd proxmox-mcp-server
# Run setup script (creates structure and installs dependencies)
./setup.sh
# Or manually:
mkdir -p src/proxmox_mcp_server
# Place server.py and __init__.py in src/proxmox_mcp_server/
uv sync
The server is configured via environment variables:
PROXMOX_HOST: Proxmox server hostname or IP addressPROXMOX_USER: Username (e.g., root@pam, admin@pve)Option 1: API Token (Recommended)
PROXMOX_TOKEN_NAME: API token namePROXMOX_TOKEN_VALUE: API token valueOption 2: Password
PROXMOX_PASSWORD: User passwordPROXMOX_PORT: API port (default: 8006)PROXMOX_VERIFY_SSL: Verify SSL certificates (default: false)Example token format:
PROXMOX_TOKEN_NAME=automation
PROXMOX_TOKEN_VALUE=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
The full token identifier will be: root@pam!automation
Simply set your user password:
export PROXMOX_PASSWORD=yourpassword
Add to your Claude Desktop configuration file:
MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"proxmox": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/proxmox-mcp-server",
"run",
"proxmox-mcp-server"
],
"env": {
"PROXMOX_HOST": "192.168.1.100",
"PROXMOX_USER": "root@pam",
"PROXMOX_TOKEN_NAME": "automation",
"PROXMOX_TOKEN_VALUE": "your-token-value-here"
}
}
}
}
{
"mcpServers": {
"proxmox": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/proxmox-mcp-server",
"run",
"proxmox-mcp-server"
],
"env": {
"PROXMOX_HOST": "192.168.1.100",
"PROXMOX_USER": "root@pam",
"PROXMOX_PASSWORD": "your-password-here"
}
}
}
}
Important: Use the absolute path to your project directory!
Once configured, you can ask Claude to interact with your Proxmox environment:
"Can you list all VMs in my Proxmox cluster?"
"What's the status of VM 100 on node pve1?"
"Start VM 105 on node pve1"
"Create a snapshot called 'backup-2025' for VM 100 on pve1"
"Show me the storage usage on all nodes"
"List all running tasks in the cluster"
# Install dependencies
uv sync
# Run the server directly
uv run proxmox-mcp-server
# Run with custom environment
PROXMOX_HOST=192.168.1.100 \
PROXMOX_USER=root@pam \
PROXMOX_TOKEN_NAME=automation \
PROXMOX_TOKEN_VALUE=your-token \
uv run proxmox-mcp-server
# Install development dependencies
uv sync --all-extras
# Run tests (if implemented)
uv run pytest
proxmox-mcp-server/
├── src/
│ └── proxmox_mcp_server/
│ ├── __init__.py # Package initialization
│ └── server.py # Main server implementation
├── pyproject.toml # Project configuration
├── uv.lock # Locked dependencies (generated)
├── .env.example # Environment variable template
├── .gitignore # Git ignore patterns
├── setup.sh # Automated setup script
├── test-connection.sh # Connection test script
├── README.md # This file
├── QUICKSTART.md # 5-minute setup guide
├── SETUP.md # Detailed setup guide
└── USAGE.md # Usage examples
PROXMOX_VERIFY_SSL=true in production environments with valid SSL certificatesPROXMOX_HOST and PROXMOX_PORT are correctcurl -k https://YOUR_HOST:8006/api2/json/versionVM.Monitor, VM.Audit, Datastore.Audit, Sys.Audit, VM.PowerMgmt, VM.SnapshotTo see detailed logs, check stderr output when running the server. The server logs authentication method and connection status to stderr (visible in Claude Desktop logs).
Before configuring Claude, test your Proxmox connection:
# Set environment variables
export PROXMOX_HOST="192.168.1.100"
export PROXMOX_USER="root@pam"
export PROXMOX_TOKEN_NAME="automation"
export PROXMOX_TOKEN_VALUE="your-token-here"
# Run test script
./test-connection.sh
The script will verify:
This Proxmox MCP server implements the Agent-to-Agent (A2A) protocol, enabling AI agents to discover, communicate with, and orchestrate infrastructure management tasks autonomously.
The agent-card.json file serves as the agent's identity and capability manifest. It provides:
Location: /agent-card.json (repository root)
Contents:
The agent provides 20 tools organized into 6 skill categories:
list_nodes - List all cluster nodesget_node_status - Get node resource usage and statuslist_vms - List VMs (node-specific or cluster-wide)get_vm_config - Get VM configurationget_vm_status - Get VM status and metricsstart_vm - Start a VMstop_vm - Force stop a VMshutdown_vm - Gracefully shutdown a VMreboot_vm - Reboot a VMcreate_vm_snapshot - Create VM snapshotlist_vm_snapshots - List VM snapshotsdelete_vm_snapshot - Delete VM snapshotlist_containers - List LXC containersget_container_status - Get container statusstart_container - Start containerstop_container - Stop containerlist_storage - List storage devicesget_storage_status - Get storage usage and capacitylist_tasks - List running and recent tasksget_task_status - Get task progress and statusget_cluster_status - Get overall cluster status and resourcesOther agents can discover this agent's capabilities by reading the agent card:
import json
# Load agent card
with open('agent-card.json') as f:
agent_card = json.load(f)
# Discover capabilities
print(f"Agent: {agent_card['name']}")
print(f"Version: {agent_card['version']}")
print(f"Skills: {len(agent_card['skills'])} categories")
# List available skills
for skill in agent_card['skills']:
print(f"\n{skill['category']}:")
for capability in skill['capabilities']:
print(f" - {capability['name']}: {capability['description']}")
Agents can programmatically configure authentication:
# API Token (recommended)
env_config = {
"PROXMOX_HOST": "192.168.1.100",
"PROXMOX_USER": "root@pam",
"PROXMOX_TOKEN_NAME": "automation",
"PROXMOX_TOKEN_VALUE": "your-token-value"
}
# Or Password-based
env_config = {
"PROXMOX_HOST": "192.168.1.100",
"PROXMOX_USER": "root@pam",
"PROXMOX_PASSWORD": "your-password"
}
Agents communicate via MCP protocol:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
# Connect to the agent
server_params = StdioServerParameters(
command="uv",
args=["--directory", "/path/to/proxmox-mcp-server", "run", "proxmox-mcp-server"],
env=env_config
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# Initialize session
await session.initialize()
# List available tools
tools = await session.list_tools()
# Call a tool
result = await session.call_tool("list_vms", arguments={})
print(result.content)
Example workflow with multiple agents:
# Agent orchestration: VM backup workflow
async def backup_workflow():
# 1. Proxmox agent: List VMs
vms = await proxmox_agent.call_tool("list_vms", {})
# 2. Proxmox agent: Create snapshots for each VM
for vm in vms['data']:
snapshot_name = f"backup-{datetime.now().strftime('%Y%m%d-%H%M%S')}"
await proxmox_agent.call_tool("create_vm_snapshot", {
"node": vm['node'],
"vmid": vm['vmid'],
"snapname": snapshot_name
})
# 3. Storage agent: Verify backup storage capacity
storage_status = await storage_agent.call_tool("check_capacity", {})
# 4. Notification agent: Send completion report
await notification_agent.call_tool("send_alert", {
"message": f"Backup completed: {len(vms['data'])} VMs"
})
For AI Agents:
For Orchestration Systems:
# Monitoring agent that uses Proxmox agent skills
async def monitor_infrastructure():
# Get cluster status
cluster = await proxmox_agent.call_tool("get_cluster_status", {})
# Get all nodes
nodes = await proxmox_agent.call_tool("list_nodes", {})
# Check each node's status
for node in nodes['data']:
status = await proxmox_agent.call_tool("get_node_status", {
"node": node['node']
})
# Alert if resource usage is high
if status['data']['cpu'] > 0.9:
await alert_agent.send_alert(f"High CPU on {node['node']}")
# Auto-scaling agent that manages VM capacity
async def autoscale_vms():
# Get current VM statuses
vms = await proxmox_agent.call_tool("list_vms", {})
# Analyze load across VMs
for vm in vms['data']:
status = await proxmox_agent.call_tool("get_vm_status", {
"node": vm['node'],
"vmid": vm['vmid']
})
# Scale based on metrics
if needs_scaling(status):
await proxmox_agent.call_tool("start_vm", {
"node": "pve2",
"vmid": get_next_vm_id()
})
# DR agent that coordinates backup and recovery
async def disaster_recovery():
# Take snapshots of all critical VMs
critical_vms = [100, 101, 102]
for vmid in critical_vms:
# Find which node hosts the VM
vms = await proxmox_agent.call_tool("list_vms", {})
vm = next(v for v in vms['data'] if v['vmid'] == vmid)
# Create snapshot
await proxmox_agent.call_tool("create_vm_snapshot", {
"node": vm['node'],
"vmid": vmid,
"snapname": f"dr-{datetime.now().isoformat()}"
})
# Verify snapshot
snapshots = await proxmox_agent.call_tool("list_vm_snapshots", {
"node": vm['node'],
"vmid": vmid
})
For more information about the Proxmox VE API:
Future enhancements may include:
Contributions are welcome! Please feel free to submit issues or pull requests.
Areas for improvement:
MIT
If you encounter issues:
Check the documentation files:
Test your connection with ./test-connection.sh
Check Claude Desktop logs for errors
Verify Proxmox server logs: /var/log/pve/
Review Proxmox API documentation
This project uses:
Ready to get started? → See QUICKSTART.md
Need detailed setup? → See SETUP.md
Want examples? → Check USAGE.md
Run in your terminal:
claude mcp add proxmox-mcp-server -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.