<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Broadway (Broadway)</title>
    <description>The latest articles on DEV Community by John Broadway (Broadway) (@john-broadway).</description>
    <link>https://dev.to/john-broadway</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3992101%2F76cb222e-b536-40a4-afc1-9fe08f4ce976.jpg</url>
      <title>DEV Community: John Broadway (Broadway)</title>
      <link>https://dev.to/john-broadway</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/john-broadway"/>
    <language>en</language>
    <item>
      <title>I didn't trust an AI with my Proxmox cluster — so I built one that can't surprise me</title>
      <dc:creator>John Broadway (Broadway)</dc:creator>
      <pubDate>Fri, 19 Jun 2026 21:00:43 +0000</pubDate>
      <link>https://dev.to/john-broadway/i-didnt-trust-an-ai-with-my-proxmox-cluster-so-i-built-one-that-cant-surprise-me-2k9l</link>
      <guid>https://dev.to/john-broadway/i-didnt-trust-an-ai-with-my-proxmox-cluster-so-i-built-one-that-cant-surprise-me-2k9l</guid>
      <description>&lt;p&gt;I wanted an AI agent that could actually &lt;em&gt;run&lt;/em&gt; my Proxmox cluster — create VMs, fix storage, tail logs inside a container — not just read it back to me. Then I pictured it deleting a storage pool and learning, at the exact second I did, which VMs just lost their boot disks. That image is why I never wired one up.&lt;/p&gt;

&lt;p&gt;So I built the version I'd actually trust: &lt;strong&gt;Proximo&lt;/strong&gt;, an open-source (Apache-2.0) Proxmox MCP + A2A server. The whole design goal is one sentence — &lt;em&gt;the AI has to show me what it's about to do before it does it, and I keep the receipts.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The two things on offer, and the third I wanted
&lt;/h3&gt;

&lt;p&gt;Go looking for a Proxmox MCP server today and you find two shapes: a &lt;strong&gt;read-mostly "safe inspector"&lt;/strong&gt; (the most-starred one is exactly this — a handful of read tools, popular &lt;em&gt;because&lt;/em&gt; it doesn't hold the knives), or a &lt;strong&gt;feature-rich mutator&lt;/strong&gt; you trust on faith. I wanted the third thing — full management I could point at a hypervisor I care about, with trust built into the substrate instead of bolted onto the door.&lt;/p&gt;

&lt;h3&gt;
  
  
  Four pillars, by construction
&lt;/h3&gt;

&lt;p&gt;Every tool inherits these; they aren't per-tool flags you can forget to set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PLAN&lt;/strong&gt; — every mutation is dry-run first. It returns the exact change, the guest's live state, and a &lt;em&gt;computed blast radius&lt;/em&gt;. Delete a storage and it doesn't just warn "this is dangerous" — it reads the cluster and names the guests that lose a disk:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;dry-run&lt;span class="o"&gt;)&lt;/span&gt; pve_storage_delete &lt;span class="nv"&gt;storage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;local-zfs
&lt;span class="go"&gt;PLAN — RISK_HIGH
  affected (cluster-wide):
    - vm/104  won't-boot   (boot disk scsi0 on local-zfs)
    - vm/210  won't-boot   (only copy of scsi0)
    - ct/301  degraded     (mp1 data volume on local-zfs)
&lt;/span&gt;&lt;span class="gp"&gt;  recorded to ledger: chain ok (#&lt;/span&gt;1438&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;  -&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;you cannot mutate without this plan existing first
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In 0.6.0 that blast-radius reasoning spans the destructive surface — storage, disk-move, firewall rules (reach + lockout), network-apply, guest-destroy, ACL changes, migrations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PROVE&lt;/strong&gt; — a hash-chained, tamper-evident audit ledger. Plans and confirmations both land in it; the trail is verifiable after the fact, and it lives on &lt;em&gt;your&lt;/em&gt; box, not a SaaS dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UNDO&lt;/strong&gt; — auto-snapshot before a risky change (fail-closed if the storage can't snapshot), one-call rollback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DIAGNOSE&lt;/strong&gt; — a read-only evidence battery where an empty findings list never reads as a false clean bill.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Safe by default, honest about the sharp edge
&lt;/h3&gt;

&lt;p&gt;Proximo is &lt;strong&gt;API-only out of the box&lt;/strong&gt; — the hypervisor itself is never touched; management goes over the Proxmox REST API with a scoped token. The one genuinely sharp edge is running a command &lt;em&gt;inside&lt;/em&gt; an LXC: the REST API has no container-exec endpoint at all (it lives in &lt;code&gt;lxc-attach&lt;/code&gt;), so most API-based servers structurally can't do it. Proximo can — over your existing ssh — but it's &lt;strong&gt;opt-in&lt;/strong&gt; (&lt;code&gt;PROXIMO_ENABLE_EXEC=1&lt;/code&gt;), gated by a fail-closed CTID allowlist, and it says plainly that it grants near-root. The token is never read or logged.&lt;/p&gt;

&lt;h3&gt;
  
  
  The honesty section (because the tool is about trust)
&lt;/h3&gt;

&lt;p&gt;I'd rather you trust the project than the marketing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's &lt;strong&gt;v0.6.0, days old, zero adoption.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;145 tools, 2394 tests — but most of that surface still runs against mocks.&lt;/strong&gt; &lt;em&gt;Live-proven&lt;/em&gt; against a real PVE 9.2 API: the trust spine end-to-end, the governance/dangerous plane (roles/groups/users/ACLs, storage, SDN/network, realms), offline guest migration, HA-config — full create→read→delete with the ledger verified. &lt;strong&gt;Not&lt;/strong&gt; proven: HA fencing (needs a hardware watchdog), online live-migration (needs shared storage), production scale.&lt;/li&gt;
&lt;li&gt;Risk ratings are an &lt;strong&gt;advisory heuristic, not a sandbox.&lt;/strong&gt; &lt;code&gt;LOW&lt;/code&gt; means "no state change," not "safe."&lt;/li&gt;
&lt;li&gt;I'm &lt;strong&gt;not&lt;/strong&gt; claiming first, most tools, or "the only one with trust." &lt;code&gt;proxxx&lt;/code&gt; (a Rust cockpit with a pre-flight risk gate, an HMAC-keyed audit chain, and Telegram human-in-the-loop) and RekklesNA's ProxmoxMCP-Plus (command policy + approval tokens) both have real trust mechanisms. Proximo's specific bet is trust &lt;em&gt;by construction across the whole control plane&lt;/em&gt;, plus auto-UNDO and exposing the governance plane to the agent at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's a tailwind that isn't just my opinion: the &lt;strong&gt;OWASP MCP Top 10&lt;/strong&gt; now lists "Lack of Audit and Telemetry," and the official MCP security guidance explicitly names "blast radius" and "irrecoverable data loss on the host." PROVE is that recognized need, built; PLAN and UNDO go a step &lt;em&gt;beyond&lt;/em&gt; what the spec has codified — ahead of the standard, not blessed by it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it was built (the honest version)
&lt;/h3&gt;

&lt;p&gt;The direction, the design calls, and the trust model are mine — but I didn't build it alone, and I'd rather say so than have you wonder. It's an open human+AI partnership: &lt;strong&gt;Claude&lt;/strong&gt; (Anthropic's model) did much of the actual implementation, and &lt;strong&gt;Maude&lt;/strong&gt; (my own Claude-helper plugin) is the gates and second-lens that watched the work. Every commit carries its co-author trailer. For a tool whose whole pitch is transparency, telling you exactly how it was made felt like part of the deal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it / break it
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx proximo-proxmox
&lt;span class="c"&gt;# or: pip install proximo-proxmox&lt;/span&gt;
&lt;span class="c"&gt;# A2A face: pip install 'proximo-proxmox[a2a]' &amp;amp;&amp;amp; proximo-a2a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wire it into your MCP client (Claude Desktop/Code, Cursor, …) as the &lt;code&gt;proximo&lt;/code&gt; command with &lt;code&gt;PROXIMO_*&lt;/code&gt; env vars.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/john-broadway/proximo" rel="noopener noreferrer"&gt;https://github.com/john-broadway/proximo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PyPI: &lt;a href="https://pypi.org/project/proximo-proxmox/" rel="noopener noreferrer"&gt;https://pypi.org/project/proximo-proxmox/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's early, and I'd genuinely rather find the holes now than after someone trusts it with a real cluster. The blast-radius logic, the trust model, whether the honesty holds up — tear it apart in the comments or in an issue.&lt;/p&gt;

</description>
      <category>proxmox</category>
      <category>mcp</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
