GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者提供的说明(英文原文)
Manage Proxmox VE nodes, VMs, containers, storage and snapshots. Read-only by default.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
PROXMOX_HOST, PROXMOX_PORT, PROXMOX_VERIFY_SSL, PROXMOX_TIMEOUT, PROXMOX_USER, PROXMOX_TOKEN_NAME, PROXMOX_TOKEN_VALUE, PROXMOX_PASSWORD, PROXMOX_RISK_LEVEL, PROXMOX_TOOLS_ALLOW, PROXMOX_REDACT_SECRETS, PROXMOX_MCP_TRANSPORT, PROXMOX_MCP_HOST, PROXMOX_MCP_PORT, PROXMOX_MCP_PATH, PROXMOX_MCP_JSON_RESPONSE, PROXMOX_MCP_ALLOWED_HOSTS, PROXMOX_MCP_ALLOWED_ORIGINS, SENTRY_DSN标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"proxmox": {
"command": "uvx",
"args": [
"proxmox-ve-mcp"
],
"env": {
"PROXMOX_HOST": "your-value",
"PROXMOX_PORT": "your-value",
"PROXMOX_VERIFY_SSL": "your-value",
"PROXMOX_TIMEOUT": "your-value",
"PROXMOX_USER": "your-value",
"PROXMOX_TOKEN_NAME": "your-value",
"PROXMOX_TOKEN_VALUE": "your-value",
"PROXMOX_PASSWORD": "your-value",
"PROXMOX_RISK_LEVEL": "your-value",
"PROXMOX_TOOLS_ALLOW": "your-value",
"PROXMOX_REDACT_SECRETS": "your-value",
"PROXMOX_MCP_TRANSPORT": "your-value",
"PROXMOX_MCP_HOST": "your-value",
"PROXMOX_MCP_PORT": "your-value",
"PROXMOX_MCP_PATH": "your-value",
"PROXMOX_MCP_JSON_RESPONSE": "your-value",
"PROXMOX_MCP_ALLOWED_HOSTS": "your-value",
"PROXMOX_MCP_ALLOWED_ORIGINS": "your-value",
"SENTRY_DSN": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add proxmox --env PROXMOX_HOST=your-value --env PROXMOX_PORT=your-value --env PROXMOX_VERIFY_SSL=your-value --env PROXMOX_TIMEOUT=your-value --env PROXMOX_USER=your-value --env PROXMOX_TOKEN_NAME=your-value --env PROXMOX_TOKEN_VALUE=your-value --env PROXMOX_PASSWORD=your-value --env PROXMOX_RISK_LEVEL=your-value --env PROXMOX_TOOLS_ALLOW=your-value --env PROXMOX_REDACT_SECRETS=your-value --env PROXMOX_MCP_TRANSPORT=your-value --env PROXMOX_MCP_HOST=your-value --env PROXMOX_MCP_PORT=your-value --env PROXMOX_MCP_PATH=your-value --env PROXMOX_MCP_JSON_RESPONSE=your-value --env PROXMOX_MCP_ALLOWED_HOSTS=your-value --env PROXMOX_MCP_ALLOWED_ORIGINS=your-value --env SENTRY_DSN=your-value -- uvx proxmox-ve-mcp运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"proxmox": {
"command": "uvx",
"args": [
"proxmox-ve-mcp"
],
"env": {
"PROXMOX_HOST": "your-value",
"PROXMOX_PORT": "your-value",
"PROXMOX_VERIFY_SSL": "your-value",
"PROXMOX_TIMEOUT": "your-value",
"PROXMOX_USER": "your-value",
"PROXMOX_TOKEN_NAME": "your-value",
"PROXMOX_TOKEN_VALUE": "your-value",
"PROXMOX_PASSWORD": "your-value",
"PROXMOX_RISK_LEVEL": "your-value",
"PROXMOX_TOOLS_ALLOW": "your-value",
"PROXMOX_REDACT_SECRETS": "your-value",
"PROXMOX_MCP_TRANSPORT": "your-value",
"PROXMOX_MCP_HOST": "your-value",
"PROXMOX_MCP_PORT": "your-value",
"PROXMOX_MCP_PATH": "your-value",
"PROXMOX_MCP_JSON_RESPONSE": "your-value",
"PROXMOX_MCP_ALLOWED_HOSTS": "your-value",
"PROXMOX_MCP_ALLOWED_ORIGINS": "your-value",
"SENTRY_DSN": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"proxmox": {
"type": "stdio",
"command": "uvx",
"args": [
"proxmox-ve-mcp"
],
"env": {
"PROXMOX_HOST": "your-value",
"PROXMOX_PORT": "your-value",
"PROXMOX_VERIFY_SSL": "your-value",
"PROXMOX_TIMEOUT": "your-value",
"PROXMOX_USER": "your-value",
"PROXMOX_TOKEN_NAME": "your-value",
"PROXMOX_TOKEN_VALUE": "your-value",
"PROXMOX_PASSWORD": "your-value",
"PROXMOX_RISK_LEVEL": "your-value",
"PROXMOX_TOOLS_ALLOW": "your-value",
"PROXMOX_REDACT_SECRETS": "your-value",
"PROXMOX_MCP_TRANSPORT": "your-value",
"PROXMOX_MCP_HOST": "your-value",
"PROXMOX_MCP_PORT": "your-value",
"PROXMOX_MCP_PATH": "your-value",
"PROXMOX_MCP_JSON_RESPONSE": "your-value",
"PROXMOX_MCP_ALLOWED_HOSTS": "your-value",
"PROXMOX_MCP_ALLOWED_ORIGINS": "your-value",
"SENTRY_DSN": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
PROXMOX_PORT envPROXMOX_VERIFY_SSL envPROXMOX_TIMEOUT envPROXMOX_USER envPROXMOX_TOKEN_NAME envPROXMOX_RISK_LEVEL envPROXMOX_TOOLS_ALLOW envPROXMOX_REDACT_SECRETS envPROXMOX_MCP_TRANSPORT envPROXMOX_MCP_HOST envPROXMOX_MCP_PORT envPROXMOX_MCP_PATH envPROXMOX_MCP_JSON_RESPONSE envPROXMOX_MCP_ALLOWED_HOSTS envPROXMOX_MCP_ALLOWED_ORIGINS env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月9日
注册名称已通过 GitHub 账户 akmalovaa 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:PROXMOX_HOST, PROXMOX_TOKEN_VALUE, PROXMOX_PASSWORD, SENTRY_DSN
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(2.3.0)于2个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv), Docker。
同一分类中有:GitHub, Desktop Commander, Cloudflare MCP
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
MCP server for managing Proxmox VE
50 tools — nodes, QEMU VMs, LXC containers, storage, cluster, snapshots.
docker run ghcr.io/akmalovaa/proxmox-mcp:latest and you're donePROXMOX_RISK_LEVELImage: ghcr.io/akmalovaa/proxmox-mcp:latest (multi-arch: amd64 + arm64).
1. Export credentials in your shell profile (~/.zprofile, ~/.zshrc or ~/.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
export PROXMOX_RISK_LEVEL=read
Reload: source ~/.zprofile (or restart the shell).
2. Add to `~/.claude/settings.json` (Claude Code) or `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"] } } }
or token auth:
{
"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 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.
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.
| Variable | Default | Description |
|---|---|---|
PROXMOX_HOST | — | Proxmox host (IP or hostname) |
PROXMOX_USER | root@pam | API user |
| Auth | — | **token *or* password — see below** |
PROXMOX_PORT | 8006 | API port |
PROXMOX_VERIFY_SSL | false | Verify TLS certificate |
PROXMOX_TIMEOUT | 15 | Seconds to wait for each API request |
PROXMOX_RISK_LEVEL | read | read / lifecycle / all — see Risk levels |
PROXMOX_TOOLS_ALLOW | — | Comma-separated tool names to register, on top of the risk level |
PROXMOX_REDACT_SECRETS | true | Mask cipassword / sshkeys in responses |
Transport settings live under a PROXMOX_MCP_ prefix — see Streamable HTTP.
Pick one. If both are set, the token wins.
Token (recommended):
export PROXMOX_USER=mcp@pve
export PROXMOX_TOKEN_NAME=mcp export PROXMOX_TOKEN_VALUE=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
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):
export PROXMOX_PASSWORD=your-password
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:
# 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 user token add mcp@pve mcp --privsep 1 pveum acl modify / --tokens 'mcp@pve!mcp' --roles PVEAuditor
Check what the token actually ended up with:
pveum user permissions mcp@pve --token mcp
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.
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:
| Level | Tools | Adds |
|---|---|---|
read *(default)* | 32 | read-only tools |
lifecycle | 46 | + start / stop / reboot / suspend / clone / migrate / create-snapshot |
all | 50 | + delete-snapshot / rollback-snapshot |
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:
export PROXMOX_TOOLS_ALLOW=list_nodes,list_containers,get_container_status,get_cluster_resources
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.
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:
{"state":"accepted","operation":"start_vm","node":"pve","vmid":101,
"upid":"UPID:pve:...","poll_with":"get_task_status"}
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.
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:
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
| Variable | Default | Description |
|---|---|---|
PROXMOX_MCP_TRANSPORT | stdio | stdio or streamable-http |
PROXMOX_MCP_HOST | 127.0.0.1 | Bind address — 0.0.0.0 in a container |
PROXMOX_MCP_PORT | 8000 | Port |
PROXMOX_MCP_PATH | /mcp | Endpoint path |
PROXMOX_MCP_JSON_RESPONSE | true | JSON responses instead of an SSE stream |
PROXMOX_MCP_ALLOWED_HOSTS | — | Host headers to accept; * disables the check |
PROXMOX_MCP_ALLOWED_ORIGINS | — | Browser origins allowed; empty = same-origin only |
The prefix is PROXMOX_MCP_, not PROXMOX_, because Kubernetes injects _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:
| Path | Meaning |
|---|---|
GET /healthz | The process is up. Never touches Proxmox — a liveness probe that fails when Proxmox is down would restart the server in a loop and fix nothing. |
GET /readyz | Proxmox answered version.get(). This is the one that should gate traffic; 503 with a readable reason otherwise. |
livenessProbe:
httpGet: { path: /healthz, port: 8000 } readinessProbe: httpGet: { path: /readyz, port: 8000 }
Flags mirror the variables for interactive use: uvx proxmox-ve-mcp --transport streamable-http --port 8080.
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:
uvx --from 'proxmox-ve-mcp[sentry]' proxmox-ve-mcp
| Variable | Default | Description |
|---|---|---|
SENTRY_DSN | — | Set it to enable reporting |
SENTRY_ENVIRONMENT | production | Free-form environment label |
SENTRY_TRACES_SAMPLE_RATE | 1.0 | Share of tool calls traced |
| `SENTRY_SEND_DEF
只显示了开头部分;其余内容请在仓库中阅读