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
@@ -0,0 +1,115 @@
1
+ import { z } from "zod";
2
+ import * as paths from "../../proxmox/paths.js";
3
+ import { runTool, jsonResult } from "../../format/response.js";
4
+ const TimeframeSchema = z.enum(["hour", "day", "week", "month", "year"]);
5
+ export function registerContainerDiagnosticsTools(server, ctx) {
6
+ server.registerTool("get_container_rrd", {
7
+ title: "Get container RRD time series",
8
+ description: "Return RRD time series for an LXC container.",
9
+ inputSchema: z
10
+ .object({
11
+ node: z.string().min(1),
12
+ vmid: z.string().regex(/^\d+$/),
13
+ timeframe: TimeframeSchema,
14
+ cf: z.enum(["AVERAGE", "MAX", "MIN"]).default("AVERAGE"),
15
+ ds: z.string().optional(),
16
+ })
17
+ .strict(),
18
+ annotations: {
19
+ readOnlyHint: true,
20
+ destructiveHint: false,
21
+ idempotentHint: true,
22
+ openWorldHint: false,
23
+ },
24
+ }, async ({ node, vmid, timeframe, cf, ds }) => runTool(ctx, "get_container_rrd", { node, vmid, timeframe, cf, ds }, async () => {
25
+ const params = { cf };
26
+ if (ds)
27
+ params.ds = ds;
28
+ const data = await ctx.client.get(paths.lxcRrd(node, vmid, timeframe), params);
29
+ return jsonResult(`RRD for container ${vmid}:`, data);
30
+ }));
31
+ server.registerTool("get_container_rrddata", {
32
+ title: "Get container recent RRD samples",
33
+ description: "Return recent RRD samples for an LXC container.",
34
+ inputSchema: z
35
+ .object({
36
+ node: z.string().min(1),
37
+ vmid: z.string().regex(/^\d+$/),
38
+ timeframe: TimeframeSchema,
39
+ })
40
+ .strict(),
41
+ annotations: {
42
+ readOnlyHint: true,
43
+ destructiveHint: false,
44
+ idempotentHint: true,
45
+ openWorldHint: false,
46
+ },
47
+ }, async ({ node, vmid, timeframe }) => runTool(ctx, "get_container_rrddata", { node, vmid, timeframe }, async () => {
48
+ const data = await ctx.client.get(paths.lxcRrdData(node, vmid, timeframe));
49
+ return jsonResult(`Recent RRD for container ${vmid}:`, data);
50
+ }));
51
+ server.registerTool("container_firewall_rules", {
52
+ title: "Get container firewall rules",
53
+ description: "Return firewall rules for an LXC container.",
54
+ inputSchema: z
55
+ .object({
56
+ node: z.string().min(1),
57
+ vmid: z.string().regex(/^\d+$/),
58
+ })
59
+ .strict(),
60
+ annotations: {
61
+ readOnlyHint: true,
62
+ destructiveHint: false,
63
+ idempotentHint: true,
64
+ openWorldHint: false,
65
+ },
66
+ }, async ({ node, vmid }) => runTool(ctx, "container_firewall_rules", { node, vmid }, async () => {
67
+ const data = await ctx.client.get(paths.lxcFirewallRules(node, vmid));
68
+ return jsonResult(`Firewall rules for container ${vmid}:`, data);
69
+ }));
70
+ server.registerTool("container_firewall_options", {
71
+ title: "Get container firewall options",
72
+ description: "Return container firewall options.",
73
+ inputSchema: z
74
+ .object({
75
+ node: z.string().min(1),
76
+ vmid: z.string().regex(/^\d+$/),
77
+ })
78
+ .strict(),
79
+ annotations: {
80
+ readOnlyHint: true,
81
+ destructiveHint: false,
82
+ idempotentHint: true,
83
+ openWorldHint: false,
84
+ },
85
+ }, async ({ node, vmid }) => runTool(ctx, "container_firewall_options", { node, vmid }, async () => {
86
+ const data = await ctx.client.get(paths.lxcFirewallOptions(node, vmid));
87
+ return jsonResult(`Firewall options for container ${vmid}:`, data);
88
+ }));
89
+ server.registerTool("execute_container_command", {
90
+ title: "Execute command in container (SSH + pct exec)",
91
+ description: "Run a shell command inside an LXC container by shelling out to `pct exec <vmid> -- <cmd>` on the host. Requires SSH access (PROXMOX_SSH_* env).",
92
+ inputSchema: z
93
+ .object({
94
+ node: z.string().min(1).describe("Host node that owns the container"),
95
+ vmid: z.string().regex(/^\d+$/).describe("Container ID"),
96
+ command: z.string().min(1).describe("Shell command to run inside the container"),
97
+ timeout_seconds: z.number().int().min(1).max(600).optional().describe("Client timeout"),
98
+ })
99
+ .strict(),
100
+ annotations: {
101
+ readOnlyHint: false,
102
+ destructiveHint: false,
103
+ idempotentHint: false,
104
+ openWorldHint: true,
105
+ },
106
+ }, async ({ node, vmid, command, timeout_seconds }) => runTool(ctx, "execute_container_command", { node, vmid, command }, async () => {
107
+ const result = await ctx.ssh.pctExec(node, vmid, command);
108
+ const out = `Exit code: ${result.exitCode}\n` +
109
+ `Duration: ${result.durationMs}ms\n` +
110
+ (result.stdout ? `\n--- stdout ---\n${result.stdout}` : "") +
111
+ (result.stderr ? `\n--- stderr ---\n${result.stderr}` : "");
112
+ return jsonResult(out, { exitCode: result.exitCode, durationMs: result.durationMs, timeout: timeout_seconds });
113
+ }));
114
+ }
115
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/tools/container/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Container Migration & storage tools.
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import type { ToolContext } from "../context.js";
6
+ export declare function registerContainerMigrationTools(server: McpServer, ctx: ToolContext): void;
7
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/tools/container/migration.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAIjD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA+JzF"}
@@ -0,0 +1,134 @@
1
+ import { z } from "zod";
2
+ import * as paths from "../../proxmox/paths.js";
3
+ import { runTool, jsonResult } from "../../format/response.js";
4
+ import { trackUpid } from "../helpers.js";
5
+ export function registerContainerMigrationTools(server, ctx) {
6
+ server.registerTool("migrate_container", {
7
+ title: "Migrate container between nodes",
8
+ description: "Migrate an LXC container to a different node (online/offline). With online=true the container keeps running.",
9
+ inputSchema: z
10
+ .object({
11
+ node: z.string().min(1).describe("Source node"),
12
+ vmid: z.string().regex(/^\d+$/),
13
+ target_node: z.string().optional(),
14
+ online: z.boolean().optional(),
15
+ with_local_disks: z.boolean().optional(),
16
+ restart: z.boolean().optional().describe("Restart after offline migration"),
17
+ timeout: z.number().int().min(0).max(3600).optional(),
18
+ })
19
+ .strict(),
20
+ annotations: {
21
+ readOnlyHint: false,
22
+ destructiveHint: false,
23
+ idempotentHint: false,
24
+ openWorldHint: true,
25
+ },
26
+ }, async ({ node, vmid, target_node, online, with_local_disks, restart, timeout }) => runTool(ctx, "migrate_container", { node, vmid, target_node, online, with_local_disks, restart, timeout }, async () => {
27
+ const body = {};
28
+ if (target_node)
29
+ body.target = target_node;
30
+ if (online !== undefined)
31
+ body.online = online ? 1 : 0;
32
+ if (with_local_disks !== undefined)
33
+ body["with-local-disks"] = with_local_disks ? 1 : 0;
34
+ if (restart !== undefined)
35
+ body.restart = restart ? 1 : 0;
36
+ if (timeout !== undefined)
37
+ body.timeout = timeout;
38
+ const upid = await ctx.client.post(paths.lxcMigrate(node, vmid), body);
39
+ const job = trackUpid(ctx, upid, {
40
+ node,
41
+ tool: "migrate_container",
42
+ args: { node, vmid, target_node, online },
43
+ });
44
+ return jsonResult(`Container ${vmid} migration started.`, { job_id: job.job_id, upid });
45
+ }));
46
+ server.registerTool("move_container_disk", {
47
+ title: "Move container disk",
48
+ description: "Move a container volume to a different storage pool.",
49
+ inputSchema: z
50
+ .object({
51
+ node: z.string().min(1),
52
+ vmid: z.string().regex(/^\d+$/),
53
+ disk: z.string().min(1).describe("Volume identifier (e.g. rootfs, mp0)"),
54
+ storage: z.string().min(1),
55
+ format: z.enum(["raw", "qcow2", "vmdk"]).optional(),
56
+ delete_source: z.boolean().optional(),
57
+ })
58
+ .strict(),
59
+ annotations: {
60
+ readOnlyHint: false,
61
+ destructiveHint: false,
62
+ idempotentHint: false,
63
+ openWorldHint: true,
64
+ },
65
+ }, async ({ node, vmid, disk, storage, format, delete_source }) => runTool(ctx, "move_container_disk", { node, vmid, disk, storage, format, delete_source }, async () => {
66
+ const body = { storage };
67
+ if (format)
68
+ body.format = format;
69
+ if (delete_source !== undefined)
70
+ body.delete = delete_source ? 1 : 0;
71
+ const upid = await ctx.client.post(paths.lxcMoveDisk(node, vmid, disk), body);
72
+ const job = trackUpid(ctx, upid, {
73
+ node,
74
+ tool: "move_container_disk",
75
+ args: { node, vmid, disk, storage },
76
+ });
77
+ return jsonResult(`Container ${vmid} ${disk} move started.`, { job_id: job.job_id, upid });
78
+ }));
79
+ server.registerTool("convert_container_to_template", {
80
+ title: "Convert container to template",
81
+ description: "Convert an LXC container into a template. HIGH RISK — original becomes read-only.",
82
+ inputSchema: z
83
+ .object({
84
+ node: z.string().min(1),
85
+ vmid: z.string().regex(/^\d+$/),
86
+ approval_token: z.string().optional().describe("Approval token for high-risk operation"),
87
+ })
88
+ .strict(),
89
+ annotations: {
90
+ readOnlyHint: false,
91
+ destructiveHint: true,
92
+ idempotentHint: false,
93
+ openWorldHint: true,
94
+ },
95
+ }, async ({ node, vmid, approval_token }) => runTool(ctx, "convert_container_to_template", { node, vmid, approval_token }, async () => {
96
+ const upid = await ctx.client.post(paths.lxcTemplate(node, vmid));
97
+ const job = trackUpid(ctx, upid, {
98
+ node,
99
+ tool: "convert_container_to_template",
100
+ args: { node, vmid },
101
+ });
102
+ return jsonResult(`Container ${vmid} template conversion started.`, { job_id: job.job_id, upid });
103
+ }));
104
+ server.registerTool("unlink_container_disk", {
105
+ title: "Detach container volume",
106
+ description: "Detach an LXC volume (file remains on storage pool).",
107
+ inputSchema: z
108
+ .object({
109
+ node: z.string().min(1),
110
+ vmid: z.string().regex(/^\d+$/),
111
+ volume: z.string().min(1).describe("Volume identifier (e.g. rootfs, mp0)"),
112
+ force: z.boolean().optional(),
113
+ })
114
+ .strict(),
115
+ annotations: {
116
+ readOnlyHint: false,
117
+ destructiveHint: false,
118
+ idempotentHint: false,
119
+ openWorldHint: true,
120
+ },
121
+ }, async ({ node, vmid, volume, force }) => runTool(ctx, "unlink_container_disk", { node, vmid, volume, force }, async () => {
122
+ const params = {};
123
+ if (force)
124
+ params.force = 1;
125
+ const upid = await ctx.client.post(paths.lxcUnlink(node, vmid, volume), params);
126
+ const job = trackUpid(ctx, upid, {
127
+ node,
128
+ tool: "unlink_container_disk",
129
+ args: { node, vmid, volume, force },
130
+ });
131
+ return jsonResult(`Container ${vmid} volume ${volume} unlink started.`, { job_id: job.job_id, upid });
132
+ }));
133
+ }
134
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../../src/tools/container/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ToolContext — dependency injection container passed to every tool.
3
+ *
4
+ * Built once in server.ts, passed to every register*(server, ctx) function.
5
+ * Tools MUST NOT read process.env directly; everything they need is on ctx.
6
+ */
7
+ import type { Logger } from "../log.js";
8
+ import type { AppConfig } from "../config/types.js";
9
+ import type { ProxmoxClient } from "../proxmox/client.js";
10
+ import type { SshClient } from "../ssh/client.js";
11
+ import type { PolicyGate } from "../safety/policy.js";
12
+ import type { JobStore } from "../jobs/store.js";
13
+ export interface ToolContext {
14
+ client: ProxmoxClient;
15
+ ssh: SshClient;
16
+ policy: PolicyGate;
17
+ jobs: JobStore;
18
+ logger: Logger;
19
+ config: AppConfig;
20
+ }
21
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * High-Availability tools (cluster HA): resources, groups, manager status.
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import type { ToolContext } from "./context.js";
6
+ export declare function registerHaTools(server: McpServer, ctx: ToolContext): void;
7
+ //# sourceMappingURL=ha.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ha.d.ts","sourceRoot":"","sources":["../../src/tools/ha.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA2SzE"}
@@ -0,0 +1,241 @@
1
+ import { z } from "zod";
2
+ import * as paths from "../proxmox/paths.js";
3
+ import { runTool, jsonResult } from "../format/response.js";
4
+ export function registerHaTools(server, ctx) {
5
+ // ---- HA Resources (managed VMs/CTs) ------------------------------------
6
+ server.registerTool("list_ha_resources", {
7
+ title: "List HA-managed resources",
8
+ description: "List all VMs and containers currently managed by the HA manager.",
9
+ inputSchema: z.object({}).strict(),
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ destructiveHint: false,
13
+ idempotentHint: true,
14
+ openWorldHint: false,
15
+ },
16
+ }, async () => runTool(ctx, "list_ha_resources", {}, async () => {
17
+ const data = await ctx.client.get(paths.haResources());
18
+ return jsonResult(`HA resources (${Array.isArray(data) ? data.length : "?"}):`, data);
19
+ }));
20
+ server.registerTool("get_ha_resource_status", {
21
+ title: "Get HA resource status",
22
+ description: "Get the current HA manager state for a single resource.",
23
+ inputSchema: z
24
+ .object({ sid: z.string().min(1).describe("Service ID, e.g. 'vm:100' or 'ct:101'") })
25
+ .strict(),
26
+ annotations: {
27
+ readOnlyHint: true,
28
+ destructiveHint: false,
29
+ idempotentHint: true,
30
+ openWorldHint: false,
31
+ },
32
+ }, async ({ sid }) => runTool(ctx, "get_ha_resource_status", { sid }, async () => {
33
+ const data = await ctx.client.get(paths.haResourceStatus(sid));
34
+ return jsonResult(`HA status for ${sid}:`, data);
35
+ }));
36
+ server.registerTool("add_ha_resource", {
37
+ title: "Add HA resource",
38
+ description: "Make a VM or container HA-managed by the cluster. HIGH RISK — service will be restarted on failure.",
39
+ inputSchema: z
40
+ .object({
41
+ sid: z.string().min(1).describe("Service ID, e.g. 'vm:100' or 'ct:101'"),
42
+ group: z.string().optional().describe("HA group to assign (default: 'default')"),
43
+ max_restart: z.number().int().min(0).max(10).optional().describe("Max restart attempts"),
44
+ max_relocate: z.number().int().min(0).max(10).optional().describe("Max relocate attempts"),
45
+ state: z.enum(["started", "stopped", "enabled", "disabled", "ignored"]).default("started"),
46
+ comment: z.string().max(1024).optional(),
47
+ approval_token: z.string().optional(),
48
+ })
49
+ .strict(),
50
+ annotations: {
51
+ readOnlyHint: false,
52
+ destructiveHint: true,
53
+ idempotentHint: false,
54
+ openWorldHint: true,
55
+ },
56
+ }, async (args) => runTool(ctx, "add_ha_resource", args, async () => {
57
+ const body = { sid: args.sid, state: args.state };
58
+ if (args.group)
59
+ body.group = args.group;
60
+ if (args.max_restart !== undefined)
61
+ body.max_restart = args.max_restart;
62
+ if (args.max_relocate !== undefined)
63
+ body.max_relocate = args.max_relocate;
64
+ if (args.comment)
65
+ body.comment = args.comment;
66
+ await ctx.client.post(paths.haResources(), body);
67
+ return jsonResult(`HA resource ${args.sid} added.`, { sid: args.sid });
68
+ }));
69
+ server.registerTool("remove_ha_resource", {
70
+ title: "Remove HA resource",
71
+ description: "Stop HA management of a VM or container.",
72
+ inputSchema: z
73
+ .object({
74
+ sid: z.string().min(1),
75
+ approval_token: z.string().optional(),
76
+ })
77
+ .strict(),
78
+ annotations: {
79
+ readOnlyHint: false,
80
+ destructiveHint: true,
81
+ idempotentHint: false,
82
+ openWorldHint: true,
83
+ },
84
+ }, async ({ sid, approval_token }) => runTool(ctx, "remove_ha_resource", { sid, approval_token }, async () => {
85
+ await ctx.client.delete(paths.haResource(sid));
86
+ return jsonResult(`HA resource ${sid} removed.`, { sid });
87
+ }));
88
+ server.registerTool("migrate_ha_resource", {
89
+ title: "Migrate HA resource",
90
+ description: "Trigger a live HA-managed migration of a resource to another node.",
91
+ inputSchema: z
92
+ .object({
93
+ sid: z.string().min(1),
94
+ target: z.string().min(1).describe("Target node"),
95
+ force: z.boolean().optional(),
96
+ })
97
+ .strict(),
98
+ annotations: {
99
+ readOnlyHint: false,
100
+ destructiveHint: false,
101
+ idempotentHint: false,
102
+ openWorldHint: true,
103
+ },
104
+ }, async ({ sid, target, force }) => runTool(ctx, "migrate_ha_resource", { sid, target, force }, async () => {
105
+ const body = { target };
106
+ if (force !== undefined)
107
+ body.force = force ? 1 : 0;
108
+ await ctx.client.post(paths.haResource(sid), body);
109
+ return jsonResult(`HA migration of ${sid} → ${target} started.`, { sid, target });
110
+ }));
111
+ // ---- HA Groups ---------------------------------------------------------
112
+ server.registerTool("list_ha_groups", {
113
+ title: "List HA groups",
114
+ description: "List HA groups with their node membership and failover policy.",
115
+ inputSchema: z.object({}).strict(),
116
+ annotations: {
117
+ readOnlyHint: true,
118
+ destructiveHint: false,
119
+ idempotentHint: true,
120
+ openWorldHint: false,
121
+ },
122
+ }, async () => runTool(ctx, "list_ha_groups", {}, async () => {
123
+ const data = await ctx.client.get(paths.haGroups());
124
+ return jsonResult(`HA groups:`, data);
125
+ }));
126
+ server.registerTool("get_ha_group", {
127
+ title: "Get HA group",
128
+ description: "Get a single HA group configuration.",
129
+ inputSchema: z
130
+ .object({ group: z.string().min(1) })
131
+ .strict(),
132
+ annotations: {
133
+ readOnlyHint: true,
134
+ destructiveHint: false,
135
+ idempotentHint: true,
136
+ openWorldHint: false,
137
+ },
138
+ }, async ({ group }) => runTool(ctx, "get_ha_group", { group }, async () => {
139
+ const data = await ctx.client.get(paths.haGroup(group));
140
+ return jsonResult(`HA group ${group}:`, data);
141
+ }));
142
+ server.registerTool("create_ha_group", {
143
+ title: "Create HA group",
144
+ description: "Create an HA group with a list of preferred nodes and a failover/restart policy.",
145
+ inputSchema: z
146
+ .object({
147
+ group: z.string().min(1).regex(/^[a-zA-Z0-9_\-]+$/).describe("Group name"),
148
+ nodes: z.string().min(1).describe("Comma-separated node list (e.g. 'pve1,pve2,pve3')"),
149
+ nofailback: z.boolean().optional(),
150
+ restricted: z.boolean().optional(),
151
+ comment: z.string().max(1024).optional(),
152
+ approval_token: z.string().optional(),
153
+ })
154
+ .strict(),
155
+ annotations: {
156
+ readOnlyHint: false,
157
+ destructiveHint: true,
158
+ idempotentHint: false,
159
+ openWorldHint: true,
160
+ },
161
+ }, async (args) => runTool(ctx, "create_ha_group", args, async () => {
162
+ const body = { group: args.group, nodes: args.nodes };
163
+ if (args.nofailback !== undefined)
164
+ body.nofailback = args.nofailback ? 1 : 0;
165
+ if (args.restricted !== undefined)
166
+ body.restricted = args.restricted ? 1 : 0;
167
+ if (args.comment)
168
+ body.comment = args.comment;
169
+ await ctx.client.post(paths.haGroups(), body);
170
+ return jsonResult(`HA group ${args.group} created.`, { group: args.group });
171
+ }));
172
+ server.registerTool("update_ha_group", {
173
+ title: "Update HA group",
174
+ description: "Update an HA group (nodes, failback, restricted, comment).",
175
+ inputSchema: z
176
+ .object({
177
+ group: z.string().min(1),
178
+ nodes: z.string().optional(),
179
+ nofailback: z.boolean().optional(),
180
+ restricted: z.boolean().optional(),
181
+ comment: z.string().max(1024).optional(),
182
+ delete: z.array(z.string()).optional().describe("Properties to delete (e.g. ['comment'])"),
183
+ approval_token: z.string().optional(),
184
+ })
185
+ .strict(),
186
+ annotations: {
187
+ readOnlyHint: false,
188
+ destructiveHint: true,
189
+ idempotentHint: true,
190
+ openWorldHint: true,
191
+ },
192
+ }, async (args) => runTool(ctx, "update_ha_group", args, async () => {
193
+ const body = {};
194
+ if (args.nodes)
195
+ body.nodes = args.nodes;
196
+ if (args.nofailback !== undefined)
197
+ body.nofailback = args.nofailback ? 1 : 0;
198
+ if (args.restricted !== undefined)
199
+ body.restricted = args.restricted ? 1 : 0;
200
+ if (args.comment !== undefined)
201
+ body.comment = args.comment;
202
+ if (args.delete)
203
+ body.delete = args.delete.join(",");
204
+ await ctx.client.put(paths.haGroup(args.group), body);
205
+ return jsonResult(`HA group ${args.group} updated.`, { group: args.group });
206
+ }));
207
+ server.registerTool("delete_ha_group", {
208
+ title: "Delete HA group",
209
+ description: "Delete an HA group. Resources assigned to it revert to the default group.",
210
+ inputSchema: z
211
+ .object({
212
+ group: z.string().min(1),
213
+ approval_token: z.string().optional(),
214
+ })
215
+ .strict(),
216
+ annotations: {
217
+ readOnlyHint: false,
218
+ destructiveHint: true,
219
+ idempotentHint: false,
220
+ openWorldHint: true,
221
+ },
222
+ }, async ({ group, approval_token }) => runTool(ctx, "delete_ha_group", { group, approval_token }, async () => {
223
+ await ctx.client.delete(paths.haGroup(group));
224
+ return jsonResult(`HA group ${group} deleted.`, { group });
225
+ }));
226
+ server.registerTool("get_ha_status", {
227
+ title: "Get HA manager status",
228
+ description: "Get the cluster HA manager status, including quorum and currently-active manager node.",
229
+ inputSchema: z.object({}).strict(),
230
+ annotations: {
231
+ readOnlyHint: true,
232
+ destructiveHint: false,
233
+ idempotentHint: true,
234
+ openWorldHint: false,
235
+ },
236
+ }, async () => runTool(ctx, "get_ha_status", {}, async () => {
237
+ const data = await ctx.client.get(paths.haStatus());
238
+ return jsonResult(`HA status:`, data);
239
+ }));
240
+ }
241
+ //# sourceMappingURL=ha.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ha.js","sourceRoot":"","sources":["../../src/tools/ha.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tool helper functions shared across tool files.
3
+ */
4
+ import type { JobRecord } from "../jobs/store.js";
5
+ import type { ToolContext } from "./context.js";
6
+ export interface TrackUpidOpts {
7
+ node: string;
8
+ tool: string;
9
+ args: Record<string, unknown>;
10
+ }
11
+ /**
12
+ * Register a tracked job for a Proxmox UPID returned by a long-running call.
13
+ */
14
+ export declare function trackUpid(ctx: ToolContext, upid: string, opts: TrackUpidOpts): JobRecord;
15
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,SAAS,CAExF"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Register a tracked job for a Proxmox UPID returned by a long-running call.
3
+ */
4
+ export function trackUpid(ctx, upid, opts) {
5
+ return ctx.jobs.create({ ...opts, upid });
6
+ }
7
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/tools/helpers.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAgB,EAAE,IAAY,EAAE,IAAmB;IAC3E,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tool registration entrypoint.
3
+ *
4
+ * Imports every tool group and registers them on the McpServer instance.
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ import type { ToolContext } from "./context.js";
8
+ import "../safety/risk.js";
9
+ export declare function registerAll(server: McpServer, ctx: ToolContext): void;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,mBAAmB,CAAC;AAgC3B,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiCrE"}