Conversation
Packages RekklesNA/ProxmoxMCP-Plus (MIT) in its native MCP Streamable HTTP mode so an AI agent can manage a Proxmox VE cluster through one authenticated endpoint at https://proxmox-mcp.<HOLA_BASE_DOMAIN>/mcp. - Image ghcr.io/rekklesna/proxmoxmcp-plus:v0.5.15, digest-pinned, multi-arch, unprivileged user. No host ports; one service; no data volume (the optional job store is ephemeral). - Config is env-only: the image's PROXMOX_MCP_CONFIG file is never mounted, so the loader falls back to the wizard fields (host, user, token name/secret, port, TLS verification). - Auth: forward-auth with bypassPaths ["/mcp"], the remo setup-API pattern — /mcp is protected by the app's own generated MCP_API_KEY bearer credential; everything else stays behind Authentik. - Defensive defaults: MCP_TOOL_DENYLIST hides delete_vm, delete_container, delete_snapshot, rollback_snapshot (advanced field, clearable); DNS-rebinding protection allows only the public host plus loopback for the healthcheck. - Healthcheck probes /mcp for any HTTP answer (a 401 without the key) since the MCP transport has no unauthenticated health route. - Icon: upstream's own 400px logo in an SVG wrapper (remo precedent). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vck5KSX2CLxhohx14nb5Sh
… fields An agent that provisions VMs through this server can clone/start/stop/delete them, but the tool set has no cloud-init config write, so the one thing it still needs is an allowlisted guest-agent command to inject an SSH key into a fresh clone. COMMAND_POLICY_MODE (deny_all by default) and COMMAND_POLICY_ALLOW_PATTERNS make that an explicit, narrow opt-in. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vck5KSX2CLxhohx14nb5Sh
…flag
Running the image against a lab host with a self-signed certificate showed
that PROXMOX_VERIFY_SSL=false alone makes the server exit at startup
("Insecure TLS configuration blocked … Only dev_mode=true can allow
verify_ssl=false"). Expose PROXMOX_DEV_MODE as an advanced boolean, wire it
in compose, and cross-reference the two fields in the wizard text and README.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vck5KSX2CLxhohx14nb5Sh
…oning tools Publishes a beta-channel pre-release from this PR (per the release-channel flow) that runs ghcr.io/pofallon/proxmoxmcp-plus:v0.5.15-hola.1 — upstream v0.5.15 plus update_vm_config / get_vm_ip_addresses / get_next_vmid (RekklesNA/ProxmoxMCP-Plus#127) — so an agent can provision disposable VMs through the app today. Digest-pinned, multi-arch. The stable version goes back to the upstream image once a release carries the tools. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vck5KSX2CLxhohx14nb5Sh
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Packages
RekklesNA/ProxmoxMCP-Plus(MIT) — an MCP server for Proxmox VE (nodes, VMs, containers, snapshots, backups, task logs) — so an AI agent can manage a Proxmox cluster through one authenticated endpoint athttps://proxmox-mcp.<HOLA_BASE_DOMAIN>/mcp.ghcr.io/rekklesna/proxmoxmcp-plus:v0.5.15(digest-pinned,linux/amd64+linux/arm64, runs as an unprivileged user). One service, no host ports, no data volume — the optional job store is ephemeral inside the container, soacceptsis intentionally empty.mcpblock rather than a repackage.PROXMOX_MCP_CONFIGfile is never mounted; the loader falls back to the wizard fields (host, API user, token name/secret required; port, TLS verification and the tool denylist as advanced fields). Verified against the loader source and by running the image.forward-authwithbypassPaths: ["/mcp"]— theremosetup-API pattern./mcpis exempted from the interactive Authentik login because the app protects it with its own generated bearer credential (MCP_API_KEY,generate: hex); MCP clients are not browsers, so a cookie gate would only lock them out. Everything else stays behind SSO.MCP_TOOL_DENYLISThidesdelete_vm, delete_container, delete_snapshot, rollback_snapshot(clearable in the wizard); guest command execution is additionally gated by upstream's deny-all command policy; DNS-rebinding protection allows only the public host plus loopback; the README tells operators to use a dedicated Proxmox user + token, notroot@pam./mcp(a 401 without the key) rather thancurl -f.remo.svg), noted inicons/README.md.One thing the smoke test caught
The MCP Python SDK's host allowlist matches a
host:*pattern only when theHostheader carries a port, and Traefik forwards the bare public host. An allowlist of just${HOLA_APP_HOST}:*answered 421 to every authenticated request behind a proxy. The compose therefore lists each host both bare and with:*; with that,initializereturns 200, a foreignHostis rejected with 421, and the unauthenticated probe returns 401 (all verified by running the pinned image locally).Checks
node bin/validate-manifest.mjs src/proxmox-mcp/src/manifest.json— OK./bin/build-catalog.shbuilds cleanly (entry looks right;catalog.jsonleft for CI to regenerate) andnode bin/validate-catalog.mjs— OKvalidateComposeDocumentfrom@hola/shared/compose-validateagainstcompose.yaml— 0 issuesverify-packageslayout checks replicated locally — passmcp-httpmode with env-only config: startup clean,POST /mcp initialize→ 200 with the bearer key, 401 without, 421 for a wrong hostNot yet done: an install on a disposable Hola VM against a real Proxmox host (
bin/lib/app-test.sh). The endpoint and auth path are exercised above; the Proxmox connection itself needs real credentials.🤖 Generated with Claude Code
https://claude.ai/code/session_01Vck5KSX2CLxhohx14nb5Sh
Update 2026-09-12 —
0.1.0-beta.1on the fork imageThe PR now publishes a beta-channel pre-release (
0.1.0-beta.1, published from this PR asghcr.io/try-hola/proxmox-mcp:0.1.0-beta.1) that runsghcr.io/pofallon/proxmoxmcp-plus:v0.5.15-hola.1— upstream v0.5.15 plus the VM provisioning tools proposed in RekklesNA/ProxmoxMCP-Plus#127 (update_vm_config,get_vm_ip_addresses,get_next_vmid). Also added:PROXMOX_DEV_MODE(upstream refuses unverified TLS without it) and the guest command-policy fields.Installed and exercised on a real Hola host (Authentik mode, PVE 9.1 lab):
hola install ghcr.io/try-hola/proxmox-mcp:0.1.0-beta.1 …→ running;/mcpanswers 401 without the key while/redirects to Authentik; a fullget_next_vmid → clone_vm → update_vm_config → start_vm → get_vm_ip_addresses → ssh → stop_vm → delete_vmcycle succeeded through the public endpoint.Once upstream ships the tools, the stable
0.1.0returns to the upstream image and the beta retires per the release-channel retention rule.