@soyrageagency/proxmox-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +792 -0
  3. package/dist/assets.d.ts +18 -0
  4. package/dist/assets.js +53 -0
  5. package/dist/assets.js.map +1 -0
  6. package/dist/branding.d.ts +28 -0
  7. package/dist/branding.js +58 -0
  8. package/dist/branding.js.map +1 -0
  9. package/dist/config.d.ts +70 -0
  10. package/dist/config.js +119 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/index.d.ts +14 -0
  13. package/dist/index.js +89 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/logger.d.ts +23 -0
  16. package/dist/logger.js +65 -0
  17. package/dist/logger.js.map +1 -0
  18. package/dist/plugins.d.ts +32 -0
  19. package/dist/plugins.js +149 -0
  20. package/dist/plugins.js.map +1 -0
  21. package/dist/proxmox/client.d.ts +153 -0
  22. package/dist/proxmox/client.js +620 -0
  23. package/dist/proxmox/client.js.map +1 -0
  24. package/dist/resilience/backup-verifier.d.ts +28 -0
  25. package/dist/resilience/backup-verifier.js +222 -0
  26. package/dist/resilience/backup-verifier.js.map +1 -0
  27. package/dist/resilience/dr-drill.d.ts +17 -0
  28. package/dist/resilience/dr-drill.js +138 -0
  29. package/dist/resilience/dr-drill.js.map +1 -0
  30. package/dist/resilience/engine.d.ts +68 -0
  31. package/dist/resilience/engine.js +151 -0
  32. package/dist/resilience/engine.js.map +1 -0
  33. package/dist/resilience/patch-orchestrator.d.ts +31 -0
  34. package/dist/resilience/patch-orchestrator.js +188 -0
  35. package/dist/resilience/patch-orchestrator.js.map +1 -0
  36. package/dist/resilience/report.d.ts +33 -0
  37. package/dist/resilience/report.js +264 -0
  38. package/dist/resilience/report.js.map +1 -0
  39. package/dist/resilience/runbook.d.ts +42 -0
  40. package/dist/resilience/runbook.js +165 -0
  41. package/dist/resilience/runbook.js.map +1 -0
  42. package/dist/resilience/signing.d.ts +43 -0
  43. package/dist/resilience/signing.js +107 -0
  44. package/dist/resilience/signing.js.map +1 -0
  45. package/dist/resilience/types.d.ts +150 -0
  46. package/dist/resilience/types.js +14 -0
  47. package/dist/resilience/types.js.map +1 -0
  48. package/dist/resilience/util.d.ts +16 -0
  49. package/dist/resilience/util.js +32 -0
  50. package/dist/resilience/util.js.map +1 -0
  51. package/dist/tools/about.d.ts +14 -0
  52. package/dist/tools/about.js +54 -0
  53. package/dist/tools/about.js.map +1 -0
  54. package/dist/tools/backups.d.ts +15 -0
  55. package/dist/tools/backups.js +91 -0
  56. package/dist/tools/backups.js.map +1 -0
  57. package/dist/tools/cluster.d.ts +12 -0
  58. package/dist/tools/cluster.js +48 -0
  59. package/dist/tools/cluster.js.map +1 -0
  60. package/dist/tools/context.d.ts +30 -0
  61. package/dist/tools/context.js +12 -0
  62. package/dist/tools/context.js.map +1 -0
  63. package/dist/tools/guests.d.ts +15 -0
  64. package/dist/tools/guests.js +96 -0
  65. package/dist/tools/guests.js.map +1 -0
  66. package/dist/tools/lifecycle.d.ts +16 -0
  67. package/dist/tools/lifecycle.js +93 -0
  68. package/dist/tools/lifecycle.js.map +1 -0
  69. package/dist/tools/management.d.ts +17 -0
  70. package/dist/tools/management.js +135 -0
  71. package/dist/tools/management.js.map +1 -0
  72. package/dist/tools/nodes.d.ts +12 -0
  73. package/dist/tools/nodes.js +44 -0
  74. package/dist/tools/nodes.js.map +1 -0
  75. package/dist/tools/provisioning.d.ts +16 -0
  76. package/dist/tools/provisioning.js +122 -0
  77. package/dist/tools/provisioning.js.map +1 -0
  78. package/dist/tools/resilience.d.ts +21 -0
  79. package/dist/tools/resilience.js +116 -0
  80. package/dist/tools/resilience.js.map +1 -0
  81. package/dist/tools/snapshots.d.ts +17 -0
  82. package/dist/tools/snapshots.js +89 -0
  83. package/dist/tools/snapshots.js.map +1 -0
  84. package/dist/tools/storage.d.ts +11 -0
  85. package/dist/tools/storage.js +39 -0
  86. package/dist/tools/storage.js.map +1 -0
  87. package/dist/tools/tasks.d.ts +11 -0
  88. package/dist/tools/tasks.js +43 -0
  89. package/dist/tools/tasks.js.map +1 -0
  90. package/dist/tui/ansi.d.ts +63 -0
  91. package/dist/tui/ansi.js +115 -0
  92. package/dist/tui/ansi.js.map +1 -0
  93. package/dist/tui/app.d.ts +109 -0
  94. package/dist/tui/app.js +904 -0
  95. package/dist/tui/app.js.map +1 -0
  96. package/dist/tui/box.d.ts +18 -0
  97. package/dist/tui/box.js +38 -0
  98. package/dist/tui/box.js.map +1 -0
  99. package/dist/tui/index.d.ts +20 -0
  100. package/dist/tui/index.js +65 -0
  101. package/dist/tui/index.js.map +1 -0
  102. package/dist/update/channel.d.ts +69 -0
  103. package/dist/update/channel.js +165 -0
  104. package/dist/update/channel.js.map +1 -0
  105. package/dist/update/notice.d.ts +11 -0
  106. package/dist/update/notice.js +27 -0
  107. package/dist/update/notice.js.map +1 -0
  108. package/dist/utils/format.d.ts +21 -0
  109. package/dist/utils/format.js +63 -0
  110. package/dist/utils/format.js.map +1 -0
  111. package/dist/utils/result.d.ts +25 -0
  112. package/dist/utils/result.js +26 -0
  113. package/dist/utils/result.js.map +1 -0
  114. package/package.json +87 -0
  115. package/scripts/install.mjs +301 -0
package/README.md ADDED
@@ -0,0 +1,792 @@
1
+ <div align="center">
2
+
3
+ <a href="https://soyrage.es/">
4
+ <img src="./assets/soyrage-banner.svg" alt="SoyRage Agency — Full-Stack Developer × Infrastructure Engineer · soyrage.es" width="100%">
5
+ </a>
6
+
7
+ <br/>
8
+
9
+ # 🖥️ Proxmox MCP Server
10
+
11
+ **Chat with your Proxmox VE cluster.** A [Model Context Protocol](https://modelcontextprotocol.io) server that turns any MCP‑capable AI — Claude Desktop, Cursor, Continue, Zed — into a natural‑language operator for **Proxmox Virtual Environment**: nodes, QEMU VMs, LXC containers, storage, tasks and snapshots.
12
+
13
+ *“List my VMs and which are down.” · “How much RAM is `web` (VMID 101) using?” · “Snapshot `db` before I upgrade it.” · “Gracefully shut down container 200.”*
14
+
15
+ <br/>
16
+
17
+ <img src="./assets/screenshots/tui-dashboard.png" alt="Proxmox MCP Server terminal dashboard by SoyRage Agency — tabs, live gauges, guest OS, snapshots and one-key actions" width="88%">
18
+
19
+ <sub>💻 The built‑in **`proxmox-mcp-tui`** terminal dashboard — tabbed views (Guests · Nodes · Storage · Tasks), live CPU/memory/disk gauges, guest **OS**, search, snapshots and one‑key actions. <a href="#-the-terminal-ui-tui">More screenshots ↓</a></sub>
20
+
21
+ <br/><br/>
22
+
23
+ [![CI](https://github.com/soyrageagency/proxmox-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/soyrageagency/proxmox-mcp-server/actions/workflows/ci.yml)
24
+ [![Node](https://img.shields.io/badge/Node-%3E%3D18-3c873a?logo=node.js&logoColor=white)](https://nodejs.org)
25
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.5-3178c6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
26
+ [![MCP](https://img.shields.io/badge/MCP-1.x-6E56CF)](https://modelcontextprotocol.io)
27
+ [![Proxmox VE](https://img.shields.io/badge/Proxmox-VE%20API-E57000?logo=proxmox&logoColor=white)](https://pve.proxmox.com/pve-docs/api-viewer/)
28
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green)](./LICENSE)
29
+
30
+ ### Designed, built & maintained by **[SoyRage Agency](https://soyrage.es/)** · **https://soyrage.es/**
31
+
32
+ **⚡ New here? Install in one command → [Quick install](#-quick-install-one-command).**
33
+
34
+ </div>
35
+
36
+ > 🐳 Looking for the Docker equivalent? See the sister project **[docker-mcp-server](https://github.com/soyrageagency/docker-mcp-server)** — same philosophy, for Docker & Compose.
37
+
38
+ ---
39
+
40
+ <div align="center">
41
+
42
+ ## 🛡️ NEW — Resilience & Compliance
43
+
44
+ **Stop *hoping* your backups work. Prove it — with signed evidence auditors accept.**
45
+
46
+ </div>
47
+
48
+ Three new capabilities turn Proxmox MCP Server from “operate the cluster” into “**prove the cluster survives a disaster**” — each one producing a **cryptographically-signed, dated report** mapped to **ISO 27001 · NIS2 · DORA**:
49
+
50
+ | | Capability | What it does |
51
+ | :--: | --- | --- |
52
+ | ✅ | **[Automated backup verification](#-resilience--compliance-new)** | Restores your latest `vzdump` into an **isolated, ephemeral VM**, boots it, runs health checks (service up, database responds, key-file checksums), destroys it, and signs a dated report. Almost nobody tests their restores — now it's automatic. |
53
+ | 🔁 | **[Patch orchestration with auto-rollback](#-resilience--compliance-new)** | Snapshot → apply updates → health check → **if it fails, roll back automatically**. In dependency order, within a maintenance window. Kills the *“I don't touch that server because I can't undo it”* fear. |
54
+ | 🎯 | **[Scheduled DR drills](#-resilience--compliance-new)** | Executes a declarative **YAML runbook** against an isolated test env and generates the drill minutes (*“acta”*). No more DR plan rotting in a 2019 Word doc nobody ever ran. |
55
+
56
+ <div align="center">
57
+ <img src="./assets/screenshots/evidence-report.png" alt="Signed ISO 27001 / NIS2 / DORA backup-verification evidence report generated by Proxmox MCP Server" width="82%">
58
+ <br/>
59
+ <sub>A signed, dated restore-verification report — exactly the evidence ISO 27001, NIS2 and DORA ask for. <a href="#-resilience--compliance-new">Read more ↓</a></sub>
60
+ </div>
61
+
62
+ ---
63
+
64
+ ## 📑 Table of contents
65
+
66
+ - [Quick install (one command)](#-quick-install-one-command)
67
+ - [What is this?](#-what-is-this)
68
+ - [Feature overview](#-feature-overview)
69
+ - [🛡️ Resilience & Compliance (NEW)](#-resilience--compliance-new)
70
+ - [How it works](#-how-it-works)
71
+ - [Requirements](#-requirements)
72
+ - [Installation](#-installation)
73
+ - [The terminal UI (TUI)](#-the-terminal-ui-tui)
74
+ - [Create a Proxmox API token](#-create-a-proxmox-api-token)
75
+ - [Connecting to your AI client](#-connecting-to-your-ai-client)
76
+ - [Configuration reference](#-configuration-reference)
77
+ - [TLS & self‑signed certificates](#-tls--self-signed-certificates)
78
+ - [Security model & networking](#-security-model--networking)
79
+ - [Complete tool reference](#-complete-tool-reference)
80
+ - [Example conversations](#-example-conversations)
81
+ - [Modular plugin architecture](#-modular-plugin-architecture)
82
+ - [Project structure](#-project-structure)
83
+ - [Development](#-development)
84
+ - [Troubleshooting & FAQ](#-troubleshooting--faq)
85
+ - [Roadmap](#-roadmap)
86
+ - [Support the project](#-support-the-project)
87
+ - [Credits & License](#-credits--license)
88
+
89
+ ---
90
+
91
+ ## ⚡ Quick install (one command)
92
+
93
+ > **Already use an MCP client?** Point it at the published package — nothing to clone or build:
94
+ >
95
+ > ```jsonc
96
+ > "proxmox": {
97
+ > "command": "npx",
98
+ > "args": ["-y", "@soyrageagency/proxmox-mcp"],
99
+ > "env": { "PROXMOX_HOST": "https://192.168.1.10:8006", "PROXMOX_TOKEN_ID": "root@pam!mcp", "PROXMOX_TOKEN_SECRET": "…" }
100
+ > }
101
+ > ```
102
+ >
103
+ > Or try the terminal dashboard straight away: `npx -y -p @soyrageagency/proxmox-mcp proxmox-mcp-tui`
104
+
105
+ > **Just want the terminal dashboard? No Node required.** Install the standalone `rageprox` binary — a Node runtime and the app fused into one file:
106
+ >
107
+ > **Windows (PowerShell):**
108
+ > ```powershell
109
+ > irm https://raw.githubusercontent.com/soyrageagency/proxmox-mcp-server/main/scripts/install.ps1 | iex
110
+ > ```
111
+ > **macOS / Linux:**
112
+ > ```sh
113
+ > curl -fsSL https://raw.githubusercontent.com/soyrageagency/proxmox-mcp-server/main/scripts/install.sh | sh
114
+ > ```
115
+ > Then run `rageprox` (preview with `PROXMOX_MCP_DEMO=true rageprox`). Re-run the installer any time to update — and the app tells you when a new version ships.
116
+ >
117
+ > Prefer the MCP-server-for-Claude-Desktop path (with the config wizard)? Use the Node installer below.
118
+
119
+ **Never done this before? It's 3 steps and about 3 minutes.** You do **not** need to touch any config file — a friendly wizard asks you a few questions and sets up everything.
120
+
121
+ #### ✅ Step 1 — Install the two things you need (once)
122
+
123
+ - [**Node.js**](https://nodejs.org/) (click the big green “LTS” button, next‑next‑finish).
124
+ - [**Git**](https://git-scm.com/downloads).
125
+
126
+ #### ✅ Step 2 — Run one command
127
+
128
+ <table>
129
+ <tr><td><b>🪟 Windows</b><br/><sub>PowerShell</sub></td><td>
130
+
131
+ ```powershell
132
+ irm https://raw.githubusercontent.com/soyrageagency/proxmox-mcp-server/main/install.ps1 | iex
133
+ ```
134
+
135
+ </td></tr>
136
+ <tr><td><b>🍎 macOS / 🐧 Linux</b><br/><sub>Terminal</sub></td><td>
137
+
138
+ ```bash
139
+ curl -fsSL https://raw.githubusercontent.com/soyrageagency/proxmox-mcp-server/main/install.sh | bash
140
+ ```
141
+
142
+ </td></tr>
143
+ </table>
144
+
145
+ #### ✅ Step 3 — Copy‑paste your details when the wizard asks
146
+
147
+ That's it — the wizard walks you through it and **tests the connection** for you:
148
+
149
+ ```text
150
+ This wizard sets everything up in under a minute. You'll need:
151
+ 1. Your Proxmox web address (the one you log in to).
152
+ 2. An API token (safest) — or your Proxmox username + password.
153
+
154
+ Proxmox address (e.g. https://192.168.1.10:8006): https://10.0.0.11:8006
155
+ Do you have an API token? (Y/n): y
156
+ Token ID (user@realm!name, e.g. root@pam!mcp): root@pam!mcp
157
+ Token secret (paste the UUID): ••••••••-••••-••••-••••-••••••••••••
158
+ Verify the TLS certificate? (most Proxmox use self-signed → No) (y/N): n
159
+ Read-only mode? (view only — safest) (y/N): n
160
+
161
+ Testing the connection…
162
+ ✓ Connected to Proxmox VE (8.2.4)
163
+ ✓ Saved credentials to .env
164
+ ✓ Added the "proxmox" server in your Claude config.
165
+
166
+ All set! → restart Claude Desktop and ask "List my Proxmox VMs."
167
+ ```
168
+
169
+ **Then restart Claude Desktop and say: *“List my Proxmox VMs and containers.”*** 🎉
170
+
171
+ <details><summary><b>Don't have an API token yet? (create one in ~20 seconds)</b></summary>
172
+
173
+ In the Proxmox web UI: **Datacenter → Permissions → API Tokens → Add**, pick user `root@pam`, name it `mcp`, and **copy the secret** (shown once). Your token ID is `root@pam!mcp`. Full details in [Create a Proxmox API token](#-create-a-proxmox-api-token). Prefer not to now? The wizard also accepts your **username + password**.
174
+ </details>
175
+
176
+ <details><summary><b>Already cloned the repo, or want to re-run setup?</b></summary>
177
+
178
+ Run **`npm run setup`** from the project folder. The installer **backs up** and **merges** your existing Claude config, so other MCP servers are preserved.
179
+ </details>
180
+
181
+ <details><summary><b>No Proxmox cluster to test with?</b></summary>
182
+
183
+ Try [**demo mode**](#-try-it-instantly--demo-mode-no-proxmox-needed) — realistic fake data, no host needed.
184
+ </details>
185
+
186
+ ---
187
+
188
+ ## 🧭 What is this?
189
+
190
+ The **Model Context Protocol (MCP)** is an open standard that lets AI assistants talk to external tools over a well‑defined JSON‑RPC interface. **Proxmox MCP Server** is an MCP *server* that speaks that protocol over **stdio** and exposes your [Proxmox VE](https://www.proxmox.com/en/proxmox-virtual-environment) cluster as a set of safe, richly‑described tools.
191
+
192
+ Point any MCP‑capable assistant at it and you can operate your virtualization stack **in plain language** — the model reads each tool's schema, decides which to call against the Proxmox REST API, and reports the results back to you. Built for **home‑labbers** and **sysadmins** who'd rather ask than remember `qm` and `pct` flags.
193
+
194
+ ---
195
+
196
+ ## 🚀 Feature overview
197
+
198
+ | Area | Capabilities |
199
+ | --- | --- |
200
+ | 🧭 **Cluster** | List nodes with load, node status, cluster quorum/membership, and a consolidated `cluster_resources` view. |
201
+ | 🖥️ **Guests** | List QEMU **VMs** and **LXC** containers (filter by kind / running), live status, full config, and **guest OS** (via the QEMU agent — name, version, IPs). |
202
+ | ⚙️ **Lifecycle** | Start · graceful **shutdown** · hard **stop** · reboot · **suspend/resume** — for VMs and containers. |
203
+ | 🚚 **Management** | **Migrate** to another node · **clone** (from templates) · **resize** CPU/RAM · **delete**. |
204
+ | 📦 **Backups** | **Backup** (vzdump) · **list** archives · **restore** into a VMID. |
205
+ | 🧱 **Provisioning** | **List templates/ISOs** · **create** LXC containers and QEMU VMs. |
206
+ | 📸 **Snapshots** | List, **create** (optionally with RAM), **rollback** and **delete** snapshots. |
207
+ | 🛡️ **Resilience & Compliance** | **Restore-test** backups in an isolated VM · **patch** with automatic rollback · run **DR drills** — each producing a **signed ISO 27001 / NIS2 / DORA evidence report**. [See ↑](#-resilience--compliance-new) |
208
+ | 💾 **Storage** | List storages per node with type, content and usage. |
209
+ | 🧾 **Tasks** | Recent task log per node (backups, migrations, actions…). |
210
+ | ⌨️ **Terminal UI** | A creative, lazydocker‑style TUI (`proxmox-mcp-tui`) with live gauges, guest OS, and one‑key actions. |
211
+ | 🛡️ **Safety** | Global **read‑only** mode · **guest allowlist** (by VMID or name) · TLS verification control. |
212
+ | 🔐 **Auth** | API **token** (recommended) or username/password **ticket** auth. |
213
+ | 🧩 **Modular** | Every capability is a toggleable **plugin** — expose exactly the surface you want. |
214
+ | 🧱 **Engineering** | 100% TypeScript, strict mode · tiny dependency surface · stderr‑only logging. |
215
+
216
+ ---
217
+
218
+ ## 🛠️ How it works
219
+
220
+ ```
221
+ ┌──────────────────────────────────────────────┐
222
+ You ◀──────▶ │ AI assistant (Claude / Cursor / Continue …) │
223
+ └───────────────────────┬──────────────────────┘
224
+ stdio · JSON‑RPC (MCP)
225
+ ┌───────────────────────▼──────────────────────┐
226
+ │ Proxmox MCP Server │
227
+ │ config → auth → tool call → Proxmox API │
228
+ └───────────────────────┬──────────────────────┘
229
+ HTTPS · /api2/json (token or ticket)
230
+ ┌───────────────────────▼──────────────────────┐
231
+ │ Proxmox VE node / cluster (:8006) │
232
+ └───────────────────────────────────────────────┘
233
+ ```
234
+
235
+ The server calls the **Proxmox VE REST API** (`https://<host>:8006/api2/json`). It resolves each guest's node automatically from `/cluster/resources`, so you address VMs and containers simply by **VMID or name** — no need to know which node they live on.
236
+
237
+ ---
238
+
239
+ ## ✅ Requirements
240
+
241
+ | Requirement | Notes |
242
+ | --- | --- |
243
+ | **Node.js ≥ 18** | ES modules + global `fetch`. Node 20+ recommended. |
244
+ | **A Proxmox VE 7/8 node or cluster** | Reachable on its API port (`8006`). |
245
+ | **An API token** (recommended) | Or a user/password. See [Create a Proxmox API token](#-create-a-proxmox-api-token). |
246
+ | **An MCP client** | Claude Desktop, Cursor, Continue, Zed, or the MCP Inspector. |
247
+
248
+ ---
249
+
250
+ ## 📦 Installation
251
+
252
+ ```bash
253
+ git clone https://github.com/soyrageagency/proxmox-mcp-server.git
254
+ cd proxmox-mcp-server
255
+ npm install
256
+ npm run build
257
+ ```
258
+
259
+ ### 🧪 Try it instantly — demo mode (no Proxmox needed)
260
+
261
+ Want to evaluate it right now without a cluster? Run in **demo mode** — the
262
+ server serves a believable 2‑node lab (VMs, containers, storage, snapshots):
263
+
264
+ ```bash
265
+ npm run build
266
+ PROXMOX_MCP_DEMO=true npm run inspect # explore every tool in the MCP Inspector
267
+ ```
268
+
269
+ Or point Claude Desktop at it with `"PROXMOX_MCP_DEMO": "true"` in the `env`
270
+ block and ask *“List my Proxmox VMs and containers.”* You'll get output like:
271
+
272
+ ```
273
+ VMID KIND NAME NODE STATUS CPU MEMORY UPTIME
274
+ 100 VM web pve running 3.1% 1.8 GB/4.0 GB 22d 23h
275
+ 101 VM db pve running 8.7% 6.2 GB/8.0 GB 22d 23h
276
+ 200 CT nginx-proxy pve running 0.4% 96.0 MB/512 MB 22d 22h
277
+ 201 CT grafana pve running 1.2% 240 MB/2.0 GB 13d 21h
278
+ ```
279
+
280
+ When you're ready, set `PROXMOX_MCP_DEMO=false` and add your real host + token.
281
+
282
+ ### With a real cluster
283
+
284
+ ```bash
285
+ npm run inspect # after setting PROXMOX_HOST + token (see below)
286
+ ```
287
+
288
+ ---
289
+
290
+ ## ⌨️ The terminal UI (TUI)
291
+
292
+ Prefer the terminal? Launch **`proxmox-mcp-tui`** — a creative, professional, [lazydocker](https://github.com/jesseduffield/lazydocker)‑style dashboard for your cluster that opens with a SoyRage Agency welcome, then drops you into a live, keyboard‑driven view. Hand‑rolled ANSI, **zero UI dependencies**.
293
+
294
+ ```bash
295
+ npm run build
296
+ npm run tui # → interactive terminal dashboard
297
+ npm run tui:demo # same, with realistic mock data (no cluster needed)
298
+ ```
299
+
300
+ <div align="center">
301
+
302
+ ### A warm welcome
303
+ <img src="./assets/screenshots/tui-welcome.png" alt="SoyRage Agency Proxmox terminal welcome" width="80%">
304
+
305
+ ### Guests — OS, live gauges & one‑key actions
306
+ <img src="./assets/screenshots/tui-dashboard.png" alt="Proxmox MCP terminal UI by SoyRage Agency" width="92%">
307
+
308
+ ### Tabbed views — Nodes · Storage · Tasks
309
+ <img src="./assets/screenshots/tui-storage.png" alt="Proxmox MCP terminal UI storage view by SoyRage Agency" width="92%">
310
+
311
+ ### 🤖 Give orders to the AI — in plain language
312
+ <img src="./assets/screenshots/tui-ai.png" alt="Proxmox MCP terminal UI AI command bar by SoyRage Agency" width="92%">
313
+
314
+ ### 🛡️ Resilience tab — restore-tests, patch runs & DR drills at a glance
315
+ <img src="./assets/screenshots/tui-resilience.png" alt="Proxmox MCP terminal UI Resilience & Compliance tab by SoyRage Agency — backup verification, patch orchestration and DR drills with signed evidence" width="92%">
316
+
317
+ <sub>Rendered in <b>demo mode</b> · watermarked © SoyRage Agency · soyrage.es</sub>
318
+
319
+ </div>
320
+
321
+ **Features**
322
+
323
+ - **Tabbed views** — `1` Guests · `2` Nodes · `3` Storage · `4` Tasks · `5` **Resilience** (or `Tab` to cycle), each with column headers and usage bars.
324
+ - **🛡️ Resilience tab** — the last verdict for backup verification, patch orchestration and DR drills, with measured RTO/RPO and the signing fingerprint. Press **`g`** to run the selected capability and write fresh signed evidence.
325
+ - **🤖 AI command bar** — press **`a`** and type an order in plain English: *“restart db”*, *“shutdown 200”*, *“which VMs are down?”*, *“how much RAM is web using?”*. The AI proposes the action and asks you to **confirm** before it runs — questions get an instant answer. Powered by any OpenAI‑compatible endpoint (OpenAI, **Ollama**, LM Studio…); demo mode simulates it.
326
+ - **Live** — a clock and cluster name in the header, auto‑refreshing every 5 s.
327
+ - **Search** — press `/` to filter guests by name or VMID.
328
+ - **Help overlay** — press `?` for a keyboard cheat‑sheet.
329
+ - **Safe actions** — destructive `stop` and every AI action ask for a `y/n` confirmation; read‑only mode hides all action keys.
330
+ - **Rich details** — the selected guest shows its **OS** (via the QEMU agent), CPU/memory/disk gauges, cores and uptime; press `s` for its snapshots.
331
+
332
+ **Keys:** `1‑5`/`Tab` views · `↑/↓` (or `j/k`) navigate · `/` filter · **`a` ask AI** · **`g` run resilience** · `s` snapshots · `S` start · `d` shutdown · `x` stop · `b` reboot · `r` refresh · `?` help · `q` quit. VMs are cyan, containers magenta.
333
+
334
+ > 💡 Enable the AI with `PROXMOX_MCP_AI_ENDPOINT` (+ `_KEY`, `_MODEL`). Works with **Ollama** locally for free. Without it, the bar still understands common orders via a built‑in rule engine.
335
+
336
+ ---
337
+
338
+ ## 🛡️ Resilience & Compliance (NEW)
339
+
340
+ Anyone can *take* a backup. The hard part — the part regulators now ask you to **prove** — is that you can **recover**. This module adds three capabilities that generate exactly that proof: a **cryptographically-signed, dated evidence report** (`JSON` + `Markdown` + printable `HTML`) mapped onto **ISO 27001**, **NIS2** and **DORA** controls.
341
+
342
+ Every report is signed with an **Ed25519** key (auto-generated on first use). An auditor can verify — offline, with only the bundled public key — that the report was produced by your system on the stated date and hasn't been altered since. **Zero new dependencies.**
343
+
344
+ Run any capability three ways: from your **AI client** (the tools below), from the **TUI** (Resilience tab → press `g`), or wire it into `cron`/CI.
345
+
346
+ ### ✅ 1. Automated backup verification — *restore-testing*
347
+
348
+ > *Almost nobody tests their restores; they find out on the day of the disaster.*
349
+
350
+ `verify_backups` takes the **latest `vzdump`** for each guest, restores it into an **ephemeral VM fenced onto an isolated bridge** (it can never touch production), boots it, and runs health checks:
351
+
352
+ - **Service up** — the guest boots and its agent responds.
353
+ - **Database responds** — e.g. `pg_isready` accepts connections.
354
+ - **Key-file checksums** — critical files match a recorded baseline (drift is flagged, not rubber-stamped).
355
+
356
+ Then it **destroys the ephemeral guest** and signs a report with the measured **RTO** per guest. Supports **ISO 27001 A.8.13 / A.5.29 · NIS2 Art. 21(2)(c) · DORA Art. 12**.
357
+
358
+ ```text
359
+ verify_backups # test the latest backup of every guest
360
+ verify_backups { "vmid": 101 } # just this guest
361
+ ```
362
+
363
+ ### 🔁 2. Patch orchestration with automatic rollback
364
+
365
+ > *“I don't touch that server, because if it breaks I don't know how to get back.”*
366
+
367
+ `orchestrate_patching` removes the fear. For each guest, in **dependency order**, within an optional **maintenance window**:
368
+
369
+ **snapshot → apply updates → health check → if it fails, roll back to the snapshot automatically.**
370
+
371
+ You get a report showing exactly what was patched and what was rolled back. Supports **ISO 27001 A.8.8 / A.8.32 · NIS2 Art. 21(2)(e) · DORA Art. 9**.
372
+
373
+ ```text
374
+ orchestrate_patching
375
+ orchestrate_patching { "guests": ["web", "db"], "window": "Sat 02:00-05:00" }
376
+ ```
377
+
378
+ ### 🎯 3. Scheduled DR drills
379
+
380
+ > *Many companies have their DR plan in a 2019 Word document that nobody has ever executed.*
381
+
382
+ `run_dr_drill` executes a **declarative YAML runbook** against an isolated test environment, times every recovery step, measures **RTO/RPO** and produces the signed drill minutes (*“acta”*). The engine **refuses to run** if the runbook's `environment` looks like production. A ready-to-edit runbook lives in [`examples/dr-runbook.yaml`](./examples/dr-runbook.yaml):
383
+
384
+ ```yaml
385
+ name: Quarterly failover drill
386
+ environment: staging # never "production" — the engine refuses
387
+ rpoHours: 24
388
+ steps:
389
+ - action: restore
390
+ guest: db
391
+ from: latest
392
+ - action: start
393
+ guest: db
394
+ - action: healthcheck
395
+ guest: db
396
+ check: db
397
+ - action: failover
398
+ guest: web
399
+ - action: teardown
400
+ ```
401
+
402
+ ```text
403
+ run_dr_drill # built-in sample runbook
404
+ run_dr_drill { "path": "examples/dr-runbook.yaml" }
405
+ run_dr_drill { "runbook": "name: ...\nsteps: ..." }
406
+ ```
407
+
408
+ Supports **ISO 27001 A.5.30 · NIS2 Art. 21(2)(c) · DORA Art. 11 / 24-25**.
409
+
410
+ ### 📄 The evidence
411
+
412
+ Each run writes to `PROXMOX_MCP_RESILIENCE_DIR` (default `./resilience-reports/`):
413
+
414
+ | File | For |
415
+ | --- | --- |
416
+ | `<id>.html` | A branded report that **prints straight to PDF** for an auditor (shown above). |
417
+ | `<id>.md` | A diff-able Markdown report that lives in git. |
418
+ | `<id>.json` | The machine-readable record, including the signature block. |
419
+
420
+ `list_resilience_reports` (available even in read-only mode) shows the most recent verdict per capability.
421
+
422
+ > 🔒 **Safety.** The three run tools are **mutating** and are hidden in `PROXMOX_MCP_READONLY` mode (report listing stays available). Backup verification and DR drills operate on **ephemeral, isolated** guests; patching always snapshots first and rolls back on failure.
423
+
424
+ ### ⚙️ Configuration
425
+
426
+ | Variable | Default | Purpose |
427
+ | --- | --- | --- |
428
+ | `PROXMOX_MCP_RESILIENCE_DIR` | `resilience-reports` | Where signed evidence is written. |
429
+ | `PROXMOX_MCP_SIGNING_KEY` | *(auto)* | Path to the Ed25519 signing key (generated if absent). |
430
+ | `PROXMOX_MCP_EPHEMERAL_VMID_BASE` | `90000` | First VMID of the ephemeral restore range. |
431
+ | `PROXMOX_MCP_ISOLATED_BRIDGE` | `vmbr9` | Isolated bridge ephemeral guests are fenced onto. |
432
+ | `PROXMOX_MCP_MAINT_WINDOW` | *(anytime)* | Default patching window, e.g. `Sat 02:00-05:00`. |
433
+
434
+ ---
435
+
436
+ ## 🔑 Create a Proxmox API token
437
+
438
+ An API token is the safest way to authenticate (no password stored, revocable, scopable).
439
+
440
+ 1. In the Proxmox web UI go to **Datacenter → Permissions → API Tokens → Add**.
441
+ 2. Pick a **User** (e.g. `root@pam`) and a **Token ID** (e.g. `mcp`). Copy the generated **secret** — it's shown only once.
442
+ - Your `PROXMOX_TOKEN_ID` is then **`root@pam!mcp`**.
443
+ 3. Give the token permissions. For full control assign the `PVEAdmin` role at path `/`; for **read‑only** use `PVEAuditor`. (Uncheck *Privilege Separation* to inherit the user's privileges, or add an ACL for the token.)
444
+ 4. Put the values in your MCP client config / `.env`:
445
+ ```
446
+ PROXMOX_HOST=https://192.168.1.10:8006
447
+ PROXMOX_TOKEN_ID=root@pam!mcp
448
+ PROXMOX_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
449
+ ```
450
+
451
+ > Prefer least privilege: pair a `PVEAuditor` token with `PROXMOX_MCP_READONLY=true` for a safe, view‑only assistant.
452
+
453
+ ---
454
+
455
+ ## 🔌 Connecting to your AI client
456
+
457
+ Add the server to your MCP client. Example for **Claude Desktop**
458
+ (`%APPDATA%\Claude\claude_desktop_config.json` on Windows,
459
+ `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
460
+
461
+ ```jsonc
462
+ {
463
+ "mcpServers": {
464
+ "proxmox": {
465
+ "command": "npx",
466
+ "args": ["-y", "@soyrageagency/proxmox-mcp"],
467
+ "env": {
468
+ "PROXMOX_HOST": "https://192.168.1.10:8006",
469
+ "PROXMOX_TOKEN_ID": "root@pam!mcp",
470
+ "PROXMOX_TOKEN_SECRET": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
471
+ "PROXMOX_VERIFY_TLS": "false",
472
+ "PROXMOX_MCP_READONLY": "false"
473
+ }
474
+ }
475
+ }
476
+ }
477
+ ```
478
+
479
+ No install step needed: `npx` fetches the package on first run and keeps it up to date. A ready‑to‑edit copy lives in [`examples/claude_desktop_config.json`](./examples/claude_desktop_config.json). Restart your client and ask: *“What Proxmox nodes and VMs do I have?”*
480
+
481
+ ---
482
+
483
+ ## ⚙️ Configuration reference
484
+
485
+ Every setting is an environment variable. A local **`.env`** is loaded automatically; a JSON **config file** (`proxmox-mcp.config.json`) provides defaults. Precedence (low → high): defaults → config file → `.env` → environment. See [`.env.example`](./.env.example).
486
+
487
+ | Variable | Default | Description |
488
+ | --- | --- | --- |
489
+ | `PROXMOX_HOST` | — | API base URL, e.g. `https://192.168.1.10:8006`. |
490
+ | `PROXMOX_TOKEN_ID` | — | API token id `user@realm!tokenname` (recommended). |
491
+ | `PROXMOX_TOKEN_SECRET` | — | API token secret (UUID). |
492
+ | `PROXMOX_USER` | — | `user@realm` for ticket auth (used only if no token). |
493
+ | `PROXMOX_PASSWORD` | — | Password for ticket auth. |
494
+ | `PROXMOX_VERIFY_TLS` | `false` | Verify the node's TLS certificate. |
495
+ | `PROXMOX_MCP_READONLY` | `false` | Hide **all** state‑changing tools. |
496
+ | `PROXMOX_MCP_DEMO` | `false` | Serve fabricated demo data (no real host needed). |
497
+ | `PROXMOX_MCP_ALLOWLIST` | — | Comma‑separated VMIDs/names the AI may touch (empty = all). |
498
+ | `PROXMOX_MCP_PLUGINS` | — | Load **only** these plugins (empty = all). |
499
+ | `PROXMOX_MCP_DISABLED_PLUGINS` | — | Disable these plugins. `about` is locked. |
500
+ | `PROXMOX_MCP_LOG_LEVEL` | `info` | `debug` \| `info` \| `warn` \| `error`. |
501
+ | `PROXMOX_MCP_AI_ENDPOINT` | — | OpenAI‑compatible base URL for the TUI's AI copilot (empty = rule‑based). |
502
+ | `PROXMOX_MCP_AI_KEY` | — | Bearer key for the AI endpoint. |
503
+ | `PROXMOX_MCP_AI_MODEL` | `gpt-4o-mini` | Model name for the AI endpoint. |
504
+ | `PROXMOX_MCP_CONFIG` | `proxmox-mcp.config.json` | Path to the optional JSON config file. |
505
+
506
+ ---
507
+
508
+ ## 🔒 TLS & self‑signed certificates
509
+
510
+ Proxmox ships a **self‑signed certificate** by default, so `PROXMOX_VERIFY_TLS=false` (the default) is expected for most home‑labs — the connection is still encrypted, just not certificate‑verified. TLS control is per‑request (via `undici`), so it does **not** disable verification globally for your process.
511
+
512
+ Set `PROXMOX_VERIFY_TLS=true` only when your node presents a certificate your system trusts (e.g. a Let's Encrypt cert, or an internal CA / reverse proxy in front of `:8006`).
513
+
514
+ ---
515
+
516
+ ## 🛡️ Security model & networking
517
+
518
+ This server can control your infrastructure — treat access like `root` SSH.
519
+
520
+ | Control | What it does |
521
+ | --- | --- |
522
+ | **Read‑only mode** (`PROXMOX_MCP_READONLY=true`) | Hides every lifecycle/snapshot‑mutating tool. Pair with a `PVEAuditor` token. |
523
+ | **Guest allowlist** (`PROXMOX_MCP_ALLOWLIST`) | Restricts *all* guest tools to matching VMIDs/names; anything else returns a clear error. |
524
+ | **Scoped API token** | Grant the token only the privileges it needs; revoke instantly from the UI. |
525
+ | **Least privilege** | `PVEAuditor` + read‑only = a safe, view‑only assistant. |
526
+
527
+ **Networking:** the Proxmox API listens on `:8006`. Reach a remote node **over a VPN** ([WireGuard](https://www.wireguard.com/) / [Tailscale](https://tailscale.com/)) rather than exposing `8006` to the Internet. The MCP server runs **locally** beside your AI client and connects out to Proxmox — it opens no inbound ports of its own.
528
+
529
+ ### Safety recipes
530
+
531
+ ```bash
532
+ # View-only assistant (great for demos / dashboards)
533
+ PROXMOX_MCP_READONLY=true # + a PVEAuditor token
534
+
535
+ # Only let the AI manage two specific guests
536
+ PROXMOX_MCP_ALLOWLIST=101,web
537
+
538
+ # Expose only cluster/guest insight, no storage/tasks
539
+ PROXMOX_MCP_PLUGINS=nodes,guests,cluster
540
+ ```
541
+
542
+ ---
543
+
544
+ ## 🧰 Complete tool reference
545
+
546
+ Tools marked **W** change state and are **hidden** when `PROXMOX_MCP_READONLY=true`.
547
+ Guests are addressed by **VMID or name**.
548
+
549
+ ### Identity
550
+
551
+ | Tool | Description |
552
+ | --- | --- |
553
+ | `about` | Version, credits and the welcome banner. |
554
+ | `list_plugins` | The modular plugins and whether each is enabled. |
555
+
556
+ ### Insight (read‑only)
557
+
558
+ | Tool | Parameters | Description |
559
+ | --- | --- | --- |
560
+ | `list_nodes` | — | Cluster nodes with status, CPU and memory. |
561
+ | `node_status` | `node` | Detailed status of one node. |
562
+ | `list_guests` | `kind?` (`qemu`/`lxc`), `runningOnly?` | All VMs & containers with live stats. |
563
+ | `guest_status` | `guest` | Live status of one VM/container. |
564
+ | `guest_config` | `guest` | Full configuration of one guest. |
565
+ | `guest_osinfo` | `guest` | The guest's **operating system** (agent name/version + IPs). |
566
+ | `list_storage` | `node` | Storages on a node with usage. |
567
+ | `list_tasks` | `node`, `limit?` | Recent tasks on a node. |
568
+ | `cluster_status` | — | Cluster membership & quorum. |
569
+ | `cluster_resources` | `type?` | Consolidated nodes/guests/storage view. |
570
+ | `list_snapshots` | `guest` | Snapshots of a VM/container. |
571
+ | `list_backups` | `node?`, `storage?` | vzdump backup archives with VMID, size, age. |
572
+ | `list_templates` | `node?` | Container templates (vztmpl) and install ISOs. |
573
+ | `list_resilience_reports` | — | Recent signed resilience evidence (verify / patch / DR). |
574
+
575
+ ### Lifecycle (**W**)
576
+
577
+ | Tool | Parameters | Description |
578
+ | --- | --- | --- |
579
+ | `start_guest` | `guest` | Power on a VM/container. |
580
+ | `shutdown_guest` | `guest`, `timeout?` | Graceful ACPI/OS shutdown (preferred). |
581
+ | `stop_guest` | `guest` | Hard stop (power‑cord). Destructive — confirm first. |
582
+ | `reboot_guest` | `guest` | Graceful reboot. |
583
+ | `suspend_guest` | `guest`, `toDisk?` | Pause a VM in RAM (or hibernate to disk). |
584
+ | `resume_guest` | `guest` | Resume a suspended VM. |
585
+
586
+ ### Management (**W**)
587
+
588
+ | Tool | Parameters | Description |
589
+ | --- | --- | --- |
590
+ | `migrate_guest` | `guest`, `target`, `online?` | Move a guest to another node (live if running). |
591
+ | `clone_guest` | `guest`, `newid`, `name?`, `full?`, `target?` | Clone a VM/CT (e.g. from a template). |
592
+ | `set_guest_resources` | `guest`, `cores?`, `memory?` | Quickly change CPU cores / RAM (MB). |
593
+ | `backup_guest` | `guest`, `storage`, `mode?`, `compress?` | Create a vzdump backup to a storage. |
594
+ | `delete_guest` | `guest`, `confirm`, `purge?` | Destroy a guest (guarded: `confirm` must equal the VMID). |
595
+
596
+ ### Backups & provisioning (**W**)
597
+
598
+ | Tool | Parameters | Description |
599
+ | --- | --- | --- |
600
+ | `restore_backup` | `volid`, `vmid`, `node?`, `storage?`, `force?` | Restore a vzdump archive into a VMID. |
601
+ | `create_container` | `vmid`, `ostemplate`, `storage`, `hostname?`, `cores?`, `memory?`, `diskGb?`, … | Create an LXC container from a template. |
602
+ | `create_vm` | `vmid`, `storage`, `name?`, `diskGb?`, `cores?`, `memory?`, `iso?`, `ostype?`, … | Create a QEMU VM (with a disk + optional install ISO). |
603
+
604
+ ### Snapshots (**W**)
605
+
606
+ | Tool | Parameters | Description |
607
+ | --- | --- | --- |
608
+ | `create_snapshot` | `guest`, `name`, `description?`, `withRam?` | Take a snapshot (optionally with VM RAM). |
609
+ | `rollback_snapshot` | `guest`, `name` | Revert to a snapshot (destructive). |
610
+ | `delete_snapshot` | `guest`, `name` | Remove a snapshot. |
611
+
612
+ ### Resilience & Compliance (**W**) — [details ↑](#-resilience--compliance-new)
613
+
614
+ | Tool | Parameters | Description |
615
+ | --- | --- | --- |
616
+ | `verify_backups` | `vmid?`, `node?` | Restore-test the latest backup(s) in an isolated ephemeral VM; sign the report. |
617
+ | `orchestrate_patching` | `guests?`, `window?` | Snapshot → patch → health-check → **auto-rollback** on failure; sign the report. |
618
+ | `run_dr_drill` | `runbook?`, `path?` | Execute a declarative YAML DR runbook; sign the drill minutes. |
619
+
620
+ ---
621
+
622
+ ## 💬 Example conversations
623
+
624
+ | You say… | The assistant calls… |
625
+ | --- | --- |
626
+ | “Show me all my VMs and containers.” | `list_guests` |
627
+ | “Which containers are running?” | `list_guests { kind: "lxc", runningOnly: true }` |
628
+ | “Is node pve healthy?” | `node_status { node: "pve" }` |
629
+ | “How is VMID 101 doing?” | `guest_status { guest: "101" }` |
630
+ | “Snapshot db before the upgrade.” | `create_snapshot { guest: "db", name: "pre-upgrade" }` |
631
+ | “Gracefully shut down container 200.” | `shutdown_guest { guest: "200" }` |
632
+ | “How full is storage on pve?” | `list_storage { node: "pve" }` |
633
+ | “What happened on pve recently?” | `list_tasks { node: "pve" }` |
634
+ | “Who built this?” | `about` |
635
+
636
+ ---
637
+
638
+ ## 🧩 Modular plugin architecture
639
+
640
+ The server is assembled from independent **plugins**, each owning one capability group; which load is driven entirely by configuration. The `about` plugin is **locked** — it carries the SoyRage Agency identity and cannot be disabled.
641
+
642
+ | Plugin | Category | Type | Tools |
643
+ | --- | --- | --- | --- |
644
+ | `about` 🔒 | identity | read | `about`, `list_plugins` |
645
+ | `nodes` | nodes | read | `list_nodes`, `node_status` |
646
+ | `guests` | guests | read | `list_guests`, `guest_status`, `guest_config`, `guest_osinfo` |
647
+ | `storage` | storage | read | `list_storage` |
648
+ | `tasks` | tasks | read | `list_tasks` |
649
+ | `cluster` | cluster | read | `cluster_status`, `cluster_resources` |
650
+ | `snapshots` | snapshots | read/write | `list_snapshots`, `create/rollback/delete_snapshot` |
651
+ | `lifecycle` | lifecycle | write | `start/shutdown/stop/reboot/suspend/resume_guest` |
652
+ | `management` | management | write | `migrate/clone/backup/delete_guest`, `set_guest_resources` |
653
+ | `backups` | backups | read/write | `list_backups`, `restore_backup` |
654
+ | `provisioning` | provisioning | read/write | `list_templates`, `create_container`, `create_vm` |
655
+ | `resilience` | resilience | read/write | `list_resilience_reports`, `verify_backups`, `orchestrate_patching`, `run_dr_drill` |
656
+
657
+ ```bash
658
+ PROXMOX_MCP_PLUGINS= # (env) empty = load all
659
+ PROXMOX_MCP_DISABLED_PLUGINS=lifecycle,snapshots # insight only
660
+ ```
661
+
662
+ Ask the assistant **“list the plugins”** any time to see what's enabled.
663
+
664
+ ---
665
+
666
+ ## 🗂️ Project structure
667
+
668
+ ```
669
+ proxmox-mcp-server/
670
+ ├── assets/soyrage-banner.svg # SoyRage Agency identity banner
671
+ ├── examples/ # Claude config + config-file examples
672
+ ├── install.sh / install.ps1 # One-command bootstrap for beginners
673
+ ├── scripts/install.mjs # Cross-platform Claude Desktop configurator
674
+ ├── src/
675
+ │ ├── index.ts # Entry point: banner, wiring
676
+ │ ├── branding.ts # SoyRage identity, ASCII banner, MCP instructions
677
+ │ ├── plugins.ts # Modular plugin catalogue & loader
678
+ │ ├── config.ts # Layered config (defaults → file → .env → env)
679
+ │ ├── logger.ts # stderr-only structured logger
680
+ │ ├── proxmox/
681
+ │ │ └── client.ts # Typed Proxmox VE API client (token/ticket, TLS)
682
+ │ ├── tools/ # One module per plugin's tools
683
+ │ │ ├── context.ts · about.ts · nodes.ts · guests.ts · cluster.ts
684
+ │ │ ├── storage.ts · tasks.ts · snapshots.ts · lifecycle.ts
685
+ │ │ ├── management.ts · backups.ts · provisioning.ts · resilience.ts
686
+ │ ├── resilience/ # Resilience & Compliance engine
687
+ │ │ ├── engine.ts # Façade: run → sign → persist → summarise
688
+ │ │ ├── backup-verifier.ts # Restore-test into an isolated ephemeral VM
689
+ │ │ ├── patch-orchestrator.ts # Snapshot → patch → health → auto-rollback
690
+ │ │ ├── dr-drill.ts # Execute a declarative recovery runbook
691
+ │ │ ├── runbook.ts # Dependency-free YAML runbook parser
692
+ │ │ ├── report.ts # Control mapping + Markdown/HTML rendering
693
+ │ │ ├── signing.ts # Ed25519 evidence signing (node:crypto)
694
+ │ │ └── types.ts · util.ts
695
+ │ └── utils/ # format.ts (tables/units) · result.ts (MCP helpers)
696
+ ├── examples/dr-runbook.yaml # Ready-to-edit DR drill runbook
697
+ ├── .env.example · LICENSE · README.md
698
+ ```
699
+
700
+ ---
701
+
702
+ ## 🧪 Development
703
+
704
+ ```bash
705
+ npm run dev # hot-reload with tsx
706
+ npm run typecheck # strict type check, no emit
707
+ npm run build # compile to dist/
708
+ npm run start # run the built server
709
+ npm run inspect # launch the MCP Inspector
710
+ npm run setup # build + configure Claude Desktop
711
+ ```
712
+
713
+ **Design notes:** stdout is reserved for the JSON‑RPC stream (logs → stderr); the Proxmox client resolves guest → node automatically; failing tool calls return a clean `isError` result instead of crashing the connection; TLS control is per‑request via `undici`.
714
+
715
+ ---
716
+
717
+ ## 🩺 Troubleshooting & FAQ
718
+
719
+ <details><summary><b>“Could not reach the Proxmox API.”</b></summary>
720
+
721
+ Check `PROXMOX_HOST` (include `https://` and `:8006`), that the node is reachable (VPN?), and your token/credentials. With a self‑signed cert keep `PROXMOX_VERIFY_TLS=false`. The server keeps running so tool calls return a friendly error in your chat client.
722
+ </details>
723
+
724
+ <details><summary><b>401 / permission denied.</b></summary>
725
+
726
+ The token/user lacks privileges for that path. Assign an appropriate role (`PVEAuditor` for read, `PVEAdmin`/`PVEVMAdmin` for control) at path `/` or on the specific VM, and make sure the token isn't limited by *Privilege Separation* without an ACL.
727
+ </details>
728
+
729
+ <details><summary><b>The assistant can't see start/stop tools.</b></summary>
730
+
731
+ You're in read‑only mode (`PROXMOX_MCP_READONLY=true`) or the `lifecycle` plugin is disabled. Adjust and restart your MCP client.
732
+ </details>
733
+
734
+ <details><summary><b>Is my data sent anywhere?</b></summary>
735
+
736
+ No. The server talks only to your Proxmox API and your MCP client over local stdio. It makes no other outbound calls.
737
+ </details>
738
+
739
+ ---
740
+
741
+ ## 🗺️ Roadmap
742
+
743
+ - [x] Nodes, guests, lifecycle, snapshots, storage, tasks, cluster
744
+ - [x] Guest **OS** detection (QEMU agent) · suspend/resume
745
+ - [x] **Migrate**, **clone**, **resize**, **backup** (vzdump), **delete** guests
746
+ - [x] **Backups**: list & **restore** archives · **Provisioning**: create VMs/CTs from templates & ISOs
747
+ - [x] Guided setup wizard · API‑token & ticket auth · read‑only & allowlist · modular plugins
748
+ - [x] One‑command installer · demo mode · terminal UI (TUI) · CI
749
+ - [x] **Resilience & Compliance**: signed backup verification · patch orchestration with auto‑rollback · DR drills (ISO 27001 / NIS2 / DORA)
750
+ - [ ] Scheduled resilience runs (cron) & e‑mail/Slack delivery of evidence
751
+ - [ ] Cloud‑init provisioning presets
752
+ - [x] Published npm package for one‑line `npx` usage
753
+
754
+ ---
755
+
756
+ ## 🧰 More from the SoyRage self‑hosting suite
757
+
758
+ Proxmox MCP Server is part of a family of open‑source infrastructure tools built with the same care — same design language, same safety‑first defaults, same "chat with your infra" philosophy:
759
+
760
+ | Project | What it does |
761
+ | --- | --- |
762
+ | 🖧 **[Proxmox MCP Server](https://github.com/soyrageagency/proxmox-mcp-server)** | *(you are here)* Chat with your Proxmox VE cluster — nodes, VMs & LXC, snapshots and full guest CRUD, plus a tabbed terminal dashboard with an AI command bar. |
763
+ | 🐳 **[Docker MCP Server](https://github.com/soyrageagency/docker-mcp-server)** | Chat with your Docker host — containers, logs, Compose, a live web panel and a TUI with an AI copilot. |
764
+ | 🚚 **[VMware → Proxmox Toolkit (V2P)](https://github.com/soyrageagency/vmware-to-proxmox)** | Leaving vSphere after the Broadcom price hikes? Inventory vCenter, score compatibility, estimate cost & time, plan disk conversion and export a professional PDF assessment. |
765
+ | 🗺️ **[NetAtlas](https://github.com/soyrageagency/netatlas)** | Living infrastructure documentation — agentless discovery that auto-generates a network diagram, inventory, VLAN & service-dependency maps, and tells you what changed since last time. |
766
+ | 🛡️ **[MailAegis](https://github.com/soyrageagency/mailaegis)** | Corporate email threat analyzer — VirusTotal, ClamAV and an in-house phishing/BEC engine, inside a mail client. |
767
+
768
+ ---
769
+
770
+ ## 💙 Support the project
771
+
772
+ Proxmox MCP Server is free and MIT licensed. If it saves you time, you can [support development on PayPal](https://www.paypal.com/paypalme/soyrageagency) — a ⭐ on the repo helps just as much.
773
+
774
+ ---
775
+
776
+ ## 🖋️ Credits & License
777
+
778
+ <div align="center">
779
+
780
+ **Designed, built and maintained by [SoyRage Agency](https://soyrage.es/) — https://soyrage.es/**
781
+
782
+ </div>
783
+
784
+ Released under the **[MIT License](./LICENSE)** — use it, modify it, self-host it, ship it commercially.
785
+
786
+ If you build something on top of it, a link back to [soyrage.es](https://soyrage.es/) is appreciated but never required.
787
+
788
+ <div align="center">
789
+
790
+ **© 2026 SoyRage Agency — https://soyrage.es/** · Made with care in Valencia, Spain.
791
+
792
+ </div>