
Proxmox VE
io.github.akmalovaa由 GitHub 帳號 akmalovaa 發布v2.3.0更新於 Oct 24, 2026
Manage Proxmox VE nodes, VMs, containers, storage and snapshots. Read-only by default.
概覽
讓助理透過 50 個工具檢視 Proxmox VE 節點、QEMU 虛擬機、LXC 容器、儲存與快照,並在啟用後執行控制操作。
- 可以做什麼
- 把 Proxmox VE API 包裝成 50 個工具,涵蓋節點、QEMU 虛擬機、LXC 容器、儲存、叢集與快照。唯讀工具可列出節點、虛擬機、容器、儲存池、叢集健康、備份、HA 狀態與任務日誌,並可透過客體代理取得虛擬機或容器的 IP 位址。更高風險等級會加入啟動、停止、重新開機、複製、遷移、建立快照等生命週期操作,以及刪除與回復快照。寫入操作會回傳 Proxmox 已接受的任務,以及可用 get_task_status 輪詢的 UPID。
- 適用情境
- 適合讓助理回答 Proxmox VE 叢集的問題,或在聊天用戶端中執行客體生命週期操作。適用於家用實驗室與小型叢集管理,預設唯讀,可由管理者主動提高風險等級。
- 執行需求
- 以 stdio(預設)或 streamable HTTP 在本機執行,來自 PyPI 套件 proxmox-ve-mcp 或 OCI 映像 ghcr.io/akmalovaa/proxmox-mcp。需要 PROXMOX_HOST,以及 PROXMOX_USER 加 PROXMOX_TOKEN_NAME 與 PROXMOX_TOKEN_VALUE,或 PROXMOX_PASSWORD。選用:PROXMOX_PORT、PROXMOX_VERIFY_SSL、PROXMOX_TIMEOUT、PROXMOX_RISK_LEVEL、PROXMOX_TOOLS_ALLOW、PROXMOX_REDACT_SECRETS、PROXMOX_MCP_* 傳輸設定、SENTRY_DSN。需要能連線 Proxmox API 的網路。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Proxmox VE,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
Proxmox MCP server
[proxmox-mcp — MCP server for Proxmox VE]
[CI] [Release] [License: MIT] [Python 3.14] [GHCR] [MCP]
Simple Proxmox MCP
MCP server for managing Proxmox VE
50 tools — nodes, QEMU VMs, LXC containers, storage, cluster, snapshots.
Why this one?
- One image, multi-arch —
docker run ghcr.io/akmalovaa/proxmox-mcp:latestand you're done - Just env vars — no config files, no database, no state
- Read-only by default — destructive ops are gated behind an explicit
PROXMOX_RISK_LEVEL - stdio or Streamable HTTP — one env var apart; stdio by default, HTTP binds loopback
- Tiny codebase — a thin layer over Proxmoxer, no config files, no database, no state
- Raw JSON out — no formatting, no emoji; LLM gets clean data
- Readable failures — a 403, a dead host or a blocked tier come back as a sentence, not a stack trace
Quick start
Image: ghcr.io/akmalovaa/proxmox-mcp:latest (multi-arch: amd64 + arm64).
1. Export credentials in your shell profile (~/.zprofile, ~/.zshrc or ~/.bashrc):
Reload: source ~/.zprofile (or restart the shell).
2. Add to ~/.claude/settings.json (Claude Code) or claude_desktop_config.json (Claude Desktop):
or token auth:
docker run -e VAR without a value passes the host variable through — no secrets in the config file. Restart the client — 32 read-only Proxmox tools become available (more if you raise PROXMOX_RISK_LEVEL).
For password auth, swap the token vars for PROXMOX_PASSWORD.
Note: Claude Desktop on macOS is launched via launchd and does not inherit
~/.zprofile/~/.zshrc. Either put the exports in~/.zshenv, or fall back to an inline"env": { ... }block in the config.
Configuration
All settings are environment variables — set them in your shell profile, pass them inline to docker run -e, or declare them in your MCP client's env block.
Transport settings live under a PROXMOX_MCP_ prefix — see Streamable HTTP.
Authentication: token or password
Pick one. If both are set, the token wins.
Token (recommended):
Setting only one half of the pair is a startup error rather than a silent fallback to
the password — a typo in PROXMOX_TOKEN_NAME used to mean quietly running as whoever
PROXMOX_USER is.
Password (fallback):
Least privilege
An MCP server is reachable by a model acting on text it did not write, so give it its
own user and its own token rather than root@pam. On the Proxmox host:
Check what the token actually ended up with:
PVEAuditor covers all 32 read tools. PVEVMAdmin on /vms adds guest lifecycle and
snapshots; migrate_vm additionally needs VM.Migrate on the target node, and
clone_vm needs Datastore.AllocateSpace on the target storage. Narrow the ACL path
(/vms/101, /pool/homelab) if the server should only see part of the cluster.
root@pam still works and is the quickest thing for a local look around — it is just
not what should be left running.
Risk levels
PROXMOX_RISK_LEVEL controls which tools exist. Tools above the active level are not registered, so they never appear in the MCP client's tool list:
Each elevated call is also re-checked at call time and logged to stderr (ALLOW / DENY + tool + tier).
The active level is not otherwise observable from the client side — a tool that is
missing looks the same as a tool that was never written — so get_server_info reports
it, along with the versions and the tool count.
PROXMOX_TOOLS_ALLOW narrows further within the tier, for a deployment that serves
one specific agent:
Names that do not exist are a startup error, so a typo cannot silently amputate the
tool list. Keep get_server_info on the list unless you have a reason not to — it is
how a client learns what the rest of the list means.
Response shape
Inventory listings (list_nodes, list_vms, list_containers, get_cluster_resources)
return a compact subset of each row: identity, status, uptime, CPU and memory. What is
dropped is per-second IO counters and PSI pressure gauges — real data, but nothing a
triage decision turns on, and several times the volume of what is kept. Pass
verbose=true for the untouched rows.
Write tools answer with the task Proxmox accepted, not with a finished result:
cipassword and sshkeys are replaced with ***redacted*** everywhere, keeping the key
so the model can still tell that cloud-init is configured. Set
PROXMOX_REDACT_SECRETS=false to get the raw values.
Streamable HTTP
stdio stays the default and is what an MCP client on your own machine should use. For a shared deployment — a container in a cluster, several clients on one URL — set the transport and nothing else changes:
The prefix is PROXMOX_MCP_, not PROXMOX_, because Kubernetes injects <SERVICE>_PORT
for every linked Service — a Service named proxmox would otherwise redefine
PROXMOX_PORT.
Sessions are not used (stateless_http): they were removed from the protocol in
revision 2026-07-28, and without them several clients can share one URL and a rolling
update does not cut anyone off.
Host and Origin validation. Binding anything other than loopback requires
PROXMOX_MCP_ALLOWED_HOSTS; the server refuses to start otherwise. A foreign Origin
gets 403 and an unexpected Host gets 421 — this is what stops a page in a browser on
the same LAN from driving the server through DNS rebinding. A request with no Origin
header (curl, MCP clients) always passes. Set PROXMOX_MCP_ALLOWED_HOSTS=* only when
something in front already validates it.
There is no authentication. Anyone who can reach the endpoint gets whatever
PROXMOX_RISK_LEVEL allows. Put it behind a gateway, an authenticating proxy or a
network boundary you trust, and keep PROXMOX_RISK_LEVEL=read unless the path to it is
authenticated.
Health endpoints are served alongside /mcp and need no auth:
Flags mirror the variables for interactive use: uvx proxmox-ve-mcp --transport streamable-http --port 8080.
Sentry (optional)
Tool calls and failures can be shipped to Sentry — every tools/call
becomes a span, every failing tool an issue. Nothing is sent, and the SDK is never even
imported, while SENTRY_DSN is unset.
The ghcr.io image already contains the SDK. From PyPI, install the extra:
Leave SENTRY_SEND_DEFAULT_PII off unless you mean it: with it on, tool arguments and
results are attached to spans, and get_vm_config returns ssh keys and cipassword
hashes. A DSN set without the extra installed logs a warning and the server runs on.
Tools
Nodes (10)
QEMU VMs (17)
LXC Containers (13)
Storage (2)
Cluster (7)
Server (1)
Architecture
- Read-only by default — elevated tools gated by
PROXMOX_RISK_LEVEL - Gated at registration — a tool above the tier is absent from
tools/list, not refused at call time: what the model cannot see, it cannot retry - Admission and annotations are separate —
tier=is the operator's policy,annotations=is what the client is told a call does, so a force-stop can bedestructiveHint: trueand still live at thelifecycletier - Lazy connection — the Proxmoxer client is built on first use, once, and shared; the server therefore starts cleanly even when Proxmox is unreachable
- Raw JSON output — compact, no formatting; LLM consumes data directly
- Normalized errors — Proxmox and network failures are translated into one
actionable sentence instead of a
requeststraceback
Development
Run standalone (testing)
Without Docker (UV)
MCP client config:
Build from source
The image is multi-stage: uv builds the virtualenv in a throwaway layer, and the
runtime stage carries only Python plus the venv and runs as the unprivileged mcp
user (uid 10001).
Lint, type-check, test
License
MIT
來源:README.md,提交 ff252d4
工具
0版本歷史
1- v2.3.0最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分
