@soyrageagency/proxmox-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +792 -0
- package/dist/assets.d.ts +18 -0
- package/dist/assets.js +53 -0
- package/dist/assets.js.map +1 -0
- package/dist/branding.d.ts +28 -0
- package/dist/branding.js +58 -0
- package/dist/branding.js.map +1 -0
- package/dist/config.d.ts +70 -0
- package/dist/config.js +119 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +23 -0
- package/dist/logger.js +65 -0
- package/dist/logger.js.map +1 -0
- package/dist/plugins.d.ts +32 -0
- package/dist/plugins.js +149 -0
- package/dist/plugins.js.map +1 -0
- package/dist/proxmox/client.d.ts +153 -0
- package/dist/proxmox/client.js +620 -0
- package/dist/proxmox/client.js.map +1 -0
- package/dist/resilience/backup-verifier.d.ts +28 -0
- package/dist/resilience/backup-verifier.js +222 -0
- package/dist/resilience/backup-verifier.js.map +1 -0
- package/dist/resilience/dr-drill.d.ts +17 -0
- package/dist/resilience/dr-drill.js +138 -0
- package/dist/resilience/dr-drill.js.map +1 -0
- package/dist/resilience/engine.d.ts +68 -0
- package/dist/resilience/engine.js +151 -0
- package/dist/resilience/engine.js.map +1 -0
- package/dist/resilience/patch-orchestrator.d.ts +31 -0
- package/dist/resilience/patch-orchestrator.js +188 -0
- package/dist/resilience/patch-orchestrator.js.map +1 -0
- package/dist/resilience/report.d.ts +33 -0
- package/dist/resilience/report.js +264 -0
- package/dist/resilience/report.js.map +1 -0
- package/dist/resilience/runbook.d.ts +42 -0
- package/dist/resilience/runbook.js +165 -0
- package/dist/resilience/runbook.js.map +1 -0
- package/dist/resilience/signing.d.ts +43 -0
- package/dist/resilience/signing.js +107 -0
- package/dist/resilience/signing.js.map +1 -0
- package/dist/resilience/types.d.ts +150 -0
- package/dist/resilience/types.js +14 -0
- package/dist/resilience/types.js.map +1 -0
- package/dist/resilience/util.d.ts +16 -0
- package/dist/resilience/util.js +32 -0
- package/dist/resilience/util.js.map +1 -0
- package/dist/tools/about.d.ts +14 -0
- package/dist/tools/about.js +54 -0
- package/dist/tools/about.js.map +1 -0
- package/dist/tools/backups.d.ts +15 -0
- package/dist/tools/backups.js +91 -0
- package/dist/tools/backups.js.map +1 -0
- package/dist/tools/cluster.d.ts +12 -0
- package/dist/tools/cluster.js +48 -0
- package/dist/tools/cluster.js.map +1 -0
- package/dist/tools/context.d.ts +30 -0
- package/dist/tools/context.js +12 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/guests.d.ts +15 -0
- package/dist/tools/guests.js +96 -0
- package/dist/tools/guests.js.map +1 -0
- package/dist/tools/lifecycle.d.ts +16 -0
- package/dist/tools/lifecycle.js +93 -0
- package/dist/tools/lifecycle.js.map +1 -0
- package/dist/tools/management.d.ts +17 -0
- package/dist/tools/management.js +135 -0
- package/dist/tools/management.js.map +1 -0
- package/dist/tools/nodes.d.ts +12 -0
- package/dist/tools/nodes.js +44 -0
- package/dist/tools/nodes.js.map +1 -0
- package/dist/tools/provisioning.d.ts +16 -0
- package/dist/tools/provisioning.js +122 -0
- package/dist/tools/provisioning.js.map +1 -0
- package/dist/tools/resilience.d.ts +21 -0
- package/dist/tools/resilience.js +116 -0
- package/dist/tools/resilience.js.map +1 -0
- package/dist/tools/snapshots.d.ts +17 -0
- package/dist/tools/snapshots.js +89 -0
- package/dist/tools/snapshots.js.map +1 -0
- package/dist/tools/storage.d.ts +11 -0
- package/dist/tools/storage.js +39 -0
- package/dist/tools/storage.js.map +1 -0
- package/dist/tools/tasks.d.ts +11 -0
- package/dist/tools/tasks.js +43 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tui/ansi.d.ts +63 -0
- package/dist/tui/ansi.js +115 -0
- package/dist/tui/ansi.js.map +1 -0
- package/dist/tui/app.d.ts +109 -0
- package/dist/tui/app.js +904 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/box.d.ts +18 -0
- package/dist/tui/box.js +38 -0
- package/dist/tui/box.js.map +1 -0
- package/dist/tui/index.d.ts +20 -0
- package/dist/tui/index.js +65 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/update/channel.d.ts +69 -0
- package/dist/update/channel.js +165 -0
- package/dist/update/channel.js.map +1 -0
- package/dist/update/notice.d.ts +11 -0
- package/dist/update/notice.js +27 -0
- package/dist/update/notice.js.map +1 -0
- package/dist/utils/format.d.ts +21 -0
- package/dist/utils/format.js +63 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/result.d.ts +25 -0
- package/dist/utils/result.js +26 -0
- package/dist/utils/result.js.map +1 -0
- package/package.json +87 -0
- package/scripts/install.mjs +301 -0
package/dist/plugins.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin registry & loader.
|
|
3
|
+
*
|
|
4
|
+
* The server is built as a set of independent *plugins*, each owning one
|
|
5
|
+
* capability group. Which plugins load is fully driven by configuration.
|
|
6
|
+
*
|
|
7
|
+
* The `about` plugin is NON-DISABLEABLE: it carries the SoyRage Agency identity
|
|
8
|
+
* and attribution, which the license requires to stay present.
|
|
9
|
+
*
|
|
10
|
+
* Part of Proxmox MCP Server.
|
|
11
|
+
* Crafted by SoyRage Agency — https://soyrage.es/
|
|
12
|
+
* MIT licensed (see LICENSE).
|
|
13
|
+
*/
|
|
14
|
+
import { registerAboutTool } from "./tools/about.js";
|
|
15
|
+
import { registerNodeTools } from "./tools/nodes.js";
|
|
16
|
+
import { registerGuestTools } from "./tools/guests.js";
|
|
17
|
+
import { registerClusterTools } from "./tools/cluster.js";
|
|
18
|
+
import { registerStorageTools } from "./tools/storage.js";
|
|
19
|
+
import { registerTaskTools } from "./tools/tasks.js";
|
|
20
|
+
import { registerSnapshotTools } from "./tools/snapshots.js";
|
|
21
|
+
import { registerLifecycleTools } from "./tools/lifecycle.js";
|
|
22
|
+
import { registerManagementTools } from "./tools/management.js";
|
|
23
|
+
import { registerBackupTools } from "./tools/backups.js";
|
|
24
|
+
import { registerProvisioningTools } from "./tools/provisioning.js";
|
|
25
|
+
import { registerResilienceTools } from "./tools/resilience.js";
|
|
26
|
+
/** The built-in plugin catalogue. */
|
|
27
|
+
export const BUILTIN_PLUGINS = Object.freeze([
|
|
28
|
+
{
|
|
29
|
+
name: "about",
|
|
30
|
+
title: "Identity & credits",
|
|
31
|
+
description: "SoyRage Agency welcome banner, credits and license.",
|
|
32
|
+
category: "identity",
|
|
33
|
+
mutating: false,
|
|
34
|
+
locked: true,
|
|
35
|
+
register: registerAboutTool,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "nodes",
|
|
39
|
+
title: "Cluster nodes",
|
|
40
|
+
description: "List nodes and read detailed node status.",
|
|
41
|
+
category: "nodes",
|
|
42
|
+
mutating: false,
|
|
43
|
+
register: registerNodeTools,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "guests",
|
|
47
|
+
title: "VMs & containers",
|
|
48
|
+
description: "List guests and read their status and configuration.",
|
|
49
|
+
category: "guests",
|
|
50
|
+
mutating: false,
|
|
51
|
+
register: registerGuestTools,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "storage",
|
|
55
|
+
title: "Storage",
|
|
56
|
+
description: "List storages and their usage on a node.",
|
|
57
|
+
category: "storage",
|
|
58
|
+
mutating: false,
|
|
59
|
+
register: registerStorageTools,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "tasks",
|
|
63
|
+
title: "Tasks",
|
|
64
|
+
description: "Recent task log on a node.",
|
|
65
|
+
category: "tasks",
|
|
66
|
+
mutating: false,
|
|
67
|
+
register: registerTaskTools,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "cluster",
|
|
71
|
+
title: "Cluster",
|
|
72
|
+
description: "Cluster status/quorum and a consolidated resource view.",
|
|
73
|
+
category: "cluster",
|
|
74
|
+
mutating: false,
|
|
75
|
+
register: registerClusterTools,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "snapshots",
|
|
79
|
+
title: "Snapshots",
|
|
80
|
+
description: "List snapshots and (unless read-only) create/rollback/delete.",
|
|
81
|
+
category: "snapshots",
|
|
82
|
+
mutating: true,
|
|
83
|
+
register: registerSnapshotTools,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "lifecycle",
|
|
87
|
+
title: "Guest lifecycle",
|
|
88
|
+
description: "Start, shutdown, stop, reboot, suspend and resume guests.",
|
|
89
|
+
category: "lifecycle",
|
|
90
|
+
mutating: true,
|
|
91
|
+
register: registerLifecycleTools,
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: "management",
|
|
95
|
+
title: "Advanced management",
|
|
96
|
+
description: "Migrate, clone, resize, backup and delete guests.",
|
|
97
|
+
category: "management",
|
|
98
|
+
mutating: true,
|
|
99
|
+
register: registerManagementTools,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "backups",
|
|
103
|
+
title: "Backups (vzdump)",
|
|
104
|
+
description: "List backup archives and (unless read-only) restore them.",
|
|
105
|
+
category: "backups",
|
|
106
|
+
mutating: true,
|
|
107
|
+
register: registerBackupTools,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: "provisioning",
|
|
111
|
+
title: "Provisioning",
|
|
112
|
+
description: "List templates/ISOs and (unless read-only) create VMs and containers.",
|
|
113
|
+
category: "provisioning",
|
|
114
|
+
mutating: true,
|
|
115
|
+
register: registerProvisioningTools,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "resilience",
|
|
119
|
+
title: "Resilience & Compliance",
|
|
120
|
+
description: "Automated backup verification (restore-testing), patch orchestration with " +
|
|
121
|
+
"automatic rollback, and scheduled DR drills — each producing signed, dated " +
|
|
122
|
+
"ISO 27001 / NIS2 / DORA evidence reports.",
|
|
123
|
+
category: "resilience",
|
|
124
|
+
mutating: true,
|
|
125
|
+
register: registerResilienceTools,
|
|
126
|
+
},
|
|
127
|
+
]);
|
|
128
|
+
/** Resolve which plugins should load, applying the enable/disable selection. */
|
|
129
|
+
export function selectPlugins(config, logger, catalogue = BUILTIN_PLUGINS) {
|
|
130
|
+
const enabledSet = new Set(config.plugins.enabled);
|
|
131
|
+
const disabledSet = new Set(config.plugins.disabled);
|
|
132
|
+
const selected = catalogue.filter((plugin) => {
|
|
133
|
+
if (plugin.locked)
|
|
134
|
+
return true;
|
|
135
|
+
if (enabledSet.size > 0 && !enabledSet.has(plugin.name))
|
|
136
|
+
return false;
|
|
137
|
+
if (disabledSet.has(plugin.name))
|
|
138
|
+
return false;
|
|
139
|
+
return true;
|
|
140
|
+
});
|
|
141
|
+
for (const name of disabledSet) {
|
|
142
|
+
if (catalogue.find((p) => p.name === name)?.locked) {
|
|
143
|
+
logger.warn(`Plugin "${name}" cannot be disabled (identity/attribution) and will still load.`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
logger.info(`Plugins enabled: ${selected.map((p) => p.name).join(", ") || "(none)"}`);
|
|
147
|
+
return selected;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxmox VE API client.
|
|
3
|
+
*
|
|
4
|
+
* A small, typed wrapper around the Proxmox VE REST API (`/api2/json`). It
|
|
5
|
+
* supports both API-token auth (recommended) and username/password ticket
|
|
6
|
+
* auth, controls TLS verification (Proxmox ships self-signed certs), applies
|
|
7
|
+
* the optional guest allowlist and exposes the helpers the tools build on.
|
|
8
|
+
*
|
|
9
|
+
* Part of Proxmox MCP Server.
|
|
10
|
+
* Crafted by SoyRage Agency — https://soyrage.es/
|
|
11
|
+
* MIT licensed (see LICENSE).
|
|
12
|
+
*/
|
|
13
|
+
import type { AppConfig } from "../config.js";
|
|
14
|
+
import type { Logger } from "../logger.js";
|
|
15
|
+
/** A guest (QEMU VM or LXC container) as seen in cluster resources. */
|
|
16
|
+
export interface Guest {
|
|
17
|
+
type: "qemu" | "lxc";
|
|
18
|
+
vmid: number;
|
|
19
|
+
name: string;
|
|
20
|
+
node: string;
|
|
21
|
+
status: string;
|
|
22
|
+
cpu: number;
|
|
23
|
+
maxcpu: number;
|
|
24
|
+
mem: number;
|
|
25
|
+
maxmem: number;
|
|
26
|
+
disk: number;
|
|
27
|
+
maxdisk: number;
|
|
28
|
+
uptime: number;
|
|
29
|
+
template: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** A cluster node summary. */
|
|
32
|
+
export interface NodeSummary {
|
|
33
|
+
node: string;
|
|
34
|
+
status: string;
|
|
35
|
+
cpu: number;
|
|
36
|
+
maxcpu: number;
|
|
37
|
+
mem: number;
|
|
38
|
+
maxmem: number;
|
|
39
|
+
uptime: number;
|
|
40
|
+
}
|
|
41
|
+
/** Raised when a guest is excluded by the allowlist. */
|
|
42
|
+
export declare class GuestNotAllowedError extends Error {
|
|
43
|
+
constructor(ref: string);
|
|
44
|
+
}
|
|
45
|
+
/** Raised when a referenced guest does not exist. */
|
|
46
|
+
export declare class GuestNotFoundError extends Error {
|
|
47
|
+
constructor(ref: string);
|
|
48
|
+
}
|
|
49
|
+
interface RawResource {
|
|
50
|
+
type: string;
|
|
51
|
+
vmid?: number;
|
|
52
|
+
name?: string;
|
|
53
|
+
node?: string;
|
|
54
|
+
status?: string;
|
|
55
|
+
cpu?: number;
|
|
56
|
+
maxcpu?: number;
|
|
57
|
+
mem?: number;
|
|
58
|
+
maxmem?: number;
|
|
59
|
+
disk?: number;
|
|
60
|
+
maxdisk?: number;
|
|
61
|
+
uptime?: number;
|
|
62
|
+
template?: number;
|
|
63
|
+
}
|
|
64
|
+
/** Application-facing Proxmox client. One instance is shared across tools. */
|
|
65
|
+
export declare class ProxmoxClient {
|
|
66
|
+
private readonly config;
|
|
67
|
+
private readonly log;
|
|
68
|
+
private readonly agent;
|
|
69
|
+
private readonly allowlist;
|
|
70
|
+
private readonly demo;
|
|
71
|
+
private ticket;
|
|
72
|
+
constructor(config: AppConfig, logger: Logger);
|
|
73
|
+
/** Whether the client is serving fabricated demo data. */
|
|
74
|
+
get isDemo(): boolean;
|
|
75
|
+
/** True when using username/password ticket auth (vs. an API token). */
|
|
76
|
+
private get usingTicket();
|
|
77
|
+
/** Verify connectivity/credentials by hitting /version. */
|
|
78
|
+
ping(): Promise<void>;
|
|
79
|
+
private authHeaders;
|
|
80
|
+
/** Acquire a login ticket (username/password auth). */
|
|
81
|
+
private login;
|
|
82
|
+
private fetch;
|
|
83
|
+
/** Perform an authenticated request and return the `data` payload. */
|
|
84
|
+
private request;
|
|
85
|
+
/** GET helper. */
|
|
86
|
+
get<T>(path: string): Promise<T>;
|
|
87
|
+
/** POST helper (form-encoded params). */
|
|
88
|
+
post<T = unknown>(path: string, params?: Record<string, string | number>): Promise<T>;
|
|
89
|
+
/** DELETE helper. */
|
|
90
|
+
del<T = unknown>(path: string): Promise<T>;
|
|
91
|
+
/** Proxmox version info. */
|
|
92
|
+
version(): Promise<Record<string, unknown>>;
|
|
93
|
+
/** Detailed status of a single node. */
|
|
94
|
+
nodeStatus(node: string): Promise<Record<string, unknown>>;
|
|
95
|
+
/** All cluster nodes with load summary. */
|
|
96
|
+
nodes(): Promise<NodeSummary[]>;
|
|
97
|
+
/** Raw cluster resources (optionally filtered by type). */
|
|
98
|
+
clusterResources(type?: string): Promise<RawResource[]>;
|
|
99
|
+
/** Cluster status (quorum, members). */
|
|
100
|
+
clusterStatus(): Promise<Array<Record<string, unknown>>>;
|
|
101
|
+
/** All guests (QEMU + LXC), honouring the allowlist. */
|
|
102
|
+
guests(): Promise<Guest[]>;
|
|
103
|
+
/** Whether a guest is permitted by the allowlist (by VMID or name). */
|
|
104
|
+
isAllowed(guest: Guest): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Resolve a reference (VMID or name) to a guest, enforcing the allowlist.
|
|
107
|
+
* Returns the guest including its node — required for every guest API call.
|
|
108
|
+
*/
|
|
109
|
+
resolveGuest(reference: string): Promise<Guest>;
|
|
110
|
+
/** Internal: guests without allowlist filtering (for resolution/errors). */
|
|
111
|
+
private guestsUnfiltered;
|
|
112
|
+
/** Base API path for a guest, e.g. /nodes/pve/qemu/100. */
|
|
113
|
+
guestBase(guest: Guest): string;
|
|
114
|
+
/** Current runtime status of a guest. */
|
|
115
|
+
guestStatus(guest: Guest): Promise<Record<string, unknown>>;
|
|
116
|
+
/** Full configuration of a guest. */
|
|
117
|
+
guestConfig(guest: Guest): Promise<Record<string, unknown>>;
|
|
118
|
+
/** Storage available on a node. */
|
|
119
|
+
storage(node: string): Promise<Array<Record<string, unknown>>>;
|
|
120
|
+
/** Recent tasks on a node. */
|
|
121
|
+
tasks(node: string, limit?: number): Promise<Array<Record<string, unknown>>>;
|
|
122
|
+
/** Snapshots of a guest. */
|
|
123
|
+
snapshots(guest: Guest): Promise<Array<Record<string, unknown>>>;
|
|
124
|
+
/**
|
|
125
|
+
* Operating-system info for a guest: the configured `ostype` plus, for
|
|
126
|
+
* running QEMU VMs with the guest agent, the detected OS and IP addresses.
|
|
127
|
+
*/
|
|
128
|
+
osInfo(guest: Guest): Promise<Record<string, unknown>>;
|
|
129
|
+
/** List the content of a storage (backups, ISOs, templates, disks…). */
|
|
130
|
+
storageContent(node: string, storage: string, content?: string): Promise<Array<Record<string, unknown>>>;
|
|
131
|
+
/** Storages on a node that can hold backups. */
|
|
132
|
+
backupStorages(node: string): Promise<string[]>;
|
|
133
|
+
/** Resolve a node name, defaulting to the first cluster node. */
|
|
134
|
+
resolveNode(node?: string): Promise<string>;
|
|
135
|
+
/** Whether the AI copilot is available (demo always simulates it). */
|
|
136
|
+
get aiEnabled(): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* AI copilot: interpret a natural-language order against the current guests
|
|
139
|
+
* and return a structured intent — either an action to run on a guest, or a
|
|
140
|
+
* plain-language answer. Uses an OpenAI-compatible endpoint when configured;
|
|
141
|
+
* demo mode simulates it with a small rule engine.
|
|
142
|
+
*/
|
|
143
|
+
aiAssist(prompt: string): Promise<AiIntent>;
|
|
144
|
+
}
|
|
145
|
+
/** A structured AI intent returned by aiAssist. */
|
|
146
|
+
export interface AiIntent {
|
|
147
|
+
action: "start" | "shutdown" | "stop" | "reboot" | "snapshot" | "none";
|
|
148
|
+
guest: string;
|
|
149
|
+
answer: string;
|
|
150
|
+
explanation: string;
|
|
151
|
+
source: string;
|
|
152
|
+
}
|
|
153
|
+
export {};
|