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.
- package/.env.example +60 -0
- package/.mcp.json.example +19 -0
- package/LICENSE +21 -0
- package/README.md +72 -0
- package/dist/cli/check-config.d.ts +3 -0
- package/dist/cli/check-config.d.ts.map +1 -0
- package/dist/cli/check-config.js +29 -0
- package/dist/cli/check-config.js.map +1 -0
- package/dist/cli/print-tools.d.ts +4 -0
- package/dist/cli/print-tools.d.ts.map +1 -0
- package/dist/cli/print-tools.js +45 -0
- package/dist/cli/print-tools.js.map +1 -0
- package/dist/config/env.d.ts +183 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +149 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +26 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +42 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +60 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +50 -0
- package/dist/config/types.js.map +1 -0
- package/dist/format/response.d.ts +40 -0
- package/dist/format/response.d.ts.map +1 -0
- package/dist/format/response.js +109 -0
- package/dist/format/response.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/sqlite-store.d.ts +34 -0
- package/dist/jobs/sqlite-store.d.ts.map +1 -0
- package/dist/jobs/sqlite-store.js +282 -0
- package/dist/jobs/sqlite-store.js.map +1 -0
- package/dist/jobs/store.d.ts +66 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +101 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/log.d.ts +24 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +64 -0
- package/dist/log.js.map +1 -0
- package/dist/proxmox/auth.d.ts +30 -0
- package/dist/proxmox/auth.d.ts.map +1 -0
- package/dist/proxmox/auth.js +39 -0
- package/dist/proxmox/auth.js.map +1 -0
- package/dist/proxmox/client.d.ts +28 -0
- package/dist/proxmox/client.d.ts.map +1 -0
- package/dist/proxmox/client.js +192 -0
- package/dist/proxmox/client.js.map +1 -0
- package/dist/proxmox/errors.d.ts +51 -0
- package/dist/proxmox/errors.d.ts.map +1 -0
- package/dist/proxmox/errors.js +80 -0
- package/dist/proxmox/errors.js.map +1 -0
- package/dist/proxmox/paths.d.ts +126 -0
- package/dist/proxmox/paths.d.ts.map +1 -0
- package/dist/proxmox/paths.js +157 -0
- package/dist/proxmox/paths.js.map +1 -0
- package/dist/proxmox/types.d.ts +255 -0
- package/dist/proxmox/types.d.ts.map +1 -0
- package/dist/proxmox/types.js +9 -0
- package/dist/proxmox/types.js.map +1 -0
- package/dist/retry.d.ts +18 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +50 -0
- package/dist/retry.js.map +1 -0
- package/dist/safety/policy.d.ts +23 -0
- package/dist/safety/policy.d.ts.map +1 -0
- package/dist/safety/policy.js +81 -0
- package/dist/safety/policy.js.map +1 -0
- package/dist/safety/risk.d.ts +3 -0
- package/dist/safety/risk.d.ts.map +1 -0
- package/dist/safety/risk.js +234 -0
- package/dist/safety/risk.js.map +1 -0
- package/dist/security/url-guard.d.ts +22 -0
- package/dist/security/url-guard.d.ts.map +1 -0
- package/dist/security/url-guard.js +166 -0
- package/dist/security/url-guard.js.map +1 -0
- package/dist/server.d.ts +24 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +74 -0
- package/dist/server.js.map +1 -0
- package/dist/ssh/client.d.ts +32 -0
- package/dist/ssh/client.d.ts.map +1 -0
- package/dist/ssh/client.js +128 -0
- package/dist/ssh/client.js.map +1 -0
- package/dist/tools/backup-schedule.d.ts +10 -0
- package/dist/tools/backup-schedule.d.ts.map +1 -0
- package/dist/tools/backup-schedule.js +194 -0
- package/dist/tools/backup-schedule.js.map +1 -0
- package/dist/tools/backup.d.ts +7 -0
- package/dist/tools/backup.d.ts.map +1 -0
- package/dist/tools/backup.js +163 -0
- package/dist/tools/backup.js.map +1 -0
- package/dist/tools/cluster.d.ts +7 -0
- package/dist/tools/cluster.d.ts.map +1 -0
- package/dist/tools/cluster.js +20 -0
- package/dist/tools/cluster.js.map +1 -0
- package/dist/tools/container/config.d.ts +7 -0
- package/dist/tools/container/config.d.ts.map +1 -0
- package/dist/tools/container/config.js +97 -0
- package/dist/tools/container/config.js.map +1 -0
- package/dist/tools/container/console.d.ts +7 -0
- package/dist/tools/container/console.d.ts.map +1 -0
- package/dist/tools/container/console.js +65 -0
- package/dist/tools/container/console.js.map +1 -0
- package/dist/tools/container/crud.d.ts +7 -0
- package/dist/tools/container/crud.d.ts.map +1 -0
- package/dist/tools/container/crud.js +362 -0
- package/dist/tools/container/crud.js.map +1 -0
- package/dist/tools/container/diagnostics.d.ts +7 -0
- package/dist/tools/container/diagnostics.d.ts.map +1 -0
- package/dist/tools/container/diagnostics.js +115 -0
- package/dist/tools/container/diagnostics.js.map +1 -0
- package/dist/tools/container/migration.d.ts +7 -0
- package/dist/tools/container/migration.d.ts.map +1 -0
- package/dist/tools/container/migration.js +134 -0
- package/dist/tools/container/migration.js.map +1 -0
- package/dist/tools/context.d.ts +21 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +2 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/ha.d.ts +7 -0
- package/dist/tools/ha.d.ts.map +1 -0
- package/dist/tools/ha.js +241 -0
- package/dist/tools/ha.js.map +1 -0
- package/dist/tools/helpers.d.ts +15 -0
- package/dist/tools/helpers.d.ts.map +1 -0
- package/dist/tools/helpers.js +7 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +66 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/iso.d.ts +7 -0
- package/dist/tools/iso.d.ts.map +1 -0
- package/dist/tools/iso.js +131 -0
- package/dist/tools/iso.js.map +1 -0
- package/dist/tools/jobs.d.ts +11 -0
- package/dist/tools/jobs.d.ts.map +1 -0
- package/dist/tools/jobs.js +173 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/node-admin.d.ts +10 -0
- package/dist/tools/node-admin.d.ts.map +1 -0
- package/dist/tools/node-admin.js +361 -0
- package/dist/tools/node-admin.js.map +1 -0
- package/dist/tools/node-certs.d.ts +7 -0
- package/dist/tools/node-certs.d.ts.map +1 -0
- package/dist/tools/node-certs.js +36 -0
- package/dist/tools/node-certs.js.map +1 -0
- package/dist/tools/node-disks.d.ts +7 -0
- package/dist/tools/node-disks.d.ts.map +1 -0
- package/dist/tools/node-disks.js +100 -0
- package/dist/tools/node-disks.js.map +1 -0
- package/dist/tools/node-network.d.ts +7 -0
- package/dist/tools/node-network.d.ts.map +1 -0
- package/dist/tools/node-network.js +102 -0
- package/dist/tools/node-network.js.map +1 -0
- package/dist/tools/node-services.d.ts +7 -0
- package/dist/tools/node-services.d.ts.map +1 -0
- package/dist/tools/node-services.js +39 -0
- package/dist/tools/node-services.js.map +1 -0
- package/dist/tools/node.d.ts +7 -0
- package/dist/tools/node.d.ts.map +1 -0
- package/dist/tools/node.js +85 -0
- package/dist/tools/node.js.map +1 -0
- package/dist/tools/pools.d.ts +10 -0
- package/dist/tools/pools.d.ts.map +1 -0
- package/dist/tools/pools.js +111 -0
- package/dist/tools/pools.js.map +1 -0
- package/dist/tools/replication.d.ts +7 -0
- package/dist/tools/replication.d.ts.map +1 -0
- package/dist/tools/replication.js +116 -0
- package/dist/tools/replication.js.map +1 -0
- package/dist/tools/sdn.d.ts +7 -0
- package/dist/tools/sdn.d.ts.map +1 -0
- package/dist/tools/sdn.js +358 -0
- package/dist/tools/sdn.js.map +1 -0
- package/dist/tools/snapshot.d.ts +10 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/snapshot.js +115 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/storage-admin.d.ts +9 -0
- package/dist/tools/storage-admin.d.ts.map +1 -0
- package/dist/tools/storage-admin.js +126 -0
- package/dist/tools/storage-admin.js.map +1 -0
- package/dist/tools/storage.d.ts +7 -0
- package/dist/tools/storage.d.ts.map +1 -0
- package/dist/tools/storage.js +20 -0
- package/dist/tools/storage.js.map +1 -0
- package/dist/tools/tasks.d.ts +11 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +85 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/vm/config.d.ts +28 -0
- package/dist/tools/vm/config.d.ts.map +1 -0
- package/dist/tools/vm/config.js +221 -0
- package/dist/tools/vm/config.js.map +1 -0
- package/dist/tools/vm/console.d.ts +9 -0
- package/dist/tools/vm/console.d.ts.map +1 -0
- package/dist/tools/vm/console.js +141 -0
- package/dist/tools/vm/console.js.map +1 -0
- package/dist/tools/vm/crud.d.ts +10 -0
- package/dist/tools/vm/crud.d.ts.map +1 -0
- package/dist/tools/vm/crud.js +333 -0
- package/dist/tools/vm/crud.js.map +1 -0
- package/dist/tools/vm/diagnostics.d.ts +10 -0
- package/dist/tools/vm/diagnostics.d.ts.map +1 -0
- package/dist/tools/vm/diagnostics.js +256 -0
- package/dist/tools/vm/diagnostics.js.map +1 -0
- package/dist/tools/vm/migration.d.ts +7 -0
- package/dist/tools/vm/migration.d.ts.map +1 -0
- package/dist/tools/vm/migration.js +131 -0
- package/dist/tools/vm/migration.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as paths from "../proxmox/paths.js";
|
|
3
|
+
import { runTool, jsonResult } from "../format/response.js";
|
|
4
|
+
export function registerNodeNetworkTools(server, ctx) {
|
|
5
|
+
server.registerTool("list_node_network", {
|
|
6
|
+
title: "List node network interfaces",
|
|
7
|
+
description: "Return all network interfaces (bonds, bridges, VLANs, physical) on a node.",
|
|
8
|
+
inputSchema: z.object({ node: z.string().min(1) }).strict(),
|
|
9
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
10
|
+
}, async ({ node }) => runTool(ctx, "list_node_network", { node }, async () => {
|
|
11
|
+
const data = await ctx.client.get(paths.nodeNetwork(node));
|
|
12
|
+
return jsonResult(`Network interfaces on ${node}:`, data);
|
|
13
|
+
}));
|
|
14
|
+
server.registerTool("create_node_network", {
|
|
15
|
+
title: "Create network interface",
|
|
16
|
+
description: "Create a network interface (bond, bridge, VLAN, or physical). HIGH RISK — wrong config can disconnect the node.",
|
|
17
|
+
inputSchema: z
|
|
18
|
+
.object({
|
|
19
|
+
node: z.string().min(1),
|
|
20
|
+
iface: z.string().min(1).describe("Interface name (e.g. 'vmbr1', 'bond0')"),
|
|
21
|
+
type: z.enum(["bond", "bridge", "vlan", "eth", "alias", "OVSBridge", "OVSBond", "OVSPort", "OVSIntPort"]).default("bridge"),
|
|
22
|
+
address: z.string().optional(),
|
|
23
|
+
netmask: z.string().optional(),
|
|
24
|
+
gateway: z.string().optional(),
|
|
25
|
+
bridge_ports: z.string().optional(),
|
|
26
|
+
bond_mode: z.enum(["balance-rr", "active-backup", "balance-xor", "broadcast", "802.3ad", "balance-tlb", "balance-alb"]).optional(),
|
|
27
|
+
slaves: z.string().optional(),
|
|
28
|
+
autostart: z.boolean().default(true),
|
|
29
|
+
comments: z.string().optional(),
|
|
30
|
+
vlan_id: z.number().int().min(1).max(4094).optional(),
|
|
31
|
+
vlan_raw_device: z.string().optional(),
|
|
32
|
+
approval_token: z.string().optional(),
|
|
33
|
+
})
|
|
34
|
+
.strict(),
|
|
35
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
|
|
36
|
+
}, async (args) => runTool(ctx, "create_node_network", args, async () => {
|
|
37
|
+
const body = { iface: args.iface, type: args.type };
|
|
38
|
+
for (const [k, v] of Object.entries(args)) {
|
|
39
|
+
if (k === "node" || k === "iface" || k === "type" || k === "approval_token" || v === undefined)
|
|
40
|
+
continue;
|
|
41
|
+
body[k] = typeof v === "boolean" ? (v ? 1 : 0) : v;
|
|
42
|
+
}
|
|
43
|
+
await ctx.client.post(paths.nodeNetwork(args.node), body);
|
|
44
|
+
return jsonResult(`Interface ${args.iface} created on ${args.node}.`, { iface: args.iface });
|
|
45
|
+
}));
|
|
46
|
+
server.registerTool("update_node_network", {
|
|
47
|
+
title: "Update network interface",
|
|
48
|
+
description: "Update an existing network interface. HIGH RISK.",
|
|
49
|
+
inputSchema: z
|
|
50
|
+
.object({
|
|
51
|
+
node: z.string().min(1),
|
|
52
|
+
iface: z.string().min(1),
|
|
53
|
+
address: z.string().optional(),
|
|
54
|
+
netmask: z.string().optional(),
|
|
55
|
+
gateway: z.string().optional(),
|
|
56
|
+
bridge_ports: z.string().optional(),
|
|
57
|
+
comments: z.string().optional(),
|
|
58
|
+
autostart: z.boolean().optional(),
|
|
59
|
+
delete: z.array(z.string()).optional(),
|
|
60
|
+
approval_token: z.string().optional(),
|
|
61
|
+
})
|
|
62
|
+
.strict(),
|
|
63
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
|
|
64
|
+
}, async (args) => runTool(ctx, "update_node_network", args, async () => {
|
|
65
|
+
const body = {};
|
|
66
|
+
for (const [k, v] of Object.entries(args)) {
|
|
67
|
+
if (k === "node" || k === "iface" || k === "approval_token" || v === undefined)
|
|
68
|
+
continue;
|
|
69
|
+
if (k === "delete" && Array.isArray(v))
|
|
70
|
+
body.delete = v.join(",");
|
|
71
|
+
else
|
|
72
|
+
body[k] = typeof v === "boolean" ? (v ? 1 : 0) : v;
|
|
73
|
+
}
|
|
74
|
+
await ctx.client.put(paths.nodeIface(args.node, args.iface), body);
|
|
75
|
+
return jsonResult(`Interface ${args.iface} updated on ${args.node}.`, { iface: args.iface });
|
|
76
|
+
}));
|
|
77
|
+
server.registerTool("delete_node_network", {
|
|
78
|
+
title: "Delete network interface",
|
|
79
|
+
description: "Delete a network interface. HIGH RISK — will disconnect any VM/CT using it.",
|
|
80
|
+
inputSchema: z
|
|
81
|
+
.object({
|
|
82
|
+
node: z.string().min(1),
|
|
83
|
+
iface: z.string().min(1),
|
|
84
|
+
approval_token: z.string().optional(),
|
|
85
|
+
})
|
|
86
|
+
.strict(),
|
|
87
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
|
|
88
|
+
}, async ({ node, iface, approval_token }) => runTool(ctx, "delete_node_network", { node, iface, approval_token }, async () => {
|
|
89
|
+
await ctx.client.delete(paths.nodeIface(node, iface));
|
|
90
|
+
return jsonResult(`Interface ${iface} deleted on ${node}.`, { iface });
|
|
91
|
+
}));
|
|
92
|
+
server.registerTool("reload_node_network", {
|
|
93
|
+
title: "Reload node network",
|
|
94
|
+
description: "Apply pending network changes (reloads /etc/network/interfaces). WARNING: may disconnect SSH!",
|
|
95
|
+
inputSchema: z.object({ node: z.string().min(1) }).strict(),
|
|
96
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
97
|
+
}, async ({ node }) => runTool(ctx, "reload_node_network", { node }, async () => {
|
|
98
|
+
await ctx.client.put(paths.nodeNetwork(node), { reload: 1 });
|
|
99
|
+
return jsonResult(`Network reloaded on ${node}.`, { node });
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=node-network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-network.js","sourceRoot":"","sources":["../../src/tools/node-network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node services management (systemd-like).
|
|
3
|
+
*/
|
|
4
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import type { ToolContext } from "./context.js";
|
|
6
|
+
export declare function registerNodeServicesTools(server: McpServer, ctx: ToolContext): void;
|
|
7
|
+
//# sourceMappingURL=node-services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-services.d.ts","sourceRoot":"","sources":["../../src/tools/node-services.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,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAkDnF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as paths from "../proxmox/paths.js";
|
|
3
|
+
import { runTool, jsonResult } from "../format/response.js";
|
|
4
|
+
export function registerNodeServicesTools(server, ctx) {
|
|
5
|
+
server.registerTool("list_node_services", {
|
|
6
|
+
title: "List node services",
|
|
7
|
+
description: "List all systemd services on a node with their state.",
|
|
8
|
+
inputSchema: z.object({ node: z.string().min(1) }).strict(),
|
|
9
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
10
|
+
}, async ({ node }) => runTool(ctx, "list_node_services", { node }, async () => {
|
|
11
|
+
const data = await ctx.client.get(paths.nodeServices(node));
|
|
12
|
+
return jsonResult(`Services on ${node}:`, data);
|
|
13
|
+
}));
|
|
14
|
+
const serviceAction = (name, action, desc) => {
|
|
15
|
+
server.registerTool(name, {
|
|
16
|
+
title: name.replace(/_/g, " "),
|
|
17
|
+
description: desc,
|
|
18
|
+
inputSchema: z
|
|
19
|
+
.object({ node: z.string().min(1), service: z.string().min(1).describe("Service name") })
|
|
20
|
+
.strict(),
|
|
21
|
+
annotations: {
|
|
22
|
+
readOnlyHint: false,
|
|
23
|
+
destructiveHint: false,
|
|
24
|
+
idempotentHint: true,
|
|
25
|
+
openWorldHint: true,
|
|
26
|
+
},
|
|
27
|
+
}, async ({ node, service }) => runTool(ctx, name, { node, service }, async () => {
|
|
28
|
+
await ctx.client.post(paths.nodeService(node, service), { action });
|
|
29
|
+
return jsonResult(`Service ${service} ${action} on ${node}.`, { node, service, action });
|
|
30
|
+
}));
|
|
31
|
+
};
|
|
32
|
+
serviceAction("node_service_start", "start", "Start a systemd service.");
|
|
33
|
+
serviceAction("node_service_stop", "stop", "Stop a systemd service.");
|
|
34
|
+
serviceAction("node_service_restart", "restart", "Restart a systemd service.");
|
|
35
|
+
serviceAction("node_service_reload", "reload", "Reload a systemd service.");
|
|
36
|
+
serviceAction("node_service_enable", "enable", "Enable a systemd service at boot.");
|
|
37
|
+
serviceAction("node_service_disable", "disable", "Disable a systemd service at boot.");
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=node-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-services.js","sourceRoot":"","sources":["../../src/tools/node-services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node-level tools: get_nodes, get_node_status, get_node_syslog, get_node_journal.
|
|
3
|
+
*/
|
|
4
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import type { ToolContext } from "./context.js";
|
|
6
|
+
export declare function registerNodeTools(server: McpServer, ctx: ToolContext): void;
|
|
7
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/tools/node.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,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAyG3E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as paths from "../proxmox/paths.js";
|
|
3
|
+
import { runTool, jsonResult } from "../format/response.js";
|
|
4
|
+
export function registerNodeTools(server, ctx) {
|
|
5
|
+
server.registerTool("get_nodes", {
|
|
6
|
+
title: "List Proxmox nodes",
|
|
7
|
+
description: "List all nodes in the cluster with their status, CPU, memory, uptime, and role.",
|
|
8
|
+
inputSchema: z.object({}).strict(),
|
|
9
|
+
annotations: {
|
|
10
|
+
readOnlyHint: true,
|
|
11
|
+
destructiveHint: false,
|
|
12
|
+
idempotentHint: true,
|
|
13
|
+
openWorldHint: false,
|
|
14
|
+
},
|
|
15
|
+
}, async () => runTool(ctx, "get_nodes", {}, async () => {
|
|
16
|
+
const nodes = await ctx.client.get(paths.nodes());
|
|
17
|
+
const enriched = await Promise.all(nodes.map(async (n) => {
|
|
18
|
+
try {
|
|
19
|
+
const status = await ctx.client.get(paths.nodeStatus(n.node));
|
|
20
|
+
return { ...n, status };
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return n;
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
26
|
+
return jsonResult("Nodes:", enriched);
|
|
27
|
+
}));
|
|
28
|
+
server.registerTool("get_node_status", {
|
|
29
|
+
title: "Get single node status",
|
|
30
|
+
description: "Get detailed status (CPU, memory, uptime, storage) for a single Proxmox node.",
|
|
31
|
+
inputSchema: z
|
|
32
|
+
.object({
|
|
33
|
+
node: z.string().min(1).describe("Node name (e.g. 'pve', 'pve2')"),
|
|
34
|
+
})
|
|
35
|
+
.strict(),
|
|
36
|
+
annotations: {
|
|
37
|
+
readOnlyHint: true,
|
|
38
|
+
destructiveHint: false,
|
|
39
|
+
idempotentHint: true,
|
|
40
|
+
openWorldHint: false,
|
|
41
|
+
},
|
|
42
|
+
}, async ({ node }) => runTool(ctx, "get_node_status", { node }, async () => {
|
|
43
|
+
const data = await ctx.client.get(paths.nodeStatus(node));
|
|
44
|
+
return jsonResult(`Node ${node} status:`, data);
|
|
45
|
+
}));
|
|
46
|
+
server.registerTool("get_node_syslog", {
|
|
47
|
+
title: "Get node syslog",
|
|
48
|
+
description: "Read recent syslog lines from a Proxmox node.",
|
|
49
|
+
inputSchema: z
|
|
50
|
+
.object({
|
|
51
|
+
node: z.string().min(1).describe("Node name"),
|
|
52
|
+
limit: z.number().int().min(1).max(5000).optional().describe("Number of lines to return (default 50)"),
|
|
53
|
+
})
|
|
54
|
+
.strict(),
|
|
55
|
+
annotations: {
|
|
56
|
+
readOnlyHint: true,
|
|
57
|
+
destructiveHint: false,
|
|
58
|
+
idempotentHint: true,
|
|
59
|
+
openWorldHint: false,
|
|
60
|
+
},
|
|
61
|
+
}, async ({ node, limit }) => runTool(ctx, "get_node_syslog", { node, limit }, async () => {
|
|
62
|
+
const data = await ctx.client.get(paths.nodeSyslog(node, limit ?? 50));
|
|
63
|
+
return jsonResult(`Syslog from ${node}:`, data);
|
|
64
|
+
}));
|
|
65
|
+
server.registerTool("get_node_journal", {
|
|
66
|
+
title: "Get node systemd journal",
|
|
67
|
+
description: "Read recent systemd journal entries from a Proxmox node.",
|
|
68
|
+
inputSchema: z
|
|
69
|
+
.object({
|
|
70
|
+
node: z.string().min(1).describe("Node name"),
|
|
71
|
+
limit: z.number().int().min(1).max(5000).optional().describe("Number of lines to return (default 50)"),
|
|
72
|
+
})
|
|
73
|
+
.strict(),
|
|
74
|
+
annotations: {
|
|
75
|
+
readOnlyHint: true,
|
|
76
|
+
destructiveHint: false,
|
|
77
|
+
idempotentHint: true,
|
|
78
|
+
openWorldHint: false,
|
|
79
|
+
},
|
|
80
|
+
}, async ({ node, limit }) => runTool(ctx, "get_node_journal", { node, limit }, async () => {
|
|
81
|
+
const data = await ctx.client.get(paths.nodeJournal(node, limit ?? 50));
|
|
82
|
+
return jsonResult(`Journal from ${node}:`, data);
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/tools/node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Pool tools: list, get, create, update, delete.
|
|
3
|
+
*
|
|
4
|
+
* Pools let you group VMs and CTs for access control (pools.Audit,
|
|
5
|
+
* pools.Modify, pools.Operator) and bulk operations.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
import type { ToolContext } from "./context.js";
|
|
9
|
+
export declare function registerPoolTools(server: McpServer, ctx: ToolContext): void;
|
|
10
|
+
//# sourceMappingURL=pools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pools.d.ts","sourceRoot":"","sources":["../../src/tools/pools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiI3E"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as paths from "../proxmox/paths.js";
|
|
3
|
+
import { runTool, jsonResult } from "../format/response.js";
|
|
4
|
+
export function registerPoolTools(server, ctx) {
|
|
5
|
+
server.registerTool("list_pools", {
|
|
6
|
+
title: "List resource pools",
|
|
7
|
+
description: "List all resource pools cluster-wide with member counts.",
|
|
8
|
+
inputSchema: z.object({}).strict(),
|
|
9
|
+
annotations: {
|
|
10
|
+
readOnlyHint: true,
|
|
11
|
+
destructiveHint: false,
|
|
12
|
+
idempotentHint: true,
|
|
13
|
+
openWorldHint: false,
|
|
14
|
+
},
|
|
15
|
+
}, async () => runTool(ctx, "list_pools", {}, async () => {
|
|
16
|
+
const data = await ctx.client.get(paths.pools());
|
|
17
|
+
return jsonResult(`Pools (${Array.isArray(data) ? data.length : "?"}):`, data);
|
|
18
|
+
}));
|
|
19
|
+
server.registerTool("get_pool", {
|
|
20
|
+
title: "Get resource pool",
|
|
21
|
+
description: "Get a single resource pool with its members.",
|
|
22
|
+
inputSchema: z
|
|
23
|
+
.object({ poolid: z.string().min(1).describe("Pool ID") })
|
|
24
|
+
.strict(),
|
|
25
|
+
annotations: {
|
|
26
|
+
readOnlyHint: true,
|
|
27
|
+
destructiveHint: false,
|
|
28
|
+
idempotentHint: true,
|
|
29
|
+
openWorldHint: false,
|
|
30
|
+
},
|
|
31
|
+
}, async ({ poolid }) => runTool(ctx, "get_pool", { poolid }, async () => {
|
|
32
|
+
const data = await ctx.client.get(paths.pool(poolid));
|
|
33
|
+
return jsonResult(`Pool ${poolid}:`, data);
|
|
34
|
+
}));
|
|
35
|
+
server.registerTool("create_pool", {
|
|
36
|
+
title: "Create resource pool",
|
|
37
|
+
description: "Create a new resource pool. Optionally assign VMs/CTs at creation time.",
|
|
38
|
+
inputSchema: z
|
|
39
|
+
.object({
|
|
40
|
+
poolid: z.string().min(1).regex(/^[a-zA-Z0-9_\-]+$/).describe("Pool ID"),
|
|
41
|
+
comment: z.string().max(1024).optional(),
|
|
42
|
+
storage: z.array(z.string()).optional().describe("Restrict pool to these storages"),
|
|
43
|
+
vms: z.array(z.union([z.string(), z.number()])).optional().describe("Initial VM/CT IDs"),
|
|
44
|
+
})
|
|
45
|
+
.strict(),
|
|
46
|
+
annotations: {
|
|
47
|
+
readOnlyHint: false,
|
|
48
|
+
destructiveHint: false,
|
|
49
|
+
idempotentHint: false,
|
|
50
|
+
openWorldHint: true,
|
|
51
|
+
},
|
|
52
|
+
}, async (args) => runTool(ctx, "create_pool", args, async () => {
|
|
53
|
+
const body = { poolid: args.poolid };
|
|
54
|
+
if (args.comment)
|
|
55
|
+
body.comment = args.comment;
|
|
56
|
+
if (args.storage)
|
|
57
|
+
body.storage = args.storage.join(",");
|
|
58
|
+
if (args.vms)
|
|
59
|
+
body.vms = args.vms.join(",");
|
|
60
|
+
await ctx.client.post(paths.pools(), body);
|
|
61
|
+
return jsonResult(`Pool ${args.poolid} created.`, { poolid: args.poolid });
|
|
62
|
+
}));
|
|
63
|
+
server.registerTool("update_pool", {
|
|
64
|
+
title: "Update resource pool",
|
|
65
|
+
description: "Update an existing resource pool (comment, allowed storages, VM/CT membership).",
|
|
66
|
+
inputSchema: z
|
|
67
|
+
.object({
|
|
68
|
+
poolid: z.string().min(1),
|
|
69
|
+
comment: z.string().max(1024).optional(),
|
|
70
|
+
storage: z.array(z.string()).optional().describe("Allowed storages (replaces existing list)"),
|
|
71
|
+
vms: z.array(z.union([z.string(), z.number()])).optional().describe("VM/CT IDs to assign"),
|
|
72
|
+
})
|
|
73
|
+
.strict(),
|
|
74
|
+
annotations: {
|
|
75
|
+
readOnlyHint: false,
|
|
76
|
+
destructiveHint: false,
|
|
77
|
+
idempotentHint: true,
|
|
78
|
+
openWorldHint: true,
|
|
79
|
+
},
|
|
80
|
+
}, async (args) => runTool(ctx, "update_pool", args, async () => {
|
|
81
|
+
const body = {};
|
|
82
|
+
if (args.comment !== undefined)
|
|
83
|
+
body.comment = args.comment;
|
|
84
|
+
if (args.storage)
|
|
85
|
+
body.storage = args.storage.join(",");
|
|
86
|
+
if (args.vms)
|
|
87
|
+
body.vms = args.vms.join(",");
|
|
88
|
+
await ctx.client.put(paths.pool(args.poolid), body);
|
|
89
|
+
return jsonResult(`Pool ${args.poolid} updated.`, { poolid: args.poolid });
|
|
90
|
+
}));
|
|
91
|
+
server.registerTool("delete_pool", {
|
|
92
|
+
title: "Delete resource pool",
|
|
93
|
+
description: "Permanently delete a resource pool. Members are NOT deleted; they remain orphaned.",
|
|
94
|
+
inputSchema: z
|
|
95
|
+
.object({
|
|
96
|
+
poolid: z.string().min(1),
|
|
97
|
+
approval_token: z.string().optional().describe("Approval token for destructive operation"),
|
|
98
|
+
})
|
|
99
|
+
.strict(),
|
|
100
|
+
annotations: {
|
|
101
|
+
readOnlyHint: false,
|
|
102
|
+
destructiveHint: true,
|
|
103
|
+
idempotentHint: false,
|
|
104
|
+
openWorldHint: true,
|
|
105
|
+
},
|
|
106
|
+
}, async ({ poolid, approval_token }) => runTool(ctx, "delete_pool", { poolid, approval_token }, async () => {
|
|
107
|
+
await ctx.client.delete(paths.pool(poolid));
|
|
108
|
+
return jsonResult(`Pool ${poolid} deleted.`, { poolid });
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=pools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pools.js","sourceRoot":"","sources":["../../src/tools/pools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cluster Replication tools (ZFS replication jobs).
|
|
3
|
+
*/
|
|
4
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import type { ToolContext } from "./context.js";
|
|
6
|
+
export declare function registerReplicationTools(server: McpServer, ctx: ToolContext): void;
|
|
7
|
+
//# sourceMappingURL=replication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replication.d.ts","sourceRoot":"","sources":["../../src/tools/replication.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,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAkJlF"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as paths from "../proxmox/paths.js";
|
|
3
|
+
import { runTool, jsonResult } from "../format/response.js";
|
|
4
|
+
export function registerReplicationTools(server, ctx) {
|
|
5
|
+
server.registerTool("list_replication_jobs", {
|
|
6
|
+
title: "List replication jobs",
|
|
7
|
+
description: "List all ZFS replication jobs cluster-wide.",
|
|
8
|
+
inputSchema: z.object({}).strict(),
|
|
9
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
10
|
+
}, async () => runTool(ctx, "list_replication_jobs", {}, async () => {
|
|
11
|
+
const data = await ctx.client.get(paths.replication());
|
|
12
|
+
return jsonResult(`Replication jobs:`, data);
|
|
13
|
+
}));
|
|
14
|
+
server.registerTool("list_node_replication", {
|
|
15
|
+
title: "List replication jobs for a node",
|
|
16
|
+
description: "List replication jobs where a specific node is the source.",
|
|
17
|
+
inputSchema: z.object({ node: z.string().min(1) }).strict(),
|
|
18
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
19
|
+
}, async ({ node }) => runTool(ctx, "list_node_replication", { node }, async () => {
|
|
20
|
+
const data = await ctx.client.get(paths.nodeReplication(node));
|
|
21
|
+
return jsonResult(`Replication jobs on ${node}:`, data);
|
|
22
|
+
}));
|
|
23
|
+
server.registerTool("get_replication_job", {
|
|
24
|
+
title: "Get replication job",
|
|
25
|
+
description: "Get a single replication job by its ID.",
|
|
26
|
+
inputSchema: z.object({ id: z.string().min(1) }).strict(),
|
|
27
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
28
|
+
}, async ({ id }) => runTool(ctx, "get_replication_job", { id }, async () => {
|
|
29
|
+
const data = await ctx.client.get(paths.replicationJob(id));
|
|
30
|
+
return jsonResult(`Replication ${id}:`, data);
|
|
31
|
+
}));
|
|
32
|
+
server.registerTool("get_replication_status", {
|
|
33
|
+
title: "Get replication job status",
|
|
34
|
+
description: "Get the current replication status (last sync time, duration, errors).",
|
|
35
|
+
inputSchema: z.object({ id: z.string().min(1) }).strict(),
|
|
36
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
37
|
+
}, async ({ id }) => runTool(ctx, "get_replication_status", { id }, async () => {
|
|
38
|
+
const data = await ctx.client.get(paths.replicationStatus(id));
|
|
39
|
+
return jsonResult(`Replication ${id} status:`, data);
|
|
40
|
+
}));
|
|
41
|
+
server.registerTool("create_replication_job", {
|
|
42
|
+
title: "Create replication job",
|
|
43
|
+
description: "Create a ZFS replication job for a VM or container. Target must have a matching storage.",
|
|
44
|
+
inputSchema: z
|
|
45
|
+
.object({
|
|
46
|
+
id: z.string().min(1).describe("Replication job ID"),
|
|
47
|
+
target: z.string().min(1).describe("Target node"),
|
|
48
|
+
schedule: z.string().min(1).describe("Replication schedule (e.g. '*/15')"),
|
|
49
|
+
vmid: z.union([z.string(), z.number()]).describe("VM or container ID"),
|
|
50
|
+
rate: z.number().int().min(1).optional().describe("Bandwidth limit in MB/s"),
|
|
51
|
+
comment: z.string().max(1024).optional(),
|
|
52
|
+
disable: z.boolean().optional(),
|
|
53
|
+
type: z.enum(["local", "remote"]).default("local"),
|
|
54
|
+
})
|
|
55
|
+
.strict(),
|
|
56
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
57
|
+
}, async (args) => runTool(ctx, "create_replication_job", args, async () => {
|
|
58
|
+
const body = {
|
|
59
|
+
id: args.id,
|
|
60
|
+
target: args.target,
|
|
61
|
+
schedule: args.schedule,
|
|
62
|
+
vmid: args.vmid,
|
|
63
|
+
type: args.type,
|
|
64
|
+
};
|
|
65
|
+
if (args.rate !== undefined)
|
|
66
|
+
body.rate = args.rate;
|
|
67
|
+
if (args.comment)
|
|
68
|
+
body.comment = args.comment;
|
|
69
|
+
if (args.disable !== undefined)
|
|
70
|
+
body.disable = args.disable ? 1 : 0;
|
|
71
|
+
await ctx.client.post(paths.replication(), body);
|
|
72
|
+
return jsonResult(`Replication job ${args.id} created.`, { id: args.id });
|
|
73
|
+
}));
|
|
74
|
+
server.registerTool("update_replication_job", {
|
|
75
|
+
title: "Update replication job",
|
|
76
|
+
description: "Update an existing replication job (schedule, rate, disable, comment).",
|
|
77
|
+
inputSchema: z
|
|
78
|
+
.object({
|
|
79
|
+
id: z.string().min(1),
|
|
80
|
+
schedule: z.string().optional(),
|
|
81
|
+
rate: z.number().int().optional(),
|
|
82
|
+
comment: z.string().optional(),
|
|
83
|
+
disable: z.boolean().optional(),
|
|
84
|
+
delete: z.array(z.string()).optional(),
|
|
85
|
+
})
|
|
86
|
+
.strict(),
|
|
87
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
88
|
+
}, async (args) => runTool(ctx, "update_replication_job", args, async () => {
|
|
89
|
+
const body = {};
|
|
90
|
+
for (const [k, v] of Object.entries(args)) {
|
|
91
|
+
if (k === "id" || k === "approval_token" || v === undefined)
|
|
92
|
+
continue;
|
|
93
|
+
if (k === "delete" && Array.isArray(v))
|
|
94
|
+
body.delete = v.join(",");
|
|
95
|
+
else
|
|
96
|
+
body[k] = typeof v === "boolean" ? (v ? 1 : 0) : v;
|
|
97
|
+
}
|
|
98
|
+
await ctx.client.put(paths.replicationJob(args.id), body);
|
|
99
|
+
return jsonResult(`Replication ${args.id} updated.`, { id: args.id });
|
|
100
|
+
}));
|
|
101
|
+
server.registerTool("delete_replication_job", {
|
|
102
|
+
title: "Delete replication job",
|
|
103
|
+
description: "Delete a replication job. Existing replicated snapshots are kept unless explicitly pruned.",
|
|
104
|
+
inputSchema: z
|
|
105
|
+
.object({ id: z.string().min(1), force: z.boolean().optional() })
|
|
106
|
+
.strict(),
|
|
107
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
|
|
108
|
+
}, async ({ id, force }) => runTool(ctx, "delete_replication_job", { id, force }, async () => {
|
|
109
|
+
const params = {};
|
|
110
|
+
if (force)
|
|
111
|
+
params.force = 1;
|
|
112
|
+
await ctx.client.delete(paths.replicationJob(id), params);
|
|
113
|
+
return jsonResult(`Replication ${id} deleted.`, { id });
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=replication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replication.js","sourceRoot":"","sources":["../../src/tools/replication.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Software-Defined Networking tools (controllers, zones, vnets, subnets).
|
|
3
|
+
*/
|
|
4
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import type { ToolContext } from "./context.js";
|
|
6
|
+
export declare function registerSdnTools(server: McpServer, ctx: ToolContext): void;
|
|
7
|
+
//# sourceMappingURL=sdn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdn.d.ts","sourceRoot":"","sources":["../../src/tools/sdn.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,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA6c1E"}
|