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는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
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월 8일 점검
레지스트리 이름이 GitHub 계정 akmalovaa 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
입력해야 할 값: PROXMOX_HOST, PROXMOX_TOKEN_VALUE, PROXMOX_PASSWORD, SENTRY_DSN
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(2.3.0)은 2개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 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
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요