Skip to main content
Glama
mpandudc

Proxmox Homelab FastMCP

by mpandudc

Proxmox Homelab FastMCP

A fast, lightweight Model Context Protocol (MCP) server built with FastMCP to manage Proxmox VE nodes, LXC containers, system services, and Tailscale mesh status directly from AI agent workflows (Hermes, Claude Code, Cursor, Windsurf).

Features

  • 🖥️ Cluster & Node Metrics: Real-time CPU model, cores, RAM usage, swap, load averages, and rootfs storage from Proxmox VE.

  • 📦 LXC Container Lifecycle: Query running/stopped LXCs, inspect detailed CPU/RAM/Disk allocations, and trigger power actions (start, stop, shutdown, reboot).

  • 📸 Automated Snapshots: Create point-in-time container snapshots before migrations or dangerous operations.

  • 🐳 Service & Container Inspection: Check systemd units and docker container health inside any LXC (pct exec).

  • 🌐 Tailscale Mesh Diagnostics: Query node reachability, Tailscale IPs, and peer online status.


Related MCP server: Proxmox MCP Server

Available MCP Tools

Tool Name

Description

proxmox_cluster_status

Returns node specs, CPU load, RAM usage %, and storage availability.

lxc_list

Lists all LXC containers with VMID, name, status, and resource consumption.

lxc_get_info

Retrieves deep config and network details for a specific VMID.

lxc_control_power

Executes start, stop, shutdown, or reboot on an LXC container.

lxc_snapshot_create

Creates a snapshot with custom name and description.

lxc_service_status

Inspects systemd or docker container status inside an LXC.

tailscale_mesh_status

Inspects the local Tailscale mesh network status and peer devices.


Architecture & Requirements

  • Python: >= 3.11

  • FastMCP: >= 0.4.0

  • Pydantic: >= 2.0.0

  • Host Connectivity: Passwordless SSH key authentication from the MCP host to the Proxmox host (pvesh).

Environment Variables

Variable

Default

Description

PROXMOX_HOST

192.168.0.27

Proxmox VE node IP or hostname

PROXMOX_USER

root

SSH user

PROXMOX_SSH_KEY

~/.ssh/id_rsa

Private SSH key path

PROXMOX_NODE

homelab

Proxmox VE node name


Installation & Setup

1. Standalone via uv

git clone https://github.com/mpandudc/proxmox-homelab-mcp.git
cd proxmox-homelab-mcp
uv sync

Run in stdio mode (default):

uv run python -m proxmox_homelab_mcp.server

Or run in SSE transport mode:

uv run python -m proxmox_homelab_mcp.server --transport sse --port 8770

MCP Client Configuration

Hermes Agent (~/.hermes/config.yaml)

mcp_servers:
  proxmox:
    command: /path/to/proxmox-homelab-mcp/.venv/bin/python
    args:
      - -m
      - proxmox_homelab_mcp.server
    env:
      PYTHONPATH: /path/to/proxmox-homelab-mcp/src
      PROXMOX_HOST: "192.168.0.27"
      PROXMOX_USER: "root"
      PROXMOX_NODE: "homelab"
    enabled: true

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "proxmox": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/proxmox-homelab-mcp",
        "run",
        "proxmox-homelab-mcp"
      ],
      "env": {
        "PROXMOX_HOST": "192.168.0.27",
        "PROXMOX_USER": "root",
        "PROXMOX_NODE": "homelab"
      }
    }
  }
}

License

MIT License © 2026 Muhammad Pandu Dwi Cahyo.

Available Tools

7 tools
lxc_control_powerLxc Control PowerA

Manage LXC power lifecycle: 'start', 'stop', 'shutdown', or 'reboot'.

ParametersJSON Schema
NameRequiredDescriptionDefault
vmidYes
actionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It clearly communicates that the tool changes power state, which is the core mutating behavior, but it does not mention side effects like downtime, graceful vs. forced shutdown, or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single tight sentence that leads with the operation and immediately lists all allowed actions. Every word contributes value, and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is relatively simple and the description covers the core action choices, but contextual completeness is limited by missing guidance on vmid semantics, behavioral consequences, and usage versus sibling tools. It is minimally viable but not rich.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It usefully enumerates the valid values for the action parameter, but it does not explain the vmid parameter beyond its name and integer type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as managing LXC power lifecycle and enumerates the four supported actions: start, stop, shutdown, reboot. This is specific enough to distinguish it from read-only siblings like lxc_list and lxc_get_info, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The action list implies the tool should be used when an agent needs to start, stop, shut down, or reboot an LXC container. However, it provides no explicit guidance about when not to use it or how it differs from related tools like lxc_service_status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lxc_get_infoLxc Get InfoA

Get detailed configuration and runtime state for a specific LXC container.

ParametersJSON Schema
NameRequiredDescriptionDefault
vmidYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. 'Get' implies a read-only operation, but the description does not mention permissions, possible errors, or whether runtime state is a live snapshot. It is adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. Every word contributes to defining the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has an output schema to cover return values, and the description states the core purpose. However, given zero schema descriptions and no usage guidance, the definition leaves some gaps around parameter semantics and when to choose this tool over siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the single vmid parameter. It only indirectly suggests vmid identifies a specific LXC container; it does not explain what a valid vmid is, how to obtain it, or any format/range expectations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Get') and resource ('detailed configuration and runtime state') for a specific LXC container identified by vmid. It is readily distinguishable from sibling tools like lxc_list or lxc_service_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is used when you need detailed configuration/runtime state for one specific container, but it does not explicitly state when to prefer it over siblings or when not to use it. No alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lxc_listLxc ListA

List all LXC containers with VMID, name, status (running/stopped), CPU, RAM, and Disk metrics.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden. It conveys that the operation is a read-only listing of all containers and specifies the returned metric categories, which is useful. However, it does not disclose potential large-response behavior, pagination, error conditions, or that the call may be expensive when many containers exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that states the action, scope, and returned values with no filler. Every word contributes to the agent's ability to understand and invoke the tool correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with an output schema available, the description is nearly complete. It defines the operation, the container scope, and key metrics. It could be slightly stronger with an explicit pointer to lxc_get_info for single-container detail, but that is not essential for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters)Skip, so there are no parameter details to explain. The description's 'List all' reinforces that the tool takes no filtering arguments)Skip, which aligns with the empty schema. Baseline of 4 for no parameters is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('List all LXC containers') and immediately states the exact fields returned (VMID, name, status, CPU, RAM, Disk). The word 'all' and the listing scope distinguish it clearly from sibling tools like lxc_get_info or lxc_control_power.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance about when to use this tool versus alternatives such as lxc_get_info for a single container or lxc_service_status for service-level status. The usage context is only implied by 'List all'; no exclusions or decision rules are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lxc_service_statusLxc Service StatusB

Inspect systemd service or docker container status inside an LXC via pct exec.

ParametersJSON Schema
NameRequiredDescriptionDefault
vmidYes
service_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. The description says it inspects status via pct exec, which implies a read-only operation, but it doesn't explicitly state that it's non-destructive, doesn't require specific permissions, or what happens if the service doesn't exist. It also doesn't mention whether it runs commands inside the container, which could have side effects. The description is minimal and doesn't disclose behavioral traits beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loaded with the action ('Inspect') and the resource ('systemd service or docker container status'). It wastes no words and is easy to parse. It could be slightly more structured by separating the two use cases, but it's appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values are presumably documented there. The description covers the core purpose and the method (pct exec). However, with no annotations and 0% schema description coverage, the description should provide more context about parameter semantics and usage. It's adequate for a simple status-check tool but leaves gaps around parameter meaning and edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the lack of parameter documentation. The description mentions 'systemd service or docker container status' but doesn't explicitly map service_name to either a systemd service or docker container name. It doesn't explain what vmid refers to (LXC ID) or what format service_name should take. The description adds some context but leaves the agent to infer the meaning of both parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: inspecting systemd service or docker container status inside an LXC via pct exec. It names the specific verb 'Inspect' and the resource (systemd service/docker container status inside an LXC). It doesn't explicitly differentiate from siblings, but the sibling names (lxc_list, lxc_get_info, lxc_control_power) suggest this is a distinct status-check operation, and the description is specific enough to avoid confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when you need to check the status of a systemd service or docker container inside an LXC. It doesn't explicitly state when not to use it or name alternatives. The sibling tools like lxc_get_info might overlap in scope (getting info about an LXC), but the description doesn't address that distinction. It's adequate but lacks explicit routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lxc_snapshot_createLxc Snapshot CreateB

Create a point-in-time snapshot of an LXC before deployments or maintenance.

ParametersJSON Schema
NameRequiredDescriptionDefault
vmidYes
snapnameYes
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action ('Create a point-in-time snapshot') without revealing implications like disk usage, reversibility, or effect on the running container. This is a significant gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler words. Every part contributes to the core purpose and usage timing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 parameters, no parameter descriptions, and no annotations, the description is too sparse. It does not explain the required parameters' semantics or operational caveats, leaving the agent to guess critical details needed for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the meaning of vmid, snapname, or description beyond implying the resource is an LXC. It fails to compensate for the complete lack of parameter documentation in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Create a point-in-time snapshot of an LXC'), which is clear and distinct from sibling tools. However, it does not explicitly name or differentiate from alternatives, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'before deployments or maintenance' provides a clear, explicit usage context. It does not mention when not to use it or alternative tools, but the context is sufficient for an agent to infer appropriate timing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

proxmox_cluster_statusProxmox Cluster StatusA

Get high-level host node status: CPU model, cores, RAM usage, swap, loadavg, and uptime.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden. 'Get' clearly indicates a read-only status retrieval, and the field list sets expectations for the kind of data returned. It doesn't discuss auth, rate limits, or failure modes, but for a simple status read these are less critical.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, information-dense sentence with no filler. The main action and resource are front-loaded, and the enumerated fields justify the 'high-level status' claim without verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters Aarhus and the presence of an output schema, the description is complete enough for an agent to invoke the tool correctly. It names the resource, the data categories, and the operation. No invocation prerequisites are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter semantics burden on the description. The schema is already trivially complete, and the description correctly avoids inventing input details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Get high-level host node status' and enumerates exactly which data dimensions are returned (CPU model, cores, RAM, swap, loadavg, uptime). This clearly distinguishes it from the LXC-specific and Tailscale siblings, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'high-level host node status' implies this is the tool for an overall node/cluster overview rather than per-container or mesh details, but it never explicitly states when to use it over lxc_status or other siblings. Usage context is present only implicitly, with no exclusions or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tailscale_mesh_statusTailscale Mesh StatusA

Inspect the local Tailscale mesh network status and peer devices.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. The word 'inspect' reasonably implies read-only behavior, and 'local' suggests no remote effects, but no explicit statement about side effects, prerequisites, or failure modes is provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no redundant words. Every part of the description contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only status tool with an output schema present, the description provides sufficient context to invoke the tool correctly. Return values do not need explanation because the output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the baseline is 4. The description adds no parameter-specific meaning, but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('inspect') with a clear resource ('local Tailscale mesh network status and peer devices'). It clearly differentiates this tool from the LXC/Proxmox sibling tools by naming Tailscale explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives. The description implies its domain but does not state exclusions or mention sibling tools like proxmox_cluster_status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.0
    • First observedlxc_control_power
    • First observedlxc_get_info
    • First observedlxc_list
    • First observedlxc_service_status
    • First observedlxc_snapshot_create
    • First observedproxmox_cluster_status
    • First observedtailscale_mesh_status

TDQS

A3.6/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct resource and action: host node status, LXC list vs detail, in-container service status, power control, snapshots, and Tailscale network status. Even the 'status' tools are cleanly separated by the resource prefix.

Naming Consistency3/5

Names are readable but mix conventions: lxc_list and lxc_get_info use verb-first patterns, lxc_snapshot_create uses noun-verb, and the 'status' tools use noun_status. The inconsistent placement of verbs (control_power vs snapshot_create) is the main issue.

Tool Count5/5

7 tools is well-scoped for a homelab management server covering host status, LXC operations, and network status. Each tool has a clear purpose with no redundant bloat.

Completeness3/5

The set covers common read and control operations: list, inspect, power, snapshot, service check, plus host and network status. However, it lacks LXC create/delete/config updates, snapshot restore/list/delete, and any VM management, leaving notable gaps for a Proxmox homelab tool.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers