Proximo
Proximo is a trust-first MCP server for managing Proxmox infrastructure (PVE, PBS, PMG, PDM) with built-in safety controls: every mutation requires a dry-run plan first, is logged to a tamper-evident HMAC-keyed audit ledger, and is undoable via snapshot where supported.
Proxmox VE (PVE)
Read cluster resources, node/guest status, storage, SDN, identities, ACLs, HA configs, tasks, and backup freshness
Mutate VMs/containers: power ops, migrate, snapshot/rollback, config updates
Manage storage, firewall, SDN, realms, roles, users, and ACLs (all require
confirm=True)
Proxmox Backup Server (PBS)
List/inspect datastores, namespaces, snapshots, remotes, traffic controls, and scheduled jobs
Mutate: create/update/delete datastores and namespaces, prune snapshots, manage protection flags and notes, change backup group owners, manage remote sync sources and bandwidth throttle rules
Trigger garbage collection and integrity verification runs
Proxmox Mail Gateway (PMG)
Read node status, relay/spam config, managed domains, mail statistics, quarantine (spam/virus/attachment), Postfix queue info, service states, and tracking logs
Mutate: quarantine actions (deliver/delete/blocklist/welcomelist), manage domains and transport rules, update mynetworks and spam config, control services (start/stop/restart/reload)
Proxmox Datacenter Manager (PDM)
Read-only fleet view: list remotes, aggregated VM/LXC/storage resources, per-remote status and configs, tasks, ACLs, roles, users
Mutations: power operations, intra-cluster migration, cross-datacenter (remote) migration, snapshot create/delete/rollback for VMs and LXCs
Container & VM Execution (opt-in)
ct_exec– Run commands inside LXC containers via SSH, with dry-run planning and optional auto-snapshotct_psql– Run SQL inside containers as the DB OS userpve_agent_exec– Run commands inside QEMU VMs via qemu-guest-agent (allowlist-scoped)
Audit & Trust
audit_verify– Verify the tamper-evident HMAC-SHA256 hash-chained audit ledger; optionally check an off-box pinned head to detect forgery or truncation
Safety Controls (always on)
Every mutation returns a PLAN (blast radius + risk rating) before acting
All actions are recorded to a tamper-evident ledger (PROVE)
Destructive ops support auto-snapshot before execution, fail-closed if snapshot fails (UNDO)
Read-only diagnostics provide health checks (DIAGNOSE)
Multi-target: any tool can target a named remote via
proximo_targetUse
PROXIMO_SURFACESto load only needed tool categories and reduce context window usage
Provides tools for managing Proxmox VE, Proxmox Backup Server, Proxmox Mail Gateway, and Proxmox Datacenter Manager, including guest lifecycle, storage, snapshots, container exec, and a trust layer for safe AI-driven infrastructure operations.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Proximolist all VMs on node pve1"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Named for Proximo, the lanista of Gladiator. The story is the design, joint for joint.
He armed his fighter with exactly what he needed, never more. He answered for every move in the arena. A lanista, not a jailer.
The Spaniard doesn't get his name up front. He earns it, by conduct, on the record. The helmet comes off: truth said plainly, at cost. That's the "not yet proven, said plainly" section below, and AGENTS.md leading with Proximo's own sharp edges.
His last act opened the cages, holding the wooden sword of his own freedom. A tool should hope to end that well.
"Win the crowd and you will win your freedom."
The others make you choose. A read-only inspector that's safe because it can't touch anything. Or a loaded gun aimed at a cluster you care about.
Proximo refuses the trade. Every dangerous move is planned: see the blast radius first. Every move is proven: a tamper-evident record. And undoable wherever the platform gives us a primitive: a config change hands back the exact prior state, and a risky in-container command can take a snapshot first — and refuses to run if it can't.
Trust built into the substrate, not bolted on after. Hand an AI agent the keys; keep the receipts.
Sovereign and agent-agnostic. Your metal, your token, a ledger you own. No cloud, no phone-home, no standing server unless you opt in.
Don't take our word for any of it. Verify it yourself.
# 1. The tool count is real — ask the server itself, cold (=> 906).
# (in a clone of this repo, after `uv sync`)
uv run python -c "import asyncio; from proximo import server; \
print(len(asyncio.run(server.mcp.list_tools())))"
# 2. The container image is what the repo built — sigstore provenance (exit 0 = verified):
gh attestation verify oci://ghcr.io/john-broadway/proximo:latest --owner john-broadway
# 3. The security posture is graded by a third party, not by us:
# https://scorecard.dev/viewer/?uri=github.com/john-broadway/proximoThe rest is in VERIFY.md: forge a ledger byte and watch verify() refuse, grep
the outbound surface for phone-home (there is none). These checks work on any tool, from any
vendor. Demand them everywhere.
What it does
Ask, in plain English: "why is ct 105 thrashing?" An AI agent pulls node and guest status, tails the logs, and runs a diagnostic inside the container to find out.
If there's a fix, it shows you the plan before it touches anything. Takes a snapshot first if you ask it to — and won't run if it can't. Applies. Hands you a signed receipt of exactly what changed.
That's the product: a hypervisor an AI can operate without being able to wreck it.
Read-only by default. No mutation runs on the first call: it returns its blast radius as a plan for you to see first. A tamper-evident receipt for every change.
The comparison isn't Proximo vs. the GUI. It's Proximo vs. handing an LLM your root token and hoping.
Related MCP server: ProxmoxMCP-Plus
Quickstart
// your MCP client config (Claude Desktop / Claude Code / Cursor / …)
{
"mcpServers": {
"proximo": {
"command": "uvx",
"args": ["proximo-proxmox"],
"env": {
"PROXIMO_API_BASE_URL": "https://your-pve:8006/api2/json",
"PROXIMO_NODE": "your-node",
"PROXIMO_TOKEN_PATH": "/path/to/token-file" // USER@REALM!TOKENID=SECRET — by reference, never inlined
}
}
}
}Or install with one click:
Both prompt for the token file path; the secret never lands in client config. No token yet? uvx proximo-proxmox mint prints the least-privilege runbook.
Then preflight what your token can actually do (read-only):
uvx proximo-proxmox doctorStart with a read-only token. Proximo is useful long before you grant it write. Full token-first walkthrough: docs/SETUP.md · more install paths: Install & run.
Why Proximo exists
The Proxmox MCP landscape is split. API-based servers manage nodes and VMs but structurally cannot run a command inside an LXC: the REST API has no exec endpoint. SSH-based servers can, through broad shell access with little scoping.
Proximo builds the principled whole. Both halves, one audited surface, least-privilege. Trust by construction:
Read-only inspector | Full-access executor | Proximo | |
Can mutate | no — that's the safety | yes | yes — plan recorded first, then |
Preview before a change | n/a | rarely | default — blast radius + live state, every mutation |
Record of what happened | no | app logs, editable | keyed hash-chained ledger, tamper-evident, on by default |
Undo | n/a | rare | snapshot-first, wherever the platform can snapshot |
Command inside an LXC | no | broad SSH | opt-in, fail-closed CTID allowlist |
Products covered | usually PVE | usually PVE | PVE + PBS + PMG + PDM — one audited plane |
Verify the artifact you run | varies | varies | signed image · PyPI provenance · SBOM · Scorecard |
(The archetype columns describe the split above, not any specific project. There is no official Proxmox MCP; Proximo is a community project, standing on its own.)
The trust layer — what makes Proximo different
Four controls on by default:
Control | What it does |
PLAN | Every mutation first returns a recorded preview — the exact change, live state, blast radius, an advisory risk rating. Nothing mutates without its plan recorded; one |
PROVE | Keyed (HMAC-SHA256), hash-chained audit ledger — |
UNDO | Where the platform has a primitive: a config change returns its |
DIAGNOSE | Read-only evidence battery + node health → advisory flags that surface incompleteness too, so an empty list never reads as a false clean bill. |
Six more ship off until you configure them — per-plan CONSENT, a CONTAIN kill-switch, an arm-LEASE, an arm-time SCOPE, a FORBID/RATE ENVELOPE, and TAINT (the prompt-injection mitigation). What each one actually defends against: SECURITY.md.
Honesty note (load-bearing): risk ratings are an advisory heuristic, not a sandbox —
LOWmeans "no state change," not "safe," and the absence of aHIGHflag is not a safety signal. Review every change yourself. The floor beneath it all is the token you mint: Proxmox RBAC holds even if Proximo's process is fully compromised — a stronger guarantee than anything Proximo's own code provides. Scope it to exactly what you mean to grant: SECURITY.md.
Hold any tool to this, including this one: The Keys Test. Ten questions to ask before you hand an AI agent real infrastructure. Proximo's own scorecard published, partials included.
Demo
The record defends itself:
Surfaces & tools — one control plane
Surface | Backend | For |
Proxmox VE | REST API + scoped token | node/guest lifecycle, storage, SDN, identity, HA, firewall |
Proxmox Backup Server | REST API + scoped token | datastores, namespaces, snapshots, sync, GC, verify, tape |
Proxmox Mail Gateway | Ticket auth | mail flow, quarantine, filtering rules, domains, services |
Proxmox Datacenter Manager | API token | federated fleet — reads plus governed control (power/snapshot/migrate, dry-run-first) |
Container exec |
| run-command-in-container, |
Those backends are deliberately boring. Anyone can call them. The product is the trust layer over them.
906 tools is an estate, not a starting point — and you only carry the part you use. Since 0.30 the floor IS the default: a bare install serves the search-and-call facade (~1,449 tokens of context) with every tool this box serves still callable; one domain like pve.guests runs ~9,123, a whole plane ~97,432, PROXIMO_TOOLSETS=catalog the classic auto-scoped catalog. The estate is 906. The doorway is yours to size. Coverage and context stopped being the same number.
Where an operator actually starts:
You want to… | Start with | Worth knowing |
See the whole cluster at once |
| one call, every node |
Find out why a container is sick |
| read-only evidence battery |
Preflight a token / config |
| run this before wiring an agent |
Power / lifecycle |
| returns a PLAN first — nothing moves without |
Snapshot before touching anything |
| UNDO's foundation |
Check backups are actually fresh |
| walks real archives — "task OK" is never evidence |
Run a command in a container |
| opt-in ( |
Trace / release mail |
| full PMG plane behind it |
Operate the federated fleet |
| governed control, dry-run-first |
Prove the record wasn't touched |
| registered on every surface, always |
Every tool with typed inputs: docs/TOOLS.md · sizing the surface to your model: docs/SETUP.md.
Install & run
📦
0.30.0— on PyPI, GitHub, and GHCR (signed multi-arch image).New in 0.30.0 — the default door fits a local model. With nothing configured,
tools/listnow serves the search-and-call facade — ~1,449 tokens, 18% of a stock 8k window — instead of a ~97k catalog, with every tool this box serves still callable through it. Estate memory is on by default (PROXIMO_MEMORY=0opts out), so what-exists / what-changed / who-did-it answer in one call:audit_entriesreads the ledger back, and recall now states plainly what the map never holds.PROXIMO_TOOLSETS=catalogrestores the previous default by name,allthe full surface. Tool count 905 → 906.Recent: 0.29.0 put who asked in the PROVE ledger (principal tags, signed caller badges) and turned command-body redaction on by default. See SECURITY.md for what each control honestly holds.
Proximo runs on your machine, on demand. No daemon, no open port.
uvx proximo-proxmox # zero-install run (PyPI package: proximo-proxmox; command stays `proximo`)
# or: pip install proximo-proxmox the MCP core
# or: pip install "proximo-proxmox[a2a]" + the optional A2A face
# or: pip install "proximo-proxmox[http]" + the optional HTTP/OpenAPI face
# or: pip install "proximo-proxmox[mcp-http]" + the optional MCP-over-streamable-HTTP face
# or, from source: git clone https://github.com/john-broadway/proximo.git && cd proximo && uv pip install -e .Wire it into your MCP client as the command proximo, with the PROXIMO_* env vars — see packaging/proximo.env.example.
Docker (GHCR): docker run -i --rm … ghcr.io/john-broadway/proximo:latest. Multi-arch, SBOM, sigstore-signed provenance (gh attestation verify oci://ghcr.io/john-broadway/proximo --owner john-broadway). Mirrored to Docker Hub (docker.io/jebroadway/proximo, identical digest); GHCR stays the signed primary.
Safe by default: API-only out of the box. The two near-root edges are opt-in and say so loudly: LXC exec (
PROXIMO_ENABLE_EXEC=1, near-root on the host) and the qemu-guest-agent edge (PROXIMO_ENABLE_AGENT=1, near-root in a guest). Each is scoped by its own fail-closed allowlist.Smallest footprint by design: you don't have to load the whole estate — what a box serves is autoscoped to what it configures. A PBS-only box gets that plane's tools plus the always-on audit trail;
PROXIMO_SURFACES=pve,execregisters just that pair (316 tools); a typo'd surface refuses startup rather than serving a surprise. The default doorway (dynamic mode) keeps three search-and-call tools resident plus the two ledger tools (audit_verifyproves the chain,audit_entriesreads who did what) andproximo_recallwhile estate memory is on (the default;PROXIMO_MEMORY=0opts out) — with the full catalog reachable by name. That narrowing is guarded at every entry point (0.27.0 closed a path where an opt-in flag could silently cut the registry to 5 tools), and the gates don't shrink with the doorway: PLAN and PROVE apply however small the visible surface gets.
The network faces (experimental, opt-in): proximo-a2a speaks Agent2Agent. proximo-http serves plain HTTP + generated /openapi.json for no-code clients. proximo-mcp-http serves MCP itself over Streamable HTTP (the SDK's native transport) for networked MCP clients: no third-party stdio→HTTP bridge, so the perimeter stays Proximo's.
All three serve the full surface through the same spine as MCP. No second code path; trust spine and token scope inherited. Fail-closed perimeter: loopback, bearer-token required off-localhost, DNS-rebind and CSRF defended. Details: SECURITY.md.
At scale
One container is the demo. A cluster is the point.
The whole cluster in one call.
pve_cluster_resources: every VM, node, storage pool, SDN object.One tamper-evident record across every node. "Show me every state-changing action this month, and prove the log wasn't touched" becomes a query you can actually answer. No human at the CLI walks away with that.
Where the time comes back. On one node a senior at the CLI is faster, and that's fine. Across a dozen nodes and hundreds of guests, a bounded, audited agent earns its keep.
Many boxes, one Proximo: register remotes in a TOML file (secrets by reference, never inlined), point PROXIMO_TARGETS at it, aim any tool with proximo_target="edge-pve". The target travels with the call. PLAN and EXECUTE hit the same box, the ledger records which, cross-plane calls error. Config shape: packaging/targets.example.toml.
Status — the arena record
🩸 0.30.0 — the honest door became the default. A bare install used to serve ~97k tokens of schema — 12x over a stock local model's 8,192-token window, dead on connect. Now it serves six resident tools at ~1,449 with the whole estate still callable through them, measured end-to-end on a real adopter install. The residency call was settled by live model runs, not taste — and the same runs caught one fabricated answer, fixed in the response, not the prose.
Every release before it — every pillar, every redteam, every fix — lives in CHANGELOG.md.
The numbers, honestly: 906 MCP tools, proved in two deliberate layers. 11,000+ in-process tests (ruff + pyright clean) pin every tool's shape. A separate live-smoke harness drives real Proxmox hardware: a 3-node PVE 9.2 cluster, PBS 4.2, PMG 9.1, PDM 1.1.4, a real cross-datacenter move. The two are kept apart on purpose: passing shape tests never gets to masquerade as "works on a real host." And this workspace administers its own Proxmox estate through Proximo daily (dogfood). The blast-radius engine carries the destructive surface: across eleven op-classes it names the specific guests, nodes, principals, or disks at risk. Nothing falls back to a bare confirm.
Proven live (not mocks): the trust spine end-to-end; identity/storage/SDN/firewall/HA create→read→delete with the ledger verified throughout; offline + online live-migration and HA fencing (softdog) on a real 3-node cluster; full PBS/PMG/PDM planes including a real cross-datacenter move.
Not yet proven — said plainly: hardware-watchdog fencing (needs physical iTCO/IPMI) and behavior at production scale. The unrecoverable ops (SDN apply, etc.) are deliberately never fired live: proven by plan, held back by design, not a gap. Per-surface detail: CHANGELOG.md.
Documentation
Document | What it answers |
Token-first walkthrough: mint a least-privilege token, verify it, widen deliberately. | |
Every trust claim paired with the command that proves it — run them cold. | |
The two-deployment trust model, all ten controls, what each honestly holds, reporting. | |
What Proximo defends against, what it doesn't, where the boundaries sit. | |
All 906 tools, grouped by surface, typed inputs. | |
The page written for the agent itself — Proximo's sharp edges, stated first. | |
What's broken or odd right now, said plainly. | |
Dev setup, the CI gates, what a PR is expected to keep intact. | |
Every release, every redteam, every fix — the full build history. |
License
Apache-2.0 — chosen for the patent grant that suits infrastructure tooling. Full text in LICENSE.
Credits
Built by John Broadway with Claude and Maude — a human–AI partnership, and the first thing we made on this box to give away to the world. Claude Opus 4.8 built the trust pillars and the original tool surface and has carried the work since; Claude Fable 5 ran the 101-agent release audit and the first publish. Every commit carries its co-author trailer. And to meyergru, who put a real measurement on the table instead of an opinion — the context-cost work above exists because of that report.
"Are you not entertained?" — stars, issues, and sparring partners welcome. Strength and honor. ⚔️
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityDmaintenanceA Python-based server enabling interaction with Proxmox hypervisors. It supports secure authentication and provides tools for managing nodes, VMs, clusters, and storage.Last updated279MIT
- Alicense-qualityAmaintenanceAn enhanced Python-based MCP server that enables complete VM lifecycle management and monitoring of Proxmox virtualization platforms through natural language, with 11 REST API endpoints for seamless integration.Last updated354MIT
- Alicense-qualityDmaintenanceEnables comprehensive management of Proxmox Virtual Environment through 35 tools for VMs, containers, storage, backups, snapshots, and cluster operations via the Proxmox VE API.Last updated2022MIT
- AlicenseCqualityDmaintenanceEnables management of Proxmox VE infrastructure through natural language, providing 120+ tools to control virtual machines, containers, storage, cluster resources, users, and network configurations via the Proxmox API.Last updated10020MIT
Related MCP Connectors
Operate your Linux servers from your LLM. Every action runs through an auditable allowlist.
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Issue, rotate and revoke scoped API-key passes for 25+ providers — the agent never sees a real key
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/john-broadway/proximo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server