proxmox-mcps 0.1.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 (217) hide show
  1. package/.env.example +60 -0
  2. package/.mcp.json.example +19 -0
  3. package/LICENSE +21 -0
  4. package/README.md +72 -0
  5. package/dist/cli/check-config.d.ts +3 -0
  6. package/dist/cli/check-config.d.ts.map +1 -0
  7. package/dist/cli/check-config.js +29 -0
  8. package/dist/cli/check-config.js.map +1 -0
  9. package/dist/cli/print-tools.d.ts +4 -0
  10. package/dist/cli/print-tools.d.ts.map +1 -0
  11. package/dist/cli/print-tools.js +45 -0
  12. package/dist/cli/print-tools.js.map +1 -0
  13. package/dist/config/env.d.ts +183 -0
  14. package/dist/config/env.d.ts.map +1 -0
  15. package/dist/config/env.js +149 -0
  16. package/dist/config/env.js.map +1 -0
  17. package/dist/config/index.d.ts +26 -0
  18. package/dist/config/index.d.ts.map +1 -0
  19. package/dist/config/index.js +42 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/config/types.d.ts +60 -0
  22. package/dist/config/types.d.ts.map +1 -0
  23. package/dist/config/types.js +50 -0
  24. package/dist/config/types.js.map +1 -0
  25. package/dist/format/response.d.ts +40 -0
  26. package/dist/format/response.d.ts.map +1 -0
  27. package/dist/format/response.js +109 -0
  28. package/dist/format/response.js.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +200 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/jobs/sqlite-store.d.ts +34 -0
  34. package/dist/jobs/sqlite-store.d.ts.map +1 -0
  35. package/dist/jobs/sqlite-store.js +282 -0
  36. package/dist/jobs/sqlite-store.js.map +1 -0
  37. package/dist/jobs/store.d.ts +66 -0
  38. package/dist/jobs/store.d.ts.map +1 -0
  39. package/dist/jobs/store.js +101 -0
  40. package/dist/jobs/store.js.map +1 -0
  41. package/dist/log.d.ts +24 -0
  42. package/dist/log.d.ts.map +1 -0
  43. package/dist/log.js +64 -0
  44. package/dist/log.js.map +1 -0
  45. package/dist/proxmox/auth.d.ts +30 -0
  46. package/dist/proxmox/auth.d.ts.map +1 -0
  47. package/dist/proxmox/auth.js +39 -0
  48. package/dist/proxmox/auth.js.map +1 -0
  49. package/dist/proxmox/client.d.ts +28 -0
  50. package/dist/proxmox/client.d.ts.map +1 -0
  51. package/dist/proxmox/client.js +192 -0
  52. package/dist/proxmox/client.js.map +1 -0
  53. package/dist/proxmox/errors.d.ts +51 -0
  54. package/dist/proxmox/errors.d.ts.map +1 -0
  55. package/dist/proxmox/errors.js +80 -0
  56. package/dist/proxmox/errors.js.map +1 -0
  57. package/dist/proxmox/paths.d.ts +126 -0
  58. package/dist/proxmox/paths.d.ts.map +1 -0
  59. package/dist/proxmox/paths.js +157 -0
  60. package/dist/proxmox/paths.js.map +1 -0
  61. package/dist/proxmox/types.d.ts +255 -0
  62. package/dist/proxmox/types.d.ts.map +1 -0
  63. package/dist/proxmox/types.js +9 -0
  64. package/dist/proxmox/types.js.map +1 -0
  65. package/dist/retry.d.ts +18 -0
  66. package/dist/retry.d.ts.map +1 -0
  67. package/dist/retry.js +50 -0
  68. package/dist/retry.js.map +1 -0
  69. package/dist/safety/policy.d.ts +23 -0
  70. package/dist/safety/policy.d.ts.map +1 -0
  71. package/dist/safety/policy.js +81 -0
  72. package/dist/safety/policy.js.map +1 -0
  73. package/dist/safety/risk.d.ts +3 -0
  74. package/dist/safety/risk.d.ts.map +1 -0
  75. package/dist/safety/risk.js +234 -0
  76. package/dist/safety/risk.js.map +1 -0
  77. package/dist/security/url-guard.d.ts +22 -0
  78. package/dist/security/url-guard.d.ts.map +1 -0
  79. package/dist/security/url-guard.js +166 -0
  80. package/dist/security/url-guard.js.map +1 -0
  81. package/dist/server.d.ts +24 -0
  82. package/dist/server.d.ts.map +1 -0
  83. package/dist/server.js +74 -0
  84. package/dist/server.js.map +1 -0
  85. package/dist/ssh/client.d.ts +32 -0
  86. package/dist/ssh/client.d.ts.map +1 -0
  87. package/dist/ssh/client.js +128 -0
  88. package/dist/ssh/client.js.map +1 -0
  89. package/dist/tools/backup-schedule.d.ts +10 -0
  90. package/dist/tools/backup-schedule.d.ts.map +1 -0
  91. package/dist/tools/backup-schedule.js +194 -0
  92. package/dist/tools/backup-schedule.js.map +1 -0
  93. package/dist/tools/backup.d.ts +7 -0
  94. package/dist/tools/backup.d.ts.map +1 -0
  95. package/dist/tools/backup.js +163 -0
  96. package/dist/tools/backup.js.map +1 -0
  97. package/dist/tools/cluster.d.ts +7 -0
  98. package/dist/tools/cluster.d.ts.map +1 -0
  99. package/dist/tools/cluster.js +20 -0
  100. package/dist/tools/cluster.js.map +1 -0
  101. package/dist/tools/container/config.d.ts +7 -0
  102. package/dist/tools/container/config.d.ts.map +1 -0
  103. package/dist/tools/container/config.js +97 -0
  104. package/dist/tools/container/config.js.map +1 -0
  105. package/dist/tools/container/console.d.ts +7 -0
  106. package/dist/tools/container/console.d.ts.map +1 -0
  107. package/dist/tools/container/console.js +65 -0
  108. package/dist/tools/container/console.js.map +1 -0
  109. package/dist/tools/container/crud.d.ts +7 -0
  110. package/dist/tools/container/crud.d.ts.map +1 -0
  111. package/dist/tools/container/crud.js +362 -0
  112. package/dist/tools/container/crud.js.map +1 -0
  113. package/dist/tools/container/diagnostics.d.ts +7 -0
  114. package/dist/tools/container/diagnostics.d.ts.map +1 -0
  115. package/dist/tools/container/diagnostics.js +115 -0
  116. package/dist/tools/container/diagnostics.js.map +1 -0
  117. package/dist/tools/container/migration.d.ts +7 -0
  118. package/dist/tools/container/migration.d.ts.map +1 -0
  119. package/dist/tools/container/migration.js +134 -0
  120. package/dist/tools/container/migration.js.map +1 -0
  121. package/dist/tools/context.d.ts +21 -0
  122. package/dist/tools/context.d.ts.map +1 -0
  123. package/dist/tools/context.js +2 -0
  124. package/dist/tools/context.js.map +1 -0
  125. package/dist/tools/ha.d.ts +7 -0
  126. package/dist/tools/ha.d.ts.map +1 -0
  127. package/dist/tools/ha.js +241 -0
  128. package/dist/tools/ha.js.map +1 -0
  129. package/dist/tools/helpers.d.ts +15 -0
  130. package/dist/tools/helpers.d.ts.map +1 -0
  131. package/dist/tools/helpers.js +7 -0
  132. package/dist/tools/helpers.js.map +1 -0
  133. package/dist/tools/index.d.ts +10 -0
  134. package/dist/tools/index.d.ts.map +1 -0
  135. package/dist/tools/index.js +66 -0
  136. package/dist/tools/index.js.map +1 -0
  137. package/dist/tools/iso.d.ts +7 -0
  138. package/dist/tools/iso.d.ts.map +1 -0
  139. package/dist/tools/iso.js +131 -0
  140. package/dist/tools/iso.js.map +1 -0
  141. package/dist/tools/jobs.d.ts +11 -0
  142. package/dist/tools/jobs.d.ts.map +1 -0
  143. package/dist/tools/jobs.js +173 -0
  144. package/dist/tools/jobs.js.map +1 -0
  145. package/dist/tools/node-admin.d.ts +10 -0
  146. package/dist/tools/node-admin.d.ts.map +1 -0
  147. package/dist/tools/node-admin.js +361 -0
  148. package/dist/tools/node-admin.js.map +1 -0
  149. package/dist/tools/node-certs.d.ts +7 -0
  150. package/dist/tools/node-certs.d.ts.map +1 -0
  151. package/dist/tools/node-certs.js +36 -0
  152. package/dist/tools/node-certs.js.map +1 -0
  153. package/dist/tools/node-disks.d.ts +7 -0
  154. package/dist/tools/node-disks.d.ts.map +1 -0
  155. package/dist/tools/node-disks.js +100 -0
  156. package/dist/tools/node-disks.js.map +1 -0
  157. package/dist/tools/node-network.d.ts +7 -0
  158. package/dist/tools/node-network.d.ts.map +1 -0
  159. package/dist/tools/node-network.js +102 -0
  160. package/dist/tools/node-network.js.map +1 -0
  161. package/dist/tools/node-services.d.ts +7 -0
  162. package/dist/tools/node-services.d.ts.map +1 -0
  163. package/dist/tools/node-services.js +39 -0
  164. package/dist/tools/node-services.js.map +1 -0
  165. package/dist/tools/node.d.ts +7 -0
  166. package/dist/tools/node.d.ts.map +1 -0
  167. package/dist/tools/node.js +85 -0
  168. package/dist/tools/node.js.map +1 -0
  169. package/dist/tools/pools.d.ts +10 -0
  170. package/dist/tools/pools.d.ts.map +1 -0
  171. package/dist/tools/pools.js +111 -0
  172. package/dist/tools/pools.js.map +1 -0
  173. package/dist/tools/replication.d.ts +7 -0
  174. package/dist/tools/replication.d.ts.map +1 -0
  175. package/dist/tools/replication.js +116 -0
  176. package/dist/tools/replication.js.map +1 -0
  177. package/dist/tools/sdn.d.ts +7 -0
  178. package/dist/tools/sdn.d.ts.map +1 -0
  179. package/dist/tools/sdn.js +358 -0
  180. package/dist/tools/sdn.js.map +1 -0
  181. package/dist/tools/snapshot.d.ts +10 -0
  182. package/dist/tools/snapshot.d.ts.map +1 -0
  183. package/dist/tools/snapshot.js +115 -0
  184. package/dist/tools/snapshot.js.map +1 -0
  185. package/dist/tools/storage-admin.d.ts +9 -0
  186. package/dist/tools/storage-admin.d.ts.map +1 -0
  187. package/dist/tools/storage-admin.js +126 -0
  188. package/dist/tools/storage-admin.js.map +1 -0
  189. package/dist/tools/storage.d.ts +7 -0
  190. package/dist/tools/storage.d.ts.map +1 -0
  191. package/dist/tools/storage.js +20 -0
  192. package/dist/tools/storage.js.map +1 -0
  193. package/dist/tools/tasks.d.ts +11 -0
  194. package/dist/tools/tasks.d.ts.map +1 -0
  195. package/dist/tools/tasks.js +85 -0
  196. package/dist/tools/tasks.js.map +1 -0
  197. package/dist/tools/vm/config.d.ts +28 -0
  198. package/dist/tools/vm/config.d.ts.map +1 -0
  199. package/dist/tools/vm/config.js +221 -0
  200. package/dist/tools/vm/config.js.map +1 -0
  201. package/dist/tools/vm/console.d.ts +9 -0
  202. package/dist/tools/vm/console.d.ts.map +1 -0
  203. package/dist/tools/vm/console.js +141 -0
  204. package/dist/tools/vm/console.js.map +1 -0
  205. package/dist/tools/vm/crud.d.ts +10 -0
  206. package/dist/tools/vm/crud.d.ts.map +1 -0
  207. package/dist/tools/vm/crud.js +333 -0
  208. package/dist/tools/vm/crud.js.map +1 -0
  209. package/dist/tools/vm/diagnostics.d.ts +10 -0
  210. package/dist/tools/vm/diagnostics.d.ts.map +1 -0
  211. package/dist/tools/vm/diagnostics.js +256 -0
  212. package/dist/tools/vm/diagnostics.js.map +1 -0
  213. package/dist/tools/vm/migration.d.ts +7 -0
  214. package/dist/tools/vm/migration.d.ts.map +1 -0
  215. package/dist/tools/vm/migration.js +131 -0
  216. package/dist/tools/vm/migration.js.map +1 -0
  217. package/package.json +74 -0
package/.env.example ADDED
@@ -0,0 +1,60 @@
1
+ # =============================================================================
2
+ # Proxmox MCP Server — environment configuration
3
+ # Copy to `.env` and fill in. All vars can also be passed inline.
4
+ # =============================================================================
5
+
6
+ # ---- Proxmox API connection (REQUIRED) ---------------------------------------
7
+ PROXMOX_HOST=proxmox.example.com
8
+ PROXMOX_PORT=8006
9
+ PROXMOX_USER=root@pam
10
+ PROXMOX_TOKEN_NAME=mcp
11
+ PROXMOX_TOKEN_VALUE=00000000-0000-0000-0000-000000000000
12
+ PROXMOX_VERIFY_SSL=true
13
+ PROXMOX_TIMEOUT_MS=30000
14
+ PROXMOX_SERVICE=PVE
15
+
16
+ # ---- Safety -----------------------------------------------------------------
17
+ # Set to `true` only in dev environments where Proxmox uses a self-signed cert.
18
+ PROXMOX_DEV_MODE=false
19
+
20
+ # When `true`, high-risk and destructive tools run without approval_token.
21
+ # Use only for dev/automation. Production path: PROXMOX_MCP_APPROVAL_TOKEN.
22
+ PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE=false
23
+
24
+ # Token required per-call for high-risk/destructive tools. Compared with
25
+ # crypto.timingSafeEqual against the `approval_token` tool argument.
26
+ # Generate with: openssl rand -hex 32
27
+ PROXMOX_MCP_APPROVAL_TOKEN=
28
+
29
+ # When `true`, high-risk tools log an audit line but still require a token.
30
+ PROXMOX_MCP_AUDIT_ONLY=false
31
+
32
+ # ---- Logging ----------------------------------------------------------------
33
+ LOG_LEVEL=info
34
+ LOG_PRETTY=false
35
+
36
+ # ---- Retry & jobs -----------------------------------------------------------
37
+ PROXMOX_MCP_RETRY_MAX=3
38
+ PROXMOX_MCP_RETRY_BASE_MS=200
39
+ PROXMOX_MCP_JOB_TTL_HOURS=24
40
+ # 'memory' (default; lost on restart) or 'sqlite' (persisted)
41
+ PROXMOX_MCP_JOB_STORE=memory
42
+ PROXMOX_MCP_JOB_SQLITE_PATH=./proxmox-jobs.sqlite3
43
+
44
+ # ---- Transport --------------------------------------------------------------
45
+ # STDIO = current default (Claude Code)
46
+ # SSE = legacy HTTP+SSE
47
+ # STREAMABLE = streamable HTTP (recommended for non-stdio clients)
48
+ MCP_TRANSPORT=STDIO
49
+ MCP_HOST=127.0.0.1
50
+ MCP_PORT=8000
51
+
52
+ # ---- SSH (for `execute_container_command` — pct exec on the host) -----------
53
+ PROXMOX_SSH_USER=root
54
+ PROXMOX_SSH_PORT=22
55
+ PROXMOX_SSH_KEY_FILE=
56
+ PROXMOX_SSH_PASSWORD=
57
+ # JSON string: {"pve1":"10.0.0.1","pve2":"10.0.0.2"}
58
+ PROXMOX_SSH_HOST_OVERRIDES=
59
+ PROXMOX_SSH_KNOWN_HOSTS_FILE=
60
+ PROXMOX_SSH_STRICT_HOST_KEY_CHECKING=true
@@ -0,0 +1,19 @@
1
+ {
2
+ "mcpServers": {
3
+ "proxmox": {
4
+ "command": "node",
5
+ "args": ["/Users/ngocdd/Documents/source_code/proxmox-mcp/dist/index.js"],
6
+ "env": {
7
+ "PROXMOX_HOST": "proxmox.example.com",
8
+ "PROXMOX_PORT": "8006",
9
+ "PROXMOX_USER": "root@pam",
10
+ "PROXMOX_TOKEN_NAME": "mcp",
11
+ "PROXMOX_TOKEN_VALUE": "your-token-uuid-here",
12
+ "PROXMOX_VERIFY_SSL": "false",
13
+ "PROXMOX_DEV_MODE": "true",
14
+ "PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE": "false",
15
+ "LOG_LEVEL": "info"
16
+ }
17
+ }
18
+ }
19
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Proxmox MCP Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # Proxmox MCP (TypeScript)
2
+
3
+ MCP server for [Proxmox VE](https://www.proxmox.com/en/proxmox-ve) — lets AI assistants (Claude Code, etc.) manage QEMU VMs, LXC containers, storage, network, HA, replication, SDN, and node admin.
4
+
5
+ **195 tools** · 3 transports (stdio / HTTP-SSE / streamable) · approval-gated destructive ops
6
+
7
+ ## Supported tools (195)
8
+
9
+ **Foundation (24)** — `get_cluster_status`, `get_nodes`, `get_node_status`, `get_storage`, `list_tasks`, `get_task`, `get_task_log`, `list_jobs`, `get_job`, `poll_job`, `cancel_job`, `retry_job` · snapshot / backup / ISO + template CRUD
10
+
11
+ **VM (45)** — CRUD + lifecycle (`get_vms`, `get_vm_config`, `create_vm`, `clone_vm`, `start/stop/shutdown/reset/reboot/delete_vm`) · config (`update_vm_config`, `resize_vm_disk`, `set_vm_cloudinit`) · diagnostics (RRD, 10× QEMU guest agent, `vm_monitor`, `vm_firewall_rules`) · migration + console (VNC / SPICE / termproxy)
12
+
13
+ **Container (35)** — CRUD + lifecycle + config (`update_container_resources`, `resize_container_disk`) · diagnostics (RRD, firewall, **`execute_container_command`** via SSH + `pct exec`) · migration + console
14
+
15
+ **Cluster (23)** — Resource pools (5) · HA resources + groups (11) · Scheduled vzdump jobs (7)
16
+
17
+ **Node admin (40)** — apt / DNS / hosts / time (15) · bulk ops (4) · subscription (4) · systemd services (7) · network bonds/bridges/VLANs/OVS (5) · disks + ZFS (5) · certificates (2)
18
+
19
+ **Storage (5)** — `list_storages`, `get_storage`, `create/update/delete_storage` (lvm, zfs, nfs, cifs, pbs, dir, …)
20
+
21
+ **Replication (7)** + **SDN (22)** — ZFS replication jobs · SDN controllers / zones / vnets / subnets + `apply_sdn`
22
+
23
+ > 25 destructive tools require an approval token (or `PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE=true`). List them: `proxmox-mcp-print-tools destructive`.
24
+
25
+ ## Install
26
+
27
+ ### From npm (recommended)
28
+
29
+ ```bash
30
+ npx proxmox-mcps
31
+ # or install globally
32
+ npm install -g proxmox-mcps
33
+ proxmox-mcp # CLI binary (installed by the package above)
34
+ ```
35
+
36
+ ### From source
37
+
38
+ ```bash
39
+ git clone https://github.com/your-username/proxmox-mcp.git
40
+ cd proxmox-mcp
41
+ npm install
42
+ cp .env.example .env # fill in Proxmox host + API token
43
+ npm run check-config # validate env
44
+ npm run build # tsc → dist/
45
+ npm start # node dist/index.js
46
+ ```
47
+
48
+ ## Configure for Claude Code
49
+
50
+ ```bash
51
+ claude mcp add proxmox \
52
+ --command "npx" --args "-y,proxmox-mcps" \
53
+ --env "PROXMOX_HOST=proxmox.example.com" \
54
+ --env "PROXMOX_PORT=8006" \
55
+ --env "PROXMOX_USER=root@pam" \
56
+ --env "PROXMOX_TOKEN_NAME=mcp" \
57
+ --env "PROXMOX_TOKEN_VALUE=<uuid>" \
58
+ --env "PROXMOX_VERIFY_SSL=false" \
59
+ --env "PROXMOX_DEV_MODE=true"
60
+ ```
61
+
62
+ Restart Claude Code, verify with `/mcp` (should show `proxmox` with 195 tools).
63
+
64
+ ### Get an API token
65
+
66
+ Proxmox UI → **Datacenter → Permissions → API Tokens → Add** → user `root@pam`, token ID `mcp`, uncheck **Privilege Separation** → copy the secret UUID into `PROXMOX_TOKEN_VALUE`.
67
+
68
+ Full env-var reference: [`.env.example`](.env.example).
69
+
70
+ ## License
71
+
72
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=check-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-config.d.ts","sourceRoot":"","sources":["../../src/cli/check-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `proxmox-mcp --check-config` — validate environment variables without
4
+ * starting the MCP server.
5
+ */
6
+ import { loadConfig } from "../config/index.js";
7
+ try {
8
+ const cfg = loadConfig();
9
+ process.stdout.write(`[OK] Configuration is valid.\n\n` +
10
+ ` Proxmox: ${cfg.proxmox.user}@${cfg.proxmox.host}:${cfg.proxmox.port}\n` +
11
+ ` Service: ${cfg.proxmox.service}\n` +
12
+ ` Verify SSL: ${cfg.proxmox.verifySsl}\n` +
13
+ ` Dev mode: ${cfg.safety.devMode}\n` +
14
+ ` Dangerously allow destructive: ${cfg.safety.dangerouslyAllowDestructive}\n` +
15
+ ` Approval token configured: ${cfg.safety.approvalToken ? "yes" : "no"}\n` +
16
+ ` Audit only: ${cfg.safety.auditOnly}\n` +
17
+ ` Log level: ${cfg.logLevel}\n` +
18
+ ` SSH user: ${cfg.ssh.user}@*:${cfg.ssh.port}\n` +
19
+ ` SSH key file: ${cfg.ssh.keyFile ?? "(none)"}\n` +
20
+ ` Retry max: ${cfg.retryJob.retryMax} (base ${cfg.retryJob.retryBaseMs}ms)\n` +
21
+ ` Job TTL: ${cfg.retryJob.jobTtlHours}h\n`);
22
+ process.exit(0);
23
+ }
24
+ catch (err) {
25
+ process.stderr.write(`[FAIL] ${err instanceof Error ? err.message : String(err)}\n\n` +
26
+ `Run 'cp .env.example .env' and fill in your Proxmox host + API token.\n`);
27
+ process.exit(2);
28
+ }
29
+ //# sourceMappingURL=check-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-config.js","sourceRoot":"","sources":["../../src/cli/check-config.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kCAAkC;QAChC,cAAc,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;QAC1E,cAAc,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI;QACrC,iBAAiB,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI;QAC1C,eAAe,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI;QACrC,oCAAoC,GAAG,CAAC,MAAM,CAAC,2BAA2B,IAAI;QAC9E,gCAAgC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QAC3E,iBAAiB,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI;QACzC,gBAAgB,GAAG,CAAC,QAAQ,IAAI;QAChC,eAAe,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;QACjD,mBAAmB,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,IAAI;QAClD,gBAAgB,GAAG,CAAC,QAAQ,CAAC,QAAQ,UAAU,GAAG,CAAC,QAAQ,CAAC,WAAW,OAAO;QAC9E,cAAc,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,CAC9C,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM;QAC9D,yEAAyE,CAC5E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import "../safety/risk.js";
3
+ import "../tools/index.js";
4
+ //# sourceMappingURL=print-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-tools.d.ts","sourceRoot":"","sources":["../../src/cli/print-tools.ts"],"names":[],"mappings":";AAaA,OAAO,mBAAmB,CAAC;AAG3B,OAAO,mBAAmB,CAAC"}
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `proxmox-mcp --print-tools` — list every tool that would be registered.
4
+ *
5
+ * Pass `destructive` as the first arg to list only tools that require
6
+ * approval (risk=destructive).
7
+ *
8
+ * Usage:
9
+ * node dist/cli/print-tools.js # all tools
10
+ * node dist/cli/print-tools.js destructive # only approval-gated tools
11
+ */
12
+ import { listRiskRegistry } from "../safety/policy.js";
13
+ // Side-effect import: triggers risk registration (Phase 1B+).
14
+ import "../safety/risk.js";
15
+ // Side-effect import: also pulls in tool files so any future per-file
16
+ // registration logic runs.
17
+ import "../tools/index.js";
18
+ const filter = (process.argv[2] ?? "").trim().toLowerCase();
19
+ const reg = listRiskRegistry();
20
+ let tools = Object.entries(reg);
21
+ if (filter === "destructive") {
22
+ tools = tools.filter(([, risk]) => risk === "destructive");
23
+ if (tools.length === 0) {
24
+ process.stdout.write("[INFO] No destructive tools registered.\n");
25
+ process.exit(0);
26
+ }
27
+ process.stdout.write(`[OK] ${tools.length} destructive (approval-required) tool(s):\n\n`);
28
+ }
29
+ else if (filter === "high" || filter === "medium" || filter === "low") {
30
+ tools = tools.filter(([, risk]) => risk === filter);
31
+ process.stdout.write(`[OK] ${tools.length} ${filter}-risk tool(s):\n\n`);
32
+ }
33
+ else if (tools.length === 0) {
34
+ process.stdout.write("[INFO] No tools registered yet. (Phase 1A skeleton)\n");
35
+ process.exit(0);
36
+ }
37
+ else {
38
+ process.stdout.write(`[OK] ${tools.length} tool(s) registered:\n\n`);
39
+ }
40
+ tools.sort(([a], [b]) => a.localeCompare(b));
41
+ const maxLen = Math.max(...tools.map(([n]) => n.length));
42
+ for (const [name, risk] of tools) {
43
+ process.stdout.write(` ${name.padEnd(maxLen)} risk=${risk}\n`);
44
+ }
45
+ //# sourceMappingURL=print-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print-tools.js","sourceRoot":"","sources":["../../src/cli/print-tools.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,8DAA8D;AAC9D,OAAO,mBAAmB,CAAC;AAC3B,sEAAsE;AACtE,2BAA2B;AAC3B,OAAO,mBAAmB,CAAC;AAE3B,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAE5D,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;AAC/B,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAEhC,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;IAC7B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,+CAA+C,CAAC,CAAC;AAC5F,CAAC;KAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;IACxE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,IAAI,MAAM,oBAAoB,CAAC,CAAC;AAC3E,CAAC;KAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,0BAA0B,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACzD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Environment variable schema. Single source of truth for runtime config.
3
+ *
4
+ * Validates process.env at startup. Exits with code 2 on validation failure.
5
+ */
6
+ import { z } from "zod";
7
+ import type { LoggerConfig } from "../log.js";
8
+ declare const EnvSchema: z.ZodEffects<z.ZodObject<{
9
+ PROXMOX_HOST: z.ZodString;
10
+ PROXMOX_PORT: z.ZodDefault<z.ZodNumber>;
11
+ PROXMOX_USER: z.ZodString;
12
+ PROXMOX_TOKEN_NAME: z.ZodString;
13
+ PROXMOX_TOKEN_VALUE: z.ZodString;
14
+ PROXMOX_VERIFY_SSL: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
15
+ PROXMOX_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
16
+ PROXMOX_SERVICE: z.ZodDefault<z.ZodEnum<["PVE", "PMG", "PBS"]>>;
17
+ PROXMOX_DEV_MODE: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
18
+ PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
19
+ PROXMOX_MCP_APPROVAL_TOKEN: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
20
+ PROXMOX_MCP_AUDIT_ONLY: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
21
+ LOG_LEVEL: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
22
+ LOG_PRETTY: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
23
+ PROXMOX_MCP_RETRY_MAX: z.ZodDefault<z.ZodNumber>;
24
+ PROXMOX_MCP_RETRY_BASE_MS: z.ZodDefault<z.ZodNumber>;
25
+ PROXMOX_MCP_JOB_TTL_HOURS: z.ZodDefault<z.ZodNumber>;
26
+ PROXMOX_MCP_JOB_STORE: z.ZodDefault<z.ZodEnum<["memory", "sqlite"]>>;
27
+ PROXMOX_MCP_JOB_SQLITE_PATH: z.ZodDefault<z.ZodString>;
28
+ MCP_TRANSPORT: z.ZodDefault<z.ZodEnum<["STDIO", "SSE", "STREAMABLE"]>>;
29
+ MCP_HOST: z.ZodDefault<z.ZodString>;
30
+ MCP_PORT: z.ZodDefault<z.ZodNumber>;
31
+ PROXMOX_SSH_USER: z.ZodDefault<z.ZodString>;
32
+ PROXMOX_SSH_PORT: z.ZodDefault<z.ZodNumber>;
33
+ PROXMOX_SSH_KEY_FILE: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
34
+ PROXMOX_SSH_PASSWORD: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
35
+ PROXMOX_SSH_HOST_OVERRIDES: z.ZodEffects<z.ZodOptional<z.ZodString>, Record<string, string>, string | undefined>;
36
+ PROXMOX_SSH_KNOWN_HOSTS_FILE: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
37
+ PROXMOX_SSH_STRICT_HOST_KEY_CHECKING: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
38
+ PROXMOX_DOWNLOAD_ALLOWED_SCHEMES: z.ZodEffects<z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>, string[] | readonly ["http", "https"], string | undefined>;
39
+ PROXMOX_DOWNLOAD_ALLOWED_HOSTS: z.ZodEffects<z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>, string[], string | undefined>;
40
+ }, "strip", z.ZodTypeAny, {
41
+ PROXMOX_HOST: string;
42
+ PROXMOX_PORT: number;
43
+ PROXMOX_USER: string;
44
+ PROXMOX_TOKEN_NAME: string;
45
+ PROXMOX_TOKEN_VALUE: string;
46
+ PROXMOX_VERIFY_SSL: boolean;
47
+ PROXMOX_TIMEOUT_MS: number;
48
+ PROXMOX_SERVICE: "PVE" | "PMG" | "PBS";
49
+ PROXMOX_DEV_MODE: boolean;
50
+ PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE: boolean;
51
+ PROXMOX_MCP_AUDIT_ONLY: boolean;
52
+ LOG_LEVEL: "debug" | "info" | "warn" | "error";
53
+ LOG_PRETTY: boolean;
54
+ PROXMOX_MCP_RETRY_MAX: number;
55
+ PROXMOX_MCP_RETRY_BASE_MS: number;
56
+ PROXMOX_MCP_JOB_TTL_HOURS: number;
57
+ PROXMOX_MCP_JOB_STORE: "memory" | "sqlite";
58
+ PROXMOX_MCP_JOB_SQLITE_PATH: string;
59
+ MCP_TRANSPORT: "STDIO" | "SSE" | "STREAMABLE";
60
+ MCP_HOST: string;
61
+ MCP_PORT: number;
62
+ PROXMOX_SSH_USER: string;
63
+ PROXMOX_SSH_PORT: number;
64
+ PROXMOX_SSH_HOST_OVERRIDES: Record<string, string>;
65
+ PROXMOX_SSH_STRICT_HOST_KEY_CHECKING: boolean;
66
+ PROXMOX_DOWNLOAD_ALLOWED_SCHEMES: string[] | readonly ["http", "https"];
67
+ PROXMOX_DOWNLOAD_ALLOWED_HOSTS: string[];
68
+ PROXMOX_MCP_APPROVAL_TOKEN?: string | undefined;
69
+ PROXMOX_SSH_KEY_FILE?: string | undefined;
70
+ PROXMOX_SSH_PASSWORD?: string | undefined;
71
+ PROXMOX_SSH_KNOWN_HOSTS_FILE?: string | undefined;
72
+ }, {
73
+ PROXMOX_HOST: string;
74
+ PROXMOX_USER: string;
75
+ PROXMOX_TOKEN_NAME: string;
76
+ PROXMOX_TOKEN_VALUE: string;
77
+ PROXMOX_PORT?: number | undefined;
78
+ PROXMOX_VERIFY_SSL?: string | boolean | undefined;
79
+ PROXMOX_TIMEOUT_MS?: number | undefined;
80
+ PROXMOX_SERVICE?: "PVE" | "PMG" | "PBS" | undefined;
81
+ PROXMOX_DEV_MODE?: string | boolean | undefined;
82
+ PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE?: string | boolean | undefined;
83
+ PROXMOX_MCP_APPROVAL_TOKEN?: string | undefined;
84
+ PROXMOX_MCP_AUDIT_ONLY?: string | boolean | undefined;
85
+ LOG_LEVEL?: "debug" | "info" | "warn" | "error" | undefined;
86
+ LOG_PRETTY?: string | boolean | undefined;
87
+ PROXMOX_MCP_RETRY_MAX?: number | undefined;
88
+ PROXMOX_MCP_RETRY_BASE_MS?: number | undefined;
89
+ PROXMOX_MCP_JOB_TTL_HOURS?: number | undefined;
90
+ PROXMOX_MCP_JOB_STORE?: "memory" | "sqlite" | undefined;
91
+ PROXMOX_MCP_JOB_SQLITE_PATH?: string | undefined;
92
+ MCP_TRANSPORT?: "STDIO" | "SSE" | "STREAMABLE" | undefined;
93
+ MCP_HOST?: string | undefined;
94
+ MCP_PORT?: number | undefined;
95
+ PROXMOX_SSH_USER?: string | undefined;
96
+ PROXMOX_SSH_PORT?: number | undefined;
97
+ PROXMOX_SSH_KEY_FILE?: string | undefined;
98
+ PROXMOX_SSH_PASSWORD?: string | undefined;
99
+ PROXMOX_SSH_HOST_OVERRIDES?: string | undefined;
100
+ PROXMOX_SSH_KNOWN_HOSTS_FILE?: string | undefined;
101
+ PROXMOX_SSH_STRICT_HOST_KEY_CHECKING?: string | boolean | undefined;
102
+ PROXMOX_DOWNLOAD_ALLOWED_SCHEMES?: string | undefined;
103
+ PROXMOX_DOWNLOAD_ALLOWED_HOSTS?: string | undefined;
104
+ }>, {
105
+ PROXMOX_HOST: string;
106
+ PROXMOX_PORT: number;
107
+ PROXMOX_USER: string;
108
+ PROXMOX_TOKEN_NAME: string;
109
+ PROXMOX_TOKEN_VALUE: string;
110
+ PROXMOX_VERIFY_SSL: boolean;
111
+ PROXMOX_TIMEOUT_MS: number;
112
+ PROXMOX_SERVICE: "PVE" | "PMG" | "PBS";
113
+ PROXMOX_DEV_MODE: boolean;
114
+ PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE: boolean;
115
+ PROXMOX_MCP_AUDIT_ONLY: boolean;
116
+ LOG_LEVEL: "debug" | "info" | "warn" | "error";
117
+ LOG_PRETTY: boolean;
118
+ PROXMOX_MCP_RETRY_MAX: number;
119
+ PROXMOX_MCP_RETRY_BASE_MS: number;
120
+ PROXMOX_MCP_JOB_TTL_HOURS: number;
121
+ PROXMOX_MCP_JOB_STORE: "memory" | "sqlite";
122
+ PROXMOX_MCP_JOB_SQLITE_PATH: string;
123
+ MCP_TRANSPORT: "STDIO" | "SSE" | "STREAMABLE";
124
+ MCP_HOST: string;
125
+ MCP_PORT: number;
126
+ PROXMOX_SSH_USER: string;
127
+ PROXMOX_SSH_PORT: number;
128
+ PROXMOX_SSH_HOST_OVERRIDES: Record<string, string>;
129
+ PROXMOX_SSH_STRICT_HOST_KEY_CHECKING: boolean;
130
+ PROXMOX_DOWNLOAD_ALLOWED_SCHEMES: string[] | readonly ["http", "https"];
131
+ PROXMOX_DOWNLOAD_ALLOWED_HOSTS: string[];
132
+ PROXMOX_MCP_APPROVAL_TOKEN?: string | undefined;
133
+ PROXMOX_SSH_KEY_FILE?: string | undefined;
134
+ PROXMOX_SSH_PASSWORD?: string | undefined;
135
+ PROXMOX_SSH_KNOWN_HOSTS_FILE?: string | undefined;
136
+ }, {
137
+ PROXMOX_HOST: string;
138
+ PROXMOX_USER: string;
139
+ PROXMOX_TOKEN_NAME: string;
140
+ PROXMOX_TOKEN_VALUE: string;
141
+ PROXMOX_PORT?: number | undefined;
142
+ PROXMOX_VERIFY_SSL?: string | boolean | undefined;
143
+ PROXMOX_TIMEOUT_MS?: number | undefined;
144
+ PROXMOX_SERVICE?: "PVE" | "PMG" | "PBS" | undefined;
145
+ PROXMOX_DEV_MODE?: string | boolean | undefined;
146
+ PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE?: string | boolean | undefined;
147
+ PROXMOX_MCP_APPROVAL_TOKEN?: string | undefined;
148
+ PROXMOX_MCP_AUDIT_ONLY?: string | boolean | undefined;
149
+ LOG_LEVEL?: "debug" | "info" | "warn" | "error" | undefined;
150
+ LOG_PRETTY?: string | boolean | undefined;
151
+ PROXMOX_MCP_RETRY_MAX?: number | undefined;
152
+ PROXMOX_MCP_RETRY_BASE_MS?: number | undefined;
153
+ PROXMOX_MCP_JOB_TTL_HOURS?: number | undefined;
154
+ PROXMOX_MCP_JOB_STORE?: "memory" | "sqlite" | undefined;
155
+ PROXMOX_MCP_JOB_SQLITE_PATH?: string | undefined;
156
+ MCP_TRANSPORT?: "STDIO" | "SSE" | "STREAMABLE" | undefined;
157
+ MCP_HOST?: string | undefined;
158
+ MCP_PORT?: number | undefined;
159
+ PROXMOX_SSH_USER?: string | undefined;
160
+ PROXMOX_SSH_PORT?: number | undefined;
161
+ PROXMOX_SSH_KEY_FILE?: string | undefined;
162
+ PROXMOX_SSH_PASSWORD?: string | undefined;
163
+ PROXMOX_SSH_HOST_OVERRIDES?: string | undefined;
164
+ PROXMOX_SSH_KNOWN_HOSTS_FILE?: string | undefined;
165
+ PROXMOX_SSH_STRICT_HOST_KEY_CHECKING?: string | boolean | undefined;
166
+ PROXMOX_DOWNLOAD_ALLOWED_SCHEMES?: string | undefined;
167
+ PROXMOX_DOWNLOAD_ALLOWED_HOSTS?: string | undefined;
168
+ }>;
169
+ export type EnvInput = z.infer<typeof EnvSchema>;
170
+ /**
171
+ * Parse and validate process.env. Throws ZodError on failure.
172
+ */
173
+ export declare function parseEnv(env?: NodeJS.ProcessEnv): EnvInput;
174
+ /**
175
+ * Parse and exit with code 2 on failure. Use in entry points.
176
+ */
177
+ export declare function parseEnvOrExit(env?: NodeJS.ProcessEnv): EnvInput;
178
+ /**
179
+ * Build a LoggerConfig from env.
180
+ */
181
+ export declare function loggerConfigFromEnv(env: EnvInput): LoggerConfig;
182
+ export {};
183
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AA6C9C,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiFX,CAAC;AAEL,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAEjD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,QAAQ,CASvE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,QAAQ,CAU7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,GAAG,YAAY,CAE/D"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Environment variable schema. Single source of truth for runtime config.
3
+ *
4
+ * Validates process.env at startup. Exits with code 2 on validation failure.
5
+ */
6
+ import { z } from "zod";
7
+ const USER_REGEX = /^[\w.\-]+(@[a-z][a-z0-9\-]+)?$/i;
8
+ const HOST_REGEX = /^[a-zA-Z0-9]([a-zA-Z0-9\-_.]*[a-zA-Z0-9])?$/;
9
+ const LogLevelSchema = z.enum(["debug", "info", "warn", "error"]);
10
+ const ServiceSchema = z.enum(["PVE", "PMG", "PBS"]);
11
+ /**
12
+ * Coerce env-style boolean strings to actual booleans. z.coerce.boolean() is
13
+ * broken (any non-empty string is truthy), so we explicitly map "true"/"1" to
14
+ * true and everything else to false.
15
+ */
16
+ const BoolFromString = z
17
+ .union([z.boolean(), z.string()])
18
+ .transform((v) => {
19
+ if (typeof v === "boolean")
20
+ return v;
21
+ return /^(true|1|yes|on)$/i.test(v.trim());
22
+ });
23
+ const SshHostOverridesSchema = z
24
+ .string()
25
+ .optional()
26
+ .transform((raw) => {
27
+ if (!raw || raw.trim() === "")
28
+ return {};
29
+ try {
30
+ const parsed = JSON.parse(raw);
31
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
32
+ throw new Error("PROXMOX_SSH_HOST_OVERRIDES must be a JSON object");
33
+ }
34
+ const out = {};
35
+ for (const [k, v] of Object.entries(parsed)) {
36
+ if (typeof v !== "string") {
37
+ throw new Error(`PROXMOX_SSH_HOST_OVERRIDES[${k}] must be a string`);
38
+ }
39
+ out[k] = v;
40
+ }
41
+ return out;
42
+ }
43
+ catch (err) {
44
+ throw new Error(`PROXMOX_SSH_HOST_OVERRIDES: ${err instanceof Error ? err.message : String(err)}`);
45
+ }
46
+ });
47
+ const EnvSchema = z
48
+ .object({
49
+ // Proxmox API connection
50
+ PROXMOX_HOST: z.string().min(1).regex(HOST_REGEX, "invalid hostname"),
51
+ PROXMOX_PORT: z.coerce.number().int().min(1).max(65535).default(8006),
52
+ PROXMOX_USER: z.string().regex(USER_REGEX, "must be like 'user@realm'"),
53
+ PROXMOX_TOKEN_NAME: z.string().min(1),
54
+ PROXMOX_TOKEN_VALUE: z.string().min(8),
55
+ PROXMOX_VERIFY_SSL: BoolFromString.default(true),
56
+ PROXMOX_TIMEOUT_MS: z.coerce.number().int().min(1000).max(600_000).default(30_000),
57
+ PROXMOX_SERVICE: ServiceSchema.default("PVE"),
58
+ // Safety
59
+ PROXMOX_DEV_MODE: BoolFromString.default(false),
60
+ PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE: BoolFromString.default(false),
61
+ PROXMOX_MCP_APPROVAL_TOKEN: z.string().min(8).optional().or(z.literal("")),
62
+ PROXMOX_MCP_AUDIT_ONLY: BoolFromString.default(false),
63
+ // Logging
64
+ LOG_LEVEL: LogLevelSchema.default("info"),
65
+ LOG_PRETTY: BoolFromString.default(false),
66
+ // Retry & jobs
67
+ PROXMOX_MCP_RETRY_MAX: z.coerce.number().int().min(0).max(10).default(3),
68
+ PROXMOX_MCP_RETRY_BASE_MS: z.coerce.number().int().min(50).max(10_000).default(200),
69
+ PROXMOX_MCP_JOB_TTL_HOURS: z.coerce.number().int().min(1).max(168).default(24),
70
+ PROXMOX_MCP_JOB_STORE: z.enum(["memory", "sqlite"]).default("memory"),
71
+ PROXMOX_MCP_JOB_SQLITE_PATH: z.string().min(1).default("./proxmox-jobs.sqlite3"),
72
+ // Transport (Phase 2A)
73
+ MCP_TRANSPORT: z.enum(["STDIO", "SSE", "STREAMABLE"]).default("STDIO"),
74
+ MCP_HOST: z.string().default("127.0.0.1"),
75
+ MCP_PORT: z.coerce.number().int().min(1).max(65535).default(8000),
76
+ // SSH (for `pct exec` on containers)
77
+ PROXMOX_SSH_USER: z.string().default("root"),
78
+ PROXMOX_SSH_PORT: z.coerce.number().int().min(1).max(65535).default(22),
79
+ PROXMOX_SSH_KEY_FILE: z.string().optional().or(z.literal("")),
80
+ PROXMOX_SSH_PASSWORD: z.string().optional().or(z.literal("")),
81
+ PROXMOX_SSH_HOST_OVERRIDES: SshHostOverridesSchema,
82
+ PROXMOX_SSH_KNOWN_HOSTS_FILE: z.string().optional().or(z.literal("")),
83
+ PROXMOX_SSH_STRICT_HOST_KEY_CHECKING: BoolFromString.default(true),
84
+ // Download guard (SSRF mitigation for download_iso etc.)
85
+ PROXMOX_DOWNLOAD_ALLOWED_SCHEMES: z
86
+ .string()
87
+ .optional()
88
+ .or(z.literal(""))
89
+ .transform((raw) => !raw || raw.trim() === ""
90
+ ? ["http", "https"]
91
+ : raw
92
+ .split(",")
93
+ .map((s) => s.trim().toLowerCase())
94
+ .filter(Boolean)),
95
+ PROXMOX_DOWNLOAD_ALLOWED_HOSTS: z
96
+ .string()
97
+ .optional()
98
+ .or(z.literal(""))
99
+ .transform((raw) => !raw || raw.trim() === ""
100
+ ? []
101
+ : raw.split(",").map((s) => s.trim()).filter(Boolean)),
102
+ })
103
+ .superRefine((data, ctx) => {
104
+ // Guard: verify_ssl=false requires dev_mode=true
105
+ if (!data.PROXMOX_VERIFY_SSL && !data.PROXMOX_DEV_MODE) {
106
+ ctx.addIssue({
107
+ code: z.ZodIssueCode.custom,
108
+ path: ["PROXMOX_VERIFY_SSL"],
109
+ message: "PROXMOX_VERIFY_SSL=false requires PROXMOX_DEV_MODE=true",
110
+ });
111
+ }
112
+ // Guard: at least one of key_file or password for SSH (warning only)
113
+ // We don't enforce — user might want password prompt via agent.
114
+ // Guard: approval_token or dangerously_allow_destructive should be set
115
+ // for any use of destructive tools. We log a warning at startup.
116
+ });
117
+ /**
118
+ * Parse and validate process.env. Throws ZodError on failure.
119
+ */
120
+ export function parseEnv(env = process.env) {
121
+ const result = EnvSchema.safeParse(env);
122
+ if (!result.success) {
123
+ const issues = result.error.issues
124
+ .map((i) => ` - ${i.path.join(".") || "(root)"}: ${i.message}`)
125
+ .join("\n");
126
+ throw new Error(`Invalid environment configuration:\n${issues}`);
127
+ }
128
+ return result.data;
129
+ }
130
+ /**
131
+ * Parse and exit with code 2 on failure. Use in entry points.
132
+ */
133
+ export function parseEnvOrExit(env = process.env) {
134
+ try {
135
+ return parseEnv(env);
136
+ }
137
+ catch (err) {
138
+ process.stderr.write(`\n[FATAL] ${err instanceof Error ? err.message : String(err)}\n\n` +
139
+ `Run 'npm run check-config' to diagnose, or 'cp .env.example .env' to start.\n`);
140
+ process.exit(2);
141
+ }
142
+ }
143
+ /**
144
+ * Build a LoggerConfig from env.
145
+ */
146
+ export function loggerConfigFromEnv(env) {
147
+ return { level: env.LOG_LEVEL, pretty: env.LOG_PRETTY };
148
+ }
149
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Config entrypoint. Loads .env, parses env, returns AppConfig.
3
+ *
4
+ * Usage:
5
+ * import { loadConfig } from "./config/index.js";
6
+ * const cfg = loadConfig();
7
+ */
8
+ import "dotenv/config";
9
+ import { type AppConfig } from "./types.js";
10
+ import type { LoggerConfig } from "../log.js";
11
+ export { parseEnv, loggerConfigFromEnv } from "./env.js";
12
+ export type { EnvInput } from "./env.js";
13
+ export * from "./types.js";
14
+ /**
15
+ * Load (and cache) the AppConfig. Subsequent calls return the cached value.
16
+ */
17
+ export declare function loadConfig(): AppConfig;
18
+ /**
19
+ * Load (and cache) the LoggerConfig.
20
+ */
21
+ export declare function loadLoggerConfig(): LoggerConfig;
22
+ /**
23
+ * Reset cached config (tests).
24
+ */
25
+ export declare function resetConfig(): void;
26
+ //# sourceMappingURL=index.d.ts.map