mcpField
P
Proxmox Mcp

Proxmox Mcp

本地服务
github.com云与基础设施58 周前更新

关于 Proxmox Mcp

Proxmox Mcp 是用于管理 Proxmox VE 的 MCP 服务,面向希望通过 Claude 等 MCP 客户端查看和操作节点、虚拟机及容器的用户。默认仅开放只读工具,并可通过风险等级启用生命周期及快照操作。

主要功能

  1. 01查询节点、QEMU VM 和 LXC 容器
  2. 02查看存储、集群与快照信息
  3. 03按风险等级控制操作工具
  4. 04支持 stdio 与 Streamable HTTP
  5. 05默认脱敏敏感响应字段

适用场景

  1. 01检查集群节点和虚拟机状态
  2. 02排查节点任务与资源情况
  3. 03按需启用虚拟机生命周期操作

MCP 相关

向 MCP 客户端提供 Proxmox VE 查询及受风险等级控制的管理工具。支持 stdio 和 Streamable HTTP 传输。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"akmalovaa-proxmox": {
"command": "uvx",
"args": [
"proxmox-ve-mcp"
],
"env": {
"PROXMOX_HOST": "<PROXMOX_HOST>",
"PROXMOX_PORT": "<PROXMOX_PORT>",
"PROXMOX_VERIFY_SSL": "<PROXMOX_VERIFY_SSL>",
"PROXMOX_TIMEOUT": "<PROXMOX_TIMEOUT>",
"PROXMOX_USER": "<PROXMOX_USER>",
"PROXMOX_TOKEN_NAME": "<PROXMOX_TOKEN_NAME>",
"PROXMOX_TOKEN_VALUE": "<PROXMOX_TOKEN_VALUE>",
"PROXMOX_PASSWORD": "<PROXMOX_PASSWORD>",
"PROXMOX_RISK_LEVEL": "<PROXMOX_RISK_LEVEL>",
"PROXMOX_TOOLS_ALLOW": "<PROXMOX_TOOLS_ALLOW>",
"PROXMOX_REDACT_SECRETS": "<PROXMOX_REDACT_SECRETS>",
"PROXMOX_MCP_TRANSPORT": "<PROXMOX_MCP_TRANSPORT>",
"PROXMOX_MCP_HOST": "<PROXMOX_MCP_HOST>",
"PROXMOX_MCP_PORT": "<PROXMOX_MCP_PORT>",
"PROXMOX_MCP_PATH": "<PROXMOX_MCP_PATH>",
"PROXMOX_MCP_JSON_RESPONSE": "<PROXMOX_MCP_JSON_RESPONSE>",
"PROXMOX_MCP_ALLOWED_HOSTS": "<PROXMOX_MCP_ALLOWED_HOSTS>",
"PROXMOX_MCP_ALLOWED_ORIGINS": "<PROXMOX_MCP_ALLOWED_ORIGINS>",
"SENTRY_DSN": "<SENTRY_DSN>"
}
}
}
}
启动命令uvx proxmox-ve-mcp
需要配置的环境变量
PROXMOX_HOSTProxmox host IP or hostname.
PROXMOX_PORTProxmox API port.
PROXMOX_VERIFY_SSLVerify the TLS certificate. Proxmox self-signs by default.
PROXMOX_TIMEOUTSeconds to wait for each Proxmox API request.
PROXMOX_USERAPI user, including the realm.
PROXMOX_TOKEN_NAME密钥API token name. Use this plus PROXMOX_TOKEN_VALUE, or PROXMOX_PASSWORD.
PROXMOX_TOKEN_VALUE密钥API token secret.
PROXMOX_PASSWORD密钥Password, used only when no API token is set.
PROXMOX_RISK_LEVELWhich tools exist: read-only, plus lifecycle, or everything.
PROXMOX_TOOLS_ALLOWComma-separated tool names to register, intersected with the risk level. Unset = all of them.
PROXMOX_REDACT_SECRETS密钥Mask cipassword and sshkeys in every response.
PROXMOX_MCP_TRANSPORTstdio (default) or streamable-http.
PROXMOX_MCP_HOSTHTTP bind address. Anything but loopback also needs PROXMOX_MCP_ALLOWED_HOSTS.
PROXMOX_MCP_PORTHTTP port.
PROXMOX_MCP_PATHStreamable HTTP endpoint path.
PROXMOX_MCP_JSON_RESPONSEAnswer with JSON instead of an SSE stream.
PROXMOX_MCP_ALLOWED_HOSTSComma-separated Host headers to accept over HTTP; '*' disables the check.
PROXMOX_MCP_ALLOWED_ORIGINSComma-separated browser origins allowed to call the endpoint. Empty = same-origin only.
SENTRY_DSN密钥Optional: report tool traces and errors to Sentry. Unset disables it.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiproxmox-ve-mcp2.3.0
ocighcr.io/akmalovaa/proxmox-mcp:2.3.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Proxmox MCP 服务

proxmox-mcp — 用于 Proxmox VE 的 MCP 服务

CI Release License: MIT Python 3.14 GHCR MCP

简易 Proxmox MCP

proxmox-mcp 标志

用于管理 Proxmox VE 的 MCP 服务

50 个工具 — 节点、QEMU 虚拟机、LXC 容器、存储、集群、快照。

为什么选择它?
  • 单一镜像,支持多架构 — 运行 docker run ghcr.io/akmalovaa/proxmox-mcp:latest 即可
  • 只需环境变量 — 无配置文件、无数据库、无状态
  • 默认只读 — 破坏性操作由显式设置的 PROXMOX_RISK_LEVEL 控制
  • 支持 stdio 或 Streamable HTTP — 只差一个环境变量;默认使用 stdio,HTTP 绑定到回环地址
  • 代码库精简 — 基于 Proxmoxer 的轻量封装,无配置文件、无数据库、无状态
  • 直接输出原始 JSON — 无格式化、无表情符号;大模型可获取干净的数据
  • 错误信息易读 — 403、主机无响应或层级限制都会以句子说明,而不是堆栈跟踪

proxmox-mcp MCP server

快速开始

镜像: ghcr.io/akmalovaa/proxmox-mcp:latest(支持多架构:amd64 + arm64)。

1. 在 shell 配置文件中导出凭据(~/.zprofile、~/.zshrc 或 ~/.bashrc):

# token auth (recommended — see "Least privilege" for the user and role to give it):
export PROXMOX_HOST=192.168.1.100
export PROXMOX_USER=mcp@pve
export PROXMOX_TOKEN_NAME=mcp
export PROXMOX_TOKEN_VALUE=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

# or password auth:
# export PROXMOX_USER=root@pam
# export PROXMOX_PASSWORD=your-password

# optional:
export PROXMOX_RISK_LEVEL=read

重新加载:source ~/.zprofile(或重启 shell)。

2. 添加到 ~/.claude/settings.json(Claude Code)或 claude_desktop_config.json(Claude Desktop):

{
  "mcpServers": {
    "proxmox": {
      "command": "docker",
      "args": ["run", "-i", "--rm",
        "-e", "PROXMOX_HOST",
        "-e", "PROXMOX_USER",
        "-e", "PROXMOX_PASSWORD",
        "ghcr.io/akmalovaa/proxmox-mcp:latest"]
    }
  }
}

或使用令牌认证:

{
  "mcpServers": {
    "proxmox": {
      "command": "docker",
      "args": ["run", "-i", "--rm",
        "-e", "PROXMOX_HOST",
        "-e", "PROXMOX_USER",
        "-e", "PROXMOX_TOKEN_NAME",
        "-e", "PROXMOX_TOKEN_VALUE",
        "ghcr.io/akmalovaa/proxmox-mcp:latest"]
    }
  }
}

不带值的 docker run -e VAR 会传递主机环境变量,因此配置文件中无需包含密钥。重启客户端后,即可使用 32 个只读 Proxmox 工具(提高 PROXMOX_RISK_LEVEL 后可用更多工具)。

使用密码认证时,将令牌变量替换为 PROXMOX_PASSWORD。

注意: macOS 上的 Claude Desktop 通过 launchd 启动,不会继承 ~/.zprofile/~/.zshrc。请将导出语句放入 ~/.zshenv,或者改为在配置中使用内联 "env": { ... } 块。

配置

所有设置均为环境变量 — 可在 shell 配置文件中设置,通过 docker run -e 内联传入,或在 MCP 客户端的 env 块中声明。

变量默认值描述
PROXMOX_HOST—Proxmox 主机(IP 或主机名)
PROXMOX_USERroot@pamAPI 用户
认证—令牌 或 密码 — 见下文
PROXMOX_PORT8006API 端口
PROXMOX_VERIFY_SSLfalse验证 TLS 证书
PROXMOX_TIMEOUT15每次 API 请求的等待秒数
PROXMOX_RISK_LEVELreadread / lifecycle / all — 见风险级别
PROXMOX_TOOLS_ALLOW—除风险级别允许的工具外,额外注册的工具名称(逗号分隔)
PROXMOX_REDACT_SECRETStrue在响应中隐藏 cipassword / sshkeys

传输设置使用 PROXMOX_MCP_ 前缀 — 见 Streamable HTTP。

身份验证:令牌 或 密码

二选一。如果两者都已设置,则令牌优先。

令牌(推荐):

export PROXMOX_USER=mcp@pve
export PROXMOX_TOKEN_NAME=mcp
export PROXMOX_TOKEN_VALUE=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

只设置这对配置中的一项会导致启动错误,而不会静默回退到密码。以前,PROXMOX_TOKEN_NAME 中的拼写错误会导致程序悄悄以 PROXMOX_USER 的身份运行。

密码(备用):

export PROXMOX_PASSWORD=your-password
最小权限

MCP 服务可能会被根据其未编写的文本行事的模型访问,因此应为它单独创建用户和令牌,而不要使用 root@pam。在 Proxmox 主机上:

# a user that is not root, with a role that matches the risk level you plan to run
pveum user add mcp@pve
pveum acl modify / --users mcp@pve --roles PVEAuditor          # read
# pveum acl modify / --users mcp@pve --roles PVEVMAdmin        # lifecycle / all

# a token for that user. Privilege Separation ON (the default) means the token starts
# with no rights at all, so grant it the same role explicitly:
pveum user token add mcp@pve mcp --privsep 1
pveum acl modify / --tokens 'mcp@pve!mcp' --roles PVEAuditor

检查令牌最终实际获得了哪些权限:

pveum user permissions mcp@pve --token mcp

PVEAuditor 涵盖全部 32 个只读工具。在 /vms 上设置 PVEVMAdmin 可添加虚拟机生命周期管理和快照功能;migrate_vm 还需要在目标节点上拥有 VM.Migrate 权限,而 clone_vm 需要在目标存储上拥有 Datastore.AllocateSpace 权限。如果服务只应查看集群的一部分,请缩小 ACL 路径范围(/vms/101、/pool/homelab)。

root@pam 仍然可用,也是本地快速查看时最省事的选择,只是不应让它一直运行。

风险级别

PROXMOX_RISK_LEVEL 控制哪些工具可用。高于当前级别的工具不会注册,因此不会出现在 MCP 客户端的工具列表中:

级别工具数新增内容
read (默认)32只读工具
lifecycle46+ 启动 / 停止 / 重启 / 挂起 / 克隆 / 迁移 / 创建快照
all50+ 删除快照 / 回滚快照

每次提升权限的调用也会在调用时重新检查,并记录到 stderr(ALLOW / DENY + 工具 + 层级)。

客户端无法以其他方式获知当前级别——缺失的工具看起来和从未编写过的工具没有区别——因此 get_server_info 会报告当前级别,以及版本和工具数量。

对于只服务于某个特定 Agent 的部署,PROXMOX_TOOLS_ALLOW 可在当前层级范围内进一步缩小工具范围:

export PROXMOX_TOOLS_ALLOW=list_nodes,list_containers,get_container_status,get_cluster_resources

不存在的名称会导致启动错误,因此拼写错误不会悄悄删减工具列表。除非有特殊原因,否则请将 get_server_info 保留在列表中——客户端通过它了解列表中其他工具的含义。

响应格式

资源清单列表(list_nodes、list_vms、list_containers、get_cluster_resources)会返回每行的精简字段:标识、状态、运行时间、CPU 和内存。被省略的是每秒 I/O 计数器和 PSI 压力指标——它们是真实数据,但对分诊决策没有帮助,且数据量是保留内容的好几倍。传入 verbose=true 可获取未经处理的行。

写入工具返回的是 Proxmox 接受的任务,而不是已完成的结果:

{"state":"accepted","operation":"start_vm","node":"pve","vmid":101,
 "upid":"UPID:pve:...","poll_with":"get_task_status"}

cipassword 和 sshkeys 在所有位置都会替换为 ***redacted***,同时保留键名,以便模型仍能判断 cloud-init 是否已配置。设置 PROXMOX_REDACT_SECRETS=false 可获取原始值。

Streamable HTTP

stdio 仍是默认传输方式,也是你本机上的 MCP 客户端应使用的方式。对于共享部署——例如集群中的容器,或多个客户端共用一个 URL——设置传输方式,其他内容无需更改:

docker run --rm -p 8000:8000 \
  -e PROXMOX_HOST -e PROXMOX_TOKEN_NAME -e PROXMOX_TOKEN_VALUE \
  -e PROXMOX_MCP_TRANSPORT=streamable-http \
  -e PROXMOX_MCP_HOST=0.0.0.0 \
  -e PROXMOX_MCP_ALLOWED_HOSTS=proxmox-mcp.example.com \
  ghcr.io/akmalovaa/proxmox-mcp:latest
变量默认值描述
PROXMOX_MCP_TRANSPORTstdiostdio 或 streamable-http
PROXMOX_MCP_HOST127.0.0.1绑定地址——在容器中使用 0.0.0.0
PROXMOX_MCP_PORT8000端口
PROXMOX_MCP_PATH/mcp端点路径
PROXMOX_MCP_JSON_RESPONSEtrue返回 JSON 响应,而不是 SSE 流
PROXMOX_MCP_ALLOWED_HOSTS—接受的 Host 标头;* 表示禁用检查
PROXMOX_MCP_ALLOWED_ORIGINS—允许的浏览器来源;留空 = 仅允许同源

前缀是 PROXMOX_MCP_,而不是 PROXMOX_,因为 Kubernetes 会为每个关联的 Service 注入 <SERVICE>_PORT——否则名为 proxmox 的 Service 会重新定义 PROXMOX_PORT。

不使用会话(stateless_http):协议在修订版 2026-07-28 中移除了会话,因此多个客户端可以共用一个 URL,滚动更新也不会中断任何客户端。

Host 和 Origin 验证。 绑定到回环地址以外的地址时,必须设置 PROXMOX_MCP_ALLOWED_HOSTS;否则服务器会拒绝启动。来自外部的 Origin 会收到 403,意外的 Host 会收到 421——这可以防止同一局域网上浏览器中的页面通过 DNS 重绑定驱动服务器。没有 Origin 标头的请求(curl、MCP 客户端)始终通过验证。只有当前置组件已进行验证时,才设置 PROXMOX_MCP_ALLOWED_HOSTS=*。

此服务没有身份验证。 任何能够访问端点的人都可以使用 PROXMOX_RISK_LEVEL 所允许的功能。请将其置于网关、身份验证代理或可信的网络边界之后;除非访问路径经过身份验证,否则请保持 PROXMOX_RISK_LEVEL=read。

健康检查端点 与 /mcp 一同提供,且无需身份验证:

路径含义
GET /healthz进程正在运行。不会访问 Proxmox——如果 Proxmox 宕机就导致存活探针失败,服务器会陷入重启循环,且无法解决任何问题。
GET /readyzProxmox 已响应 version.get()。此端点应用于控制流量;否则返回 503 和易于理解的原因。
livenessProbe:
  httpGet: { path: /healthz, port: 8000 }
readinessProbe:
  httpGet: { path: /readyz, port: 8000 }

这些标志与变量对应,可用于交互式操作:uvx proxmox-ve-mcp --transport streamable-http --port 8080。

Sentry(可选)

可以将工具调用和失败事件发送到 Sentry——每个 tools/call 都会成为一个 span,每个失败的工具都会生成一个 issue。未设置 SENTRY_DSN 时,不会发送任何内容,甚至不会导入 SDK。

ghcr.io 镜像已包含 SDK。通过 PyPI 安装时,请安装附加依赖:

uvx --from 'proxmox-ve-mcp[sentry]' proxmox-ve-mcp
变量默认值描述
SENTRY_DSN—设置后启用报告
SENTRY_ENVIRONMENTproduction自定义环境标签
SENTRY_TRACES_SAMPLE_RATE1.0跟踪的工具调用比例
SENTRY_SEND_DEFAULT_PIIfalse将工具参数和结果作为 span 数据发送

除非确定需要,否则请勿启用 SENTRY_SEND_DEFAULT_PII:启用后,工具参数和结果会附加到 span 中,而 get_vm_config 会返回 ssh 密钥和 cipassword 哈希值。如果设置了 DSN,但未安装附加依赖,则会记录警告,服务器仍会继续运行。

工具

节点(10)
工具描述
list_nodes列出所有集群节点及其状态、CPU、内存和运行时间
get_node_status节点详细指标(CPU、内存、磁盘、负载、内核)
get_node_networks节点上的网络接口
get_node_disks节点上的物理磁盘
get_node_servicesProxmox 系统服务及其状态
get_node_updates待处理的 APT 软件包更新
get_node_rrd_data历史 CPU/内存/磁盘/网络指标(RRD)
get_node_tasks节点上的近期任务,可选择仅显示错误
get_task_status根据 UPID 查询特定任务的状态
get_task_log任务的日志输出
QEMU 虚拟机(17)
工具层级描述
list_vmsread列出所有虚拟机,可按节点筛选
get_vm_statusread当前虚拟机状态(运行/停止、CPU、内存)
get_vm_configread虚拟机配置(硬件、磁盘、网络)
get_vm_network_interfacesread正在运行的虚拟机的IP 地址(通过 QEMU 客户机 Agent)
get_vm_rrd_dataread历史 CPU/内存/磁盘/网络指标(RRD)
list_vm_snapshotsread列出虚拟机的所有快照
start_vmlifecycle启动虚拟机
stop_vmlifecycle强制停止虚拟机——标记为破坏性操作,未保存的客户机状态将丢失
shutdown_vmlifecycle使用超时设置执行 ACPI 正常关机
reboot_vmlifecycle通过 ACPI 重启
suspend_vmlifecycle挂起虚拟机
resume_vmlifecycle恢复已挂起的虚拟机
clone_vmlifecycle完整克隆或链接克隆
migrate_vmlifecycle将虚拟机迁移到另一节点,可在线或离线迁移
create_vm_snapshotlifecycle创建快照
delete_vm_snapshotall删除快照
rollback_vm_snapshotall回滚到快照
LXC 容器(13)
工具层级描述
list_containersread列出所有 LXC 容器,可按节点筛选
get_container_statusread当前容器状态
get_container_configread容器配置
get_container_interfacesread正在运行的容器的IP 地址
get_container_rrd_dataread历史 CPU/内存/磁盘/网络指标(RRD)
list_container_snapshotsread列出所有快照
start_containerlifecycle启动容器
stop_containerlifecycle强制停止容器——标记为破坏性操作
shutdown_containerlifecycle使用超时设置正常关机
reboot_containerlifecycle重启容器
create_container_snapshotlifecycle创建快照
delete_container_snapshotall删除快照
rollback_container_snapshotall回滚到快照
存储(2)
工具描述
list_storage列出存储池及其用量,可按节点筛选
get_storage_content存储池的内容(ISO、备份、镜像、模板)
集群(7)
工具描述
get_cluster_status集群健康状况、仲裁状态和节点成员信息
get_cluster_resources所有资源(虚拟机、容器、存储、节点)
get_cluster_backups已配置的备份作业
get_ha_status高可用资源及其状态
list_pools资源池
get_cluster_log集群范围的事件日志,按时间从新到旧排列
get_next_vmid下一个可用的虚拟机/容器 ID
服务器(1)
工具描述
get_server_info此服务器自身的风险级别、工具数量、版本和 Proxmox 可访问性

架构

src/proxmox_mcp/
├── server.py    # MCPServer instance, health routes, transport selection, entry point
├── config.py    # Pydantic Settings (PROXMOX_) + transport config (PROXMOX_MCP_)
├── client.py    # Proxmoxer connection, built once per process
└── tools/       # nodes, vms, containers, storage, cluster, server_info
  • 默认只读 — 高权限工具由 PROXMOX_RISK_LEVEL 控制
  • 在注册时进行门控 — 高于指定级别的工具不会出现在 tools/list 中,而不是在调用时被拒绝:模型看不到的内容,就无法重试
  • 准入与注释相互独立 — tier= 是操作员的策略,annotations= 是告知客户端调用会执行什么操作,因此强制停止可以设置为 destructiveHint: true,同时仍属于 lifecycle 级别
  • 延迟连接 — Proxmoxer 客户端仅在首次使用时创建一次,并由所有调用共享;因此,即使无法访问 Proxmox,服务也能正常启动
  • 原始 JSON 输出 — 紧凑且不做格式化;大模型可直接使用数据
  • 标准化错误 — Proxmox 和网络故障会转换为一句可采取行动的说明,而不是 requests 回溯信息

开发

独立运行(测试)
export PROXMOX_HOST=192.168.1.100
export PROXMOX_USER=root@pam
export PROXMOX_TOKEN_NAME=mcp
export PROXMOX_TOKEN_VALUE=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

docker run -i --rm \
  -e PROXMOX_HOST -e PROXMOX_USER \
  -e PROXMOX_TOKEN_NAME -e PROXMOX_TOKEN_VALUE \
  ghcr.io/akmalovaa/proxmox-mcp:latest
不使用 Docker(UV)
git clone https://github.com/akmalovaa/proxmox-mcp.git && cd proxmox-mcp && uv sync

MCP 客户端配置:

{
  "mcpServers": {
    "proxmox": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/proxmox-mcp", "python", "-m", "proxmox_mcp"],
      "env": {
        "PROXMOX_HOST": "192.168.1.100",
        "PROXMOX_TOKEN_NAME": "mcp",
        "PROXMOX_TOKEN_VALUE": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
    }
  }
}
从源代码构建
git clone https://github.com/akmalovaa/proxmox-mcp.git
cd proxmox-mcp
docker build -t proxmox-mcp .

该镜像采用多阶段构建:uv 在临时层中构建虚拟环境,运行时阶段仅包含 Python 和虚拟环境,并以非特权 mcp 用户(uid 10001)运行。

代码检查、类型检查、测试
uv sync --locked --group dev
uv run ruff check .
uv run mypy src/
uv run pytest -v

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。