Proxmox Homelab FastMCP
Allows checking Docker container health and status inside LXC containers via pct exec.
Provides tools for managing Proxmox VE nodes and LXC containers, including cluster status, container lifecycle operations, snapshots, and service inspection.
Provides Tailscale mesh diagnostics, including node reachability, Tailscale IPs, and peer online status.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Proxmox Homelab FastMCPcheck cluster status and list all LXC containers"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Returns node specs, CPU load, RAM usage %, and storage availability. |
| Lists all LXC containers with VMID, name, status, and resource consumption. |
| Retrieves deep config and network details for a specific VMID. |
| Executes |
| Creates a snapshot with custom name and description. |
| Inspects systemd or docker container status inside an LXC. |
| Inspects the local Tailscale mesh network status and peer devices. |
Architecture & Requirements
Python:
>= 3.11FastMCP:
>= 0.4.0Pydantic:
>= 2.0.0Host Connectivity: Passwordless SSH key authentication from the MCP host to the Proxmox host (
pvesh).
Environment Variables
Variable | Default | Description |
|
| Proxmox VE node IP or hostname |
|
| SSH user |
|
| Private SSH key path |
|
| 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 syncRun in stdio mode (default):
uv run python -m proxmox_homelab_mcp.serverOr run in SSE transport mode:
uv run python -m proxmox_homelab_mcp.server --transport sse --port 8770MCP 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: trueClaude 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 toolslxc_control_powerLxc Control PowerA
Manage LXC power lifecycle: 'start', 'stop', 'shutdown', or 'reboot'.
| Name | Required | Description | Default |
|---|---|---|---|
| vmid | Yes | ||
| action | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vmid | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vmid | Yes | ||
| service_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vmid | Yes | ||
| snapname | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v0.1.0- First observed
lxc_control_power - First observed
lxc_get_info - First observed
lxc_list - First observed
lxc_service_status - First observed
lxc_snapshot_create - First observed
proxmox_cluster_status - First observed
tailscale_mesh_status
TDQS
Scored across 7 tools
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.
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.
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.
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
Related MCP Connectors
Provides capabilities that let LLM agents perform a range of infrastructure management tasks.
Tailscale device, route, DNS, key, user, and ACL management over MCP and CLI.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
- emisarOAuthdev.emisar
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Proxmox VE infrastructure, including VMs, containers, storage, and cluster operations via natural language.MIT
- AlicenseCqualityDmaintenanceEnables management of Proxmox VE environments, including VMs, containers, storage, and cluster operations through natural language.7681 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to monitor and manage Proxmox VE infrastructure, including nodes, VMs, containers, storage, backups, and networking, via natural language.1MIT
- AlicenseBqualityDmaintenanceEnables AI assistants to manage Proxmox VE infrastructure, including VMs, containers, storage, network, high availability, replication, SDN, and node administration.10018 npmMIT