@bldg-7/proxmox-mcp 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/LICENSE +21 -0
- package/README.md +1033 -0
- package/dist/client/proxmox.d.ts +14 -0
- package/dist/client/proxmox.d.ts.map +1 -0
- package/dist/client/proxmox.js +82 -0
- package/dist/client/proxmox.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +24 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +31 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +32 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/formatters/index.d.ts +42 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +85 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/index.d.ts +41 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +69 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +2 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +2 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/schemas/backup.d.ts +101 -0
- package/dist/schemas/backup.d.ts.map +1 -0
- package/dist/schemas/backup.js +43 -0
- package/dist/schemas/backup.js.map +1 -0
- package/dist/schemas/disk.d.ts +144 -0
- package/dist/schemas/disk.d.ts.map +1 -0
- package/dist/schemas/disk.js +60 -0
- package/dist/schemas/disk.js.map +1 -0
- package/dist/schemas/index.d.ts +7 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/network.d.ts +140 -0
- package/dist/schemas/network.d.ts.map +1 -0
- package/dist/schemas/network.js +56 -0
- package/dist/schemas/network.js.map +1 -0
- package/dist/schemas/node.d.ts +16 -0
- package/dist/schemas/node.d.ts.map +1 -0
- package/dist/schemas/node.js +12 -0
- package/dist/schemas/node.js.map +1 -0
- package/dist/schemas/snapshot.d.ts +116 -0
- package/dist/schemas/snapshot.d.ts.map +1 -0
- package/dist/schemas/snapshot.js +34 -0
- package/dist/schemas/snapshot.js.map +1 -0
- package/dist/schemas/vm.d.ts +330 -0
- package/dist/schemas/vm.d.ts.map +1 -0
- package/dist/schemas/vm.js +111 -0
- package/dist/schemas/vm.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +142 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/backup.d.ts +35 -0
- package/dist/tools/backup.d.ts.map +1 -0
- package/dist/tools/backup.js +210 -0
- package/dist/tools/backup.js.map +1 -0
- package/dist/tools/cluster.d.ts +15 -0
- package/dist/tools/cluster.d.ts.map +1 -0
- package/dist/tools/cluster.js +82 -0
- package/dist/tools/cluster.js.map +1 -0
- package/dist/tools/command.d.ts +6 -0
- package/dist/tools/command.d.ts.map +1 -0
- package/dist/tools/command.js +26 -0
- package/dist/tools/command.js.map +1 -0
- package/dist/tools/disk.d.ts +45 -0
- package/dist/tools/disk.d.ts.map +1 -0
- package/dist/tools/disk.js +243 -0
- package/dist/tools/disk.js.map +1 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +20 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/network.d.ts +35 -0
- package/dist/tools/network.d.ts.map +1 -0
- package/dist/tools/network.js +270 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/node.d.ts +15 -0
- package/dist/tools/node.d.ts.map +1 -0
- package/dist/tools/node.js +73 -0
- package/dist/tools/node.js.map +1 -0
- package/dist/tools/registry.d.ts +12 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +87 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/snapshot.d.ts +45 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/snapshot.js +249 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/vm-create.d.ts +8 -0
- package/dist/tools/vm-create.d.ts.map +1 -0
- package/dist/tools/vm-create.js +129 -0
- package/dist/tools/vm-create.js.map +1 -0
- package/dist/tools/vm-lifecycle.d.ts +67 -0
- package/dist/tools/vm-lifecycle.d.ts.map +1 -0
- package/dist/tools/vm-lifecycle.js +319 -0
- package/dist/tools/vm-lifecycle.js.map +1 -0
- package/dist/tools/vm-modify.d.ts +25 -0
- package/dist/tools/vm-modify.d.ts.map +1 -0
- package/dist/tools/vm-modify.js +155 -0
- package/dist/tools/vm-modify.js.map +1 -0
- package/dist/tools/vm-query.d.ts +20 -0
- package/dist/tools/vm-query.d.ts.map +1 -0
- package/dist/tools/vm-query.js +166 -0
- package/dist/tools/vm-query.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/proxmox.d.ts +166 -0
- package/dist/types/proxmox.d.ts.map +1 -0
- package/dist/types/proxmox.js +2 -0
- package/dist/types/proxmox.js.map +1 -0
- package/dist/types/tools.d.ts +12 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +64 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validators/index.d.ts +75 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +185 -0
- package/dist/validators/index.js.map +1 -0
- package/package.json +51 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';
|
|
4
|
+
import { toolRegistry } from './tools/registry.js';
|
|
5
|
+
import { TOOL_NAMES } from './types/tools.js';
|
|
6
|
+
const SERVER_VERSION = '0.1.0';
|
|
7
|
+
const TOOL_DESCRIPTIONS = {
|
|
8
|
+
// Node & Cluster
|
|
9
|
+
proxmox_get_nodes: 'List all Proxmox cluster nodes with their status and resources',
|
|
10
|
+
proxmox_get_node_status: 'Get detailed status information for a specific Proxmox node',
|
|
11
|
+
proxmox_get_cluster_status: 'Get overall cluster status including nodes and resource usage',
|
|
12
|
+
proxmox_get_next_vmid: 'Get the next available VM/Container ID number',
|
|
13
|
+
// VM Query
|
|
14
|
+
proxmox_get_vms: 'List all virtual machines across the cluster with their status',
|
|
15
|
+
proxmox_get_vm_status: 'Get detailed status information for a specific VM',
|
|
16
|
+
proxmox_get_storage: 'List all storage pools and their usage across the cluster',
|
|
17
|
+
// VM Lifecycle
|
|
18
|
+
proxmox_start_lxc: 'Start an LXC container (requires elevated permissions)',
|
|
19
|
+
proxmox_start_vm: 'Start a QEMU virtual machine (requires elevated permissions)',
|
|
20
|
+
proxmox_stop_lxc: 'Stop an LXC container (requires elevated permissions)',
|
|
21
|
+
proxmox_stop_vm: 'Stop a QEMU virtual machine (requires elevated permissions)',
|
|
22
|
+
proxmox_delete_lxc: 'Delete an LXC container (requires elevated permissions)',
|
|
23
|
+
proxmox_delete_vm: 'Delete a QEMU virtual machine (requires elevated permissions)',
|
|
24
|
+
proxmox_reboot_lxc: 'Reboot an LXC container (requires elevated permissions)',
|
|
25
|
+
proxmox_reboot_vm: 'Reboot a QEMU virtual machine (requires elevated permissions)',
|
|
26
|
+
proxmox_shutdown_lxc: 'Gracefully shutdown an LXC container (requires elevated permissions)',
|
|
27
|
+
proxmox_shutdown_vm: 'Gracefully shutdown a QEMU virtual machine (requires elevated permissions)',
|
|
28
|
+
proxmox_pause_vm: 'Pause a QEMU virtual machine (requires elevated permissions)',
|
|
29
|
+
proxmox_resume_vm: 'Resume a paused QEMU virtual machine (requires elevated permissions)',
|
|
30
|
+
// VM Modify
|
|
31
|
+
proxmox_clone_lxc: 'Clone an LXC container (requires elevated permissions)',
|
|
32
|
+
proxmox_clone_vm: 'Clone a QEMU virtual machine (requires elevated permissions)',
|
|
33
|
+
proxmox_resize_lxc: 'Resize an LXC container CPU/memory (requires elevated permissions)',
|
|
34
|
+
proxmox_resize_vm: 'Resize a QEMU VM CPU/memory (requires elevated permissions)',
|
|
35
|
+
// Snapshots
|
|
36
|
+
proxmox_create_snapshot_lxc: 'Create a snapshot of an LXC container (requires elevated permissions)',
|
|
37
|
+
proxmox_create_snapshot_vm: 'Create a snapshot of a QEMU virtual machine (requires elevated permissions)',
|
|
38
|
+
proxmox_list_snapshots_lxc: 'List all snapshots of an LXC container (requires elevated permissions)',
|
|
39
|
+
proxmox_list_snapshots_vm: 'List all snapshots of a QEMU virtual machine (requires elevated permissions)',
|
|
40
|
+
proxmox_rollback_snapshot_lxc: 'Rollback an LXC container to a snapshot (requires elevated permissions)',
|
|
41
|
+
proxmox_rollback_snapshot_vm: 'Rollback a QEMU virtual machine to a snapshot (requires elevated permissions)',
|
|
42
|
+
proxmox_delete_snapshot_lxc: 'Delete a snapshot of an LXC container (requires elevated permissions)',
|
|
43
|
+
proxmox_delete_snapshot_vm: 'Delete a snapshot of a QEMU virtual machine (requires elevated permissions)',
|
|
44
|
+
// Backups
|
|
45
|
+
proxmox_create_backup_lxc: 'Create a backup of an LXC container (requires elevated permissions)',
|
|
46
|
+
proxmox_create_backup_vm: 'Create a backup of a QEMU virtual machine (requires elevated permissions)',
|
|
47
|
+
proxmox_list_backups: 'List all backups on a storage (requires elevated permissions)',
|
|
48
|
+
proxmox_restore_backup_lxc: 'Restore an LXC container from backup (requires elevated permissions)',
|
|
49
|
+
proxmox_restore_backup_vm: 'Restore a QEMU virtual machine from backup (requires elevated permissions)',
|
|
50
|
+
proxmox_delete_backup: 'Delete a backup file from storage (requires elevated permissions)',
|
|
51
|
+
// Disks
|
|
52
|
+
proxmox_add_disk_vm: 'Add a new disk to a QEMU virtual machine (requires elevated permissions)',
|
|
53
|
+
proxmox_add_mountpoint_lxc: 'Add a mount point to an LXC container (requires elevated permissions)',
|
|
54
|
+
proxmox_resize_disk_vm: 'Resize a QEMU VM disk (requires elevated permissions)',
|
|
55
|
+
proxmox_resize_disk_lxc: 'Resize an LXC container disk or mount point (requires elevated permissions)',
|
|
56
|
+
proxmox_remove_disk_vm: 'Remove a disk from a QEMU virtual machine (requires elevated permissions)',
|
|
57
|
+
proxmox_remove_mountpoint_lxc: 'Remove a mount point from an LXC container (requires elevated permissions)',
|
|
58
|
+
proxmox_move_disk_vm: 'Move a QEMU VM disk to different storage (requires elevated permissions)',
|
|
59
|
+
proxmox_move_disk_lxc: 'Move an LXC container disk to different storage (requires elevated permissions)',
|
|
60
|
+
// Network
|
|
61
|
+
proxmox_add_network_vm: 'Add network interface to QEMU VM (requires elevated permissions)',
|
|
62
|
+
proxmox_add_network_lxc: 'Add network interface to LXC container (requires elevated permissions)',
|
|
63
|
+
proxmox_update_network_vm: 'Update/modify VM network interface configuration (requires elevated permissions)',
|
|
64
|
+
proxmox_update_network_lxc: 'Update/modify LXC network interface configuration (requires elevated permissions)',
|
|
65
|
+
proxmox_remove_network_vm: 'Remove network interface from QEMU VM (requires elevated permissions)',
|
|
66
|
+
proxmox_remove_network_lxc: 'Remove network interface from LXC container (requires elevated permissions)',
|
|
67
|
+
// Command
|
|
68
|
+
proxmox_execute_vm_command: 'Execute a shell command on a virtual machine via Proxmox API',
|
|
69
|
+
// Creation
|
|
70
|
+
proxmox_list_templates: 'List available LXC container templates on a storage',
|
|
71
|
+
proxmox_create_lxc: 'Create a new LXC container (requires elevated permissions)',
|
|
72
|
+
proxmox_create_vm: 'Create a new QEMU virtual machine (requires elevated permissions)',
|
|
73
|
+
};
|
|
74
|
+
export function createServer(client, config) {
|
|
75
|
+
const server = new Server({
|
|
76
|
+
name: 'proxmox-mcp',
|
|
77
|
+
version: SERVER_VERSION,
|
|
78
|
+
}, {
|
|
79
|
+
capabilities: {
|
|
80
|
+
tools: {},
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
const toolDefinitions = TOOL_NAMES.map((name) => {
|
|
84
|
+
const entry = toolRegistry[name];
|
|
85
|
+
const jsonSchema = toJsonSchemaCompat(entry.schema);
|
|
86
|
+
// $schema meta-property is not part of the MCP tool inputSchema spec
|
|
87
|
+
const { $schema: _$schema, ...inputSchema } = jsonSchema;
|
|
88
|
+
return {
|
|
89
|
+
name,
|
|
90
|
+
description: TOOL_DESCRIPTIONS[name],
|
|
91
|
+
inputSchema: inputSchema,
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
95
|
+
tools: toolDefinitions,
|
|
96
|
+
}));
|
|
97
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
98
|
+
const { name, arguments: args } = request.params;
|
|
99
|
+
const entry = toolRegistry[name];
|
|
100
|
+
if (!entry) {
|
|
101
|
+
return {
|
|
102
|
+
content: [
|
|
103
|
+
{
|
|
104
|
+
type: 'text',
|
|
105
|
+
text: `Error: Unknown tool "${name}". Use ListTools to see available tools.`,
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
isError: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const validated = entry.schema.parse(args ?? {});
|
|
113
|
+
const result = await entry.handler(client, config, validated);
|
|
114
|
+
return { ...result };
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (error instanceof Error && error.name === 'ZodError') {
|
|
118
|
+
return {
|
|
119
|
+
content: [
|
|
120
|
+
{
|
|
121
|
+
type: 'text',
|
|
122
|
+
text: `Validation error for tool "${name}": ${error.message}`,
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
isError: true,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
129
|
+
return {
|
|
130
|
+
content: [
|
|
131
|
+
{
|
|
132
|
+
type: 'text',
|
|
133
|
+
text: `Error executing tool "${name}": ${errorMessage}`,
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
isError: true,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
return server;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ProxmoxApiClient } from '../client/proxmox.js';
|
|
2
|
+
import type { Config } from '../config/index.js';
|
|
3
|
+
import type { ToolResponse } from '../types/index.js';
|
|
4
|
+
import type { CreateBackupLxcInput, CreateBackupVmInput, ListBackupsInput, RestoreBackupLxcInput, RestoreBackupVmInput, DeleteBackupInput } from '../schemas/backup.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create a backup of an LXC container
|
|
7
|
+
* Requires elevated permissions
|
|
8
|
+
*/
|
|
9
|
+
export declare function createBackupLxc(client: ProxmoxApiClient, config: Config, input: CreateBackupLxcInput): Promise<ToolResponse>;
|
|
10
|
+
/**
|
|
11
|
+
* Create a backup of a QEMU VM
|
|
12
|
+
* Requires elevated permissions
|
|
13
|
+
*/
|
|
14
|
+
export declare function createBackupVM(client: ProxmoxApiClient, config: Config, input: CreateBackupVmInput): Promise<ToolResponse>;
|
|
15
|
+
/**
|
|
16
|
+
* List all backups on a storage
|
|
17
|
+
* Requires elevated permissions
|
|
18
|
+
*/
|
|
19
|
+
export declare function listBackups(client: ProxmoxApiClient, config: Config, input: ListBackupsInput): Promise<ToolResponse>;
|
|
20
|
+
/**
|
|
21
|
+
* Restore an LXC container from backup
|
|
22
|
+
* Requires elevated permissions
|
|
23
|
+
*/
|
|
24
|
+
export declare function restoreBackupLxc(client: ProxmoxApiClient, config: Config, input: RestoreBackupLxcInput): Promise<ToolResponse>;
|
|
25
|
+
/**
|
|
26
|
+
* Restore a QEMU VM from backup
|
|
27
|
+
* Requires elevated permissions
|
|
28
|
+
*/
|
|
29
|
+
export declare function restoreBackupVM(client: ProxmoxApiClient, config: Config, input: RestoreBackupVmInput): Promise<ToolResponse>;
|
|
30
|
+
/**
|
|
31
|
+
* Delete a backup file from storage
|
|
32
|
+
* Requires elevated permissions
|
|
33
|
+
*/
|
|
34
|
+
export declare function deleteBackup(client: ProxmoxApiClient, config: Config, input: DeleteBackupInput): Promise<ToolResponse>;
|
|
35
|
+
//# sourceMappingURL=backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/tools/backup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAgBtD,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAoCvB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,YAAY,CAAC,CAoCvB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,CAAC,CAgDvB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAuCvB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAuCvB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC,CA2BvB"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { formatToolResponse, formatErrorResponse, formatBytes, } from '../formatters/index.js';
|
|
2
|
+
import { requireElevated } from '../middleware/index.js';
|
|
3
|
+
import { validateNodeName, validateVMID, validateStorageName } from '../validators/index.js';
|
|
4
|
+
import { createBackupLxcSchema, createBackupVmSchema, listBackupsSchema, restoreBackupLxcSchema, restoreBackupVmSchema, deleteBackupSchema, } from '../schemas/backup.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create a backup of an LXC container
|
|
7
|
+
* Requires elevated permissions
|
|
8
|
+
*/
|
|
9
|
+
export async function createBackupLxc(client, config, input) {
|
|
10
|
+
try {
|
|
11
|
+
requireElevated(config, 'create LXC backup');
|
|
12
|
+
const validated = createBackupLxcSchema.parse(input);
|
|
13
|
+
const safeNode = validateNodeName(validated.node);
|
|
14
|
+
const safeVmid = validateVMID(validated.vmid);
|
|
15
|
+
const result = await client.request(`/nodes/${safeNode}/vzdump`, 'POST', {
|
|
16
|
+
vmid: safeVmid,
|
|
17
|
+
storage: validated.storage || 'local',
|
|
18
|
+
mode: validated.mode || 'snapshot',
|
|
19
|
+
compress: validated.compress || 'zstd',
|
|
20
|
+
});
|
|
21
|
+
let output = `💾 **Backup Creation Started**\n\n`;
|
|
22
|
+
output += `• **Container ID**: ${safeVmid}\n`;
|
|
23
|
+
output += `• **Node**: ${safeNode}\n`;
|
|
24
|
+
output += `• **Storage**: ${validated.storage || 'local'}\n`;
|
|
25
|
+
output += `• **Mode**: ${validated.mode || 'snapshot'}\n`;
|
|
26
|
+
output += `• **Compression**: ${validated.compress || 'zstd'}\n`;
|
|
27
|
+
output += `• **Task ID**: ${result || 'N/A'}\n\n`;
|
|
28
|
+
output += `**Backup Modes**:\n`;
|
|
29
|
+
output += ` • snapshot: Quick backup using snapshots (recommended)\n`;
|
|
30
|
+
output += ` • suspend: Suspends container during backup\n`;
|
|
31
|
+
output += ` • stop: Stops container during backup\n\n`;
|
|
32
|
+
output += `Use \`list_backups\` to view all backups.`;
|
|
33
|
+
return formatToolResponse(output);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return formatErrorResponse(error, 'Create LXC Backup');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create a backup of a QEMU VM
|
|
41
|
+
* Requires elevated permissions
|
|
42
|
+
*/
|
|
43
|
+
export async function createBackupVM(client, config, input) {
|
|
44
|
+
try {
|
|
45
|
+
requireElevated(config, 'create VM backup');
|
|
46
|
+
const validated = createBackupVmSchema.parse(input);
|
|
47
|
+
const safeNode = validateNodeName(validated.node);
|
|
48
|
+
const safeVmid = validateVMID(validated.vmid);
|
|
49
|
+
const result = await client.request(`/nodes/${safeNode}/vzdump`, 'POST', {
|
|
50
|
+
vmid: safeVmid,
|
|
51
|
+
storage: validated.storage || 'local',
|
|
52
|
+
mode: validated.mode || 'snapshot',
|
|
53
|
+
compress: validated.compress || 'zstd',
|
|
54
|
+
});
|
|
55
|
+
let output = `💾 **Backup Creation Started**\n\n`;
|
|
56
|
+
output += `• **VM ID**: ${safeVmid}\n`;
|
|
57
|
+
output += `• **Node**: ${safeNode}\n`;
|
|
58
|
+
output += `• **Storage**: ${validated.storage || 'local'}\n`;
|
|
59
|
+
output += `• **Mode**: ${validated.mode || 'snapshot'}\n`;
|
|
60
|
+
output += `• **Compression**: ${validated.compress || 'zstd'}\n`;
|
|
61
|
+
output += `• **Task ID**: ${result || 'N/A'}\n\n`;
|
|
62
|
+
output += `**Backup Modes**:\n`;
|
|
63
|
+
output += ` • snapshot: Quick backup using snapshots (recommended)\n`;
|
|
64
|
+
output += ` • suspend: Suspends VM during backup\n`;
|
|
65
|
+
output += ` • stop: Stops VM during backup\n\n`;
|
|
66
|
+
output += `Use \`list_backups\` to view all backups.`;
|
|
67
|
+
return formatToolResponse(output);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return formatErrorResponse(error, 'Create VM Backup');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* List all backups on a storage
|
|
75
|
+
* Requires elevated permissions
|
|
76
|
+
*/
|
|
77
|
+
export async function listBackups(client, config, input) {
|
|
78
|
+
try {
|
|
79
|
+
requireElevated(config, 'list backups');
|
|
80
|
+
const validated = listBackupsSchema.parse(input);
|
|
81
|
+
const safeNode = validateNodeName(validated.node);
|
|
82
|
+
const storage = validated.storage || 'local';
|
|
83
|
+
const backups = (await client.request(`/nodes/${safeNode}/storage/${storage}/content?content=backup`));
|
|
84
|
+
let output = `📦 **Backups on ${storage}**\n\n`;
|
|
85
|
+
if (!backups || backups.length === 0) {
|
|
86
|
+
output += `No backups found on storage \`${storage}\`.\n\n`;
|
|
87
|
+
output += `Use \`create_backup_lxc\` or \`create_backup_vm\` to create backups.`;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Sort by creation time (newest first)
|
|
91
|
+
const sorted = backups.sort((a, b) => (b.ctime || 0) - (a.ctime || 0));
|
|
92
|
+
for (const backup of sorted) {
|
|
93
|
+
// Parse filename to extract VM type and ID
|
|
94
|
+
const filename = backup.volid.split('/').pop() || backup.volid;
|
|
95
|
+
const match = filename.match(/vzdump-(lxc|qemu)-(\d+)-/);
|
|
96
|
+
const vmType = match ? match[1].toUpperCase() : 'UNKNOWN';
|
|
97
|
+
const vmId = match ? match[2] : 'N/A';
|
|
98
|
+
output += `**${filename}**\n`;
|
|
99
|
+
output += ` • VM ID: ${vmId} (${vmType})\n`;
|
|
100
|
+
output += ` • Size: ${backup.size ? formatBytes(backup.size) : 'N/A'}\n`;
|
|
101
|
+
if (backup.ctime) {
|
|
102
|
+
const date = new Date(backup.ctime * 1000);
|
|
103
|
+
output += ` • Created: ${date.toLocaleString()}\n`;
|
|
104
|
+
}
|
|
105
|
+
output += ` • Volume: ${backup.volid}\n\n`;
|
|
106
|
+
}
|
|
107
|
+
output += `**Total**: ${sorted.length} backup(s)`;
|
|
108
|
+
}
|
|
109
|
+
return formatToolResponse(output);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return formatErrorResponse(error, 'List Backups');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Restore an LXC container from backup
|
|
117
|
+
* Requires elevated permissions
|
|
118
|
+
*/
|
|
119
|
+
export async function restoreBackupLxc(client, config, input) {
|
|
120
|
+
try {
|
|
121
|
+
requireElevated(config, 'restore LXC backup');
|
|
122
|
+
const validated = restoreBackupLxcSchema.parse(input);
|
|
123
|
+
const safeNode = validateNodeName(validated.node);
|
|
124
|
+
const safeVmid = validateVMID(validated.vmid);
|
|
125
|
+
const body = {
|
|
126
|
+
vmid: safeVmid,
|
|
127
|
+
archive: validated.archive,
|
|
128
|
+
restore: 1,
|
|
129
|
+
};
|
|
130
|
+
if (validated.storage) {
|
|
131
|
+
body.storage = validated.storage;
|
|
132
|
+
}
|
|
133
|
+
const result = await client.request(`/nodes/${safeNode}/lxc`, 'POST', body);
|
|
134
|
+
let output = `♻️ **Backup Restore Started**\n\n`;
|
|
135
|
+
output += `• **New Container ID**: ${safeVmid}\n`;
|
|
136
|
+
output += `• **Node**: ${safeNode}\n`;
|
|
137
|
+
output += `• **Archive**: ${validated.archive}\n`;
|
|
138
|
+
if (validated.storage) {
|
|
139
|
+
output += `• **Storage**: ${validated.storage}\n`;
|
|
140
|
+
}
|
|
141
|
+
output += `• **Task ID**: ${result || 'N/A'}\n\n`;
|
|
142
|
+
output += `**Note**: Restore operation may take several minutes depending on backup size.\n`;
|
|
143
|
+
output += `**Tip**: Use \`get_vm_status\` to check the restored container status after completion.`;
|
|
144
|
+
return formatToolResponse(output);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return formatErrorResponse(error, 'Restore LXC Backup');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Restore a QEMU VM from backup
|
|
152
|
+
* Requires elevated permissions
|
|
153
|
+
*/
|
|
154
|
+
export async function restoreBackupVM(client, config, input) {
|
|
155
|
+
try {
|
|
156
|
+
requireElevated(config, 'restore VM backup');
|
|
157
|
+
const validated = restoreBackupVmSchema.parse(input);
|
|
158
|
+
const safeNode = validateNodeName(validated.node);
|
|
159
|
+
const safeVmid = validateVMID(validated.vmid);
|
|
160
|
+
const body = {
|
|
161
|
+
vmid: safeVmid,
|
|
162
|
+
archive: validated.archive,
|
|
163
|
+
restore: 1,
|
|
164
|
+
};
|
|
165
|
+
if (validated.storage) {
|
|
166
|
+
body.storage = validated.storage;
|
|
167
|
+
}
|
|
168
|
+
const result = await client.request(`/nodes/${safeNode}/qemu`, 'POST', body);
|
|
169
|
+
let output = `♻️ **Backup Restore Started**\n\n`;
|
|
170
|
+
output += `• **New VM ID**: ${safeVmid}\n`;
|
|
171
|
+
output += `• **Node**: ${safeNode}\n`;
|
|
172
|
+
output += `• **Archive**: ${validated.archive}\n`;
|
|
173
|
+
if (validated.storage) {
|
|
174
|
+
output += `• **Storage**: ${validated.storage}\n`;
|
|
175
|
+
}
|
|
176
|
+
output += `• **Task ID**: ${result || 'N/A'}\n\n`;
|
|
177
|
+
output += `**Note**: Restore operation may take several minutes depending on backup size.\n`;
|
|
178
|
+
output += `**Tip**: Use \`get_vm_status\` to check the restored VM status after completion.`;
|
|
179
|
+
return formatToolResponse(output);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
return formatErrorResponse(error, 'Restore VM Backup');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Delete a backup file from storage
|
|
187
|
+
* Requires elevated permissions
|
|
188
|
+
*/
|
|
189
|
+
export async function deleteBackup(client, config, input) {
|
|
190
|
+
try {
|
|
191
|
+
requireElevated(config, 'delete backup');
|
|
192
|
+
const validated = deleteBackupSchema.parse(input);
|
|
193
|
+
const safeNode = validateNodeName(validated.node);
|
|
194
|
+
const safeStorage = validateStorageName(validated.storage);
|
|
195
|
+
// URL-encode the volume parameter
|
|
196
|
+
const encodedVolume = encodeURIComponent(validated.volume);
|
|
197
|
+
const result = await client.request(`/nodes/${safeNode}/storage/${safeStorage}/content/${encodedVolume}`, 'DELETE');
|
|
198
|
+
let output = `🗑️ **Backup Deletion Started**\n\n`;
|
|
199
|
+
output += `• **Node**: ${safeNode}\n`;
|
|
200
|
+
output += `• **Storage**: ${safeStorage}\n`;
|
|
201
|
+
output += `• **Volume**: ${validated.volume}\n`;
|
|
202
|
+
output += `• **Task ID**: ${result || 'N/A'}\n\n`;
|
|
203
|
+
output += `**Warning**: Backup file will be permanently deleted from storage.`;
|
|
204
|
+
return formatToolResponse(output);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
return formatErrorResponse(error, 'Delete Backup');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/tools/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProxmoxApiClient } from '../client/proxmox.js';
|
|
2
|
+
import type { Config } from '../config/index.js';
|
|
3
|
+
import type { ToolResponse } from '../types/index.js';
|
|
4
|
+
import type { GetClusterStatusInput, GetNextVmidInput } from '../schemas/node.js';
|
|
5
|
+
/**
|
|
6
|
+
* Get overall cluster status with resource usage and node information.
|
|
7
|
+
* Gracefully degrades without elevated permissions.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getClusterStatus(client: ProxmoxApiClient, config: Config, input: GetClusterStatusInput): Promise<ToolResponse>;
|
|
10
|
+
/**
|
|
11
|
+
* Get the next available VM/Container ID.
|
|
12
|
+
* No elevated permissions required.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getNextVMID(client: ProxmoxApiClient, _config: Config, input: GetNextVmidInput): Promise<ToolResponse>;
|
|
15
|
+
//# sourceMappingURL=cluster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../../src/tools/cluster.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAElF;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAgEvB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,CAAC,CAevB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { formatToolResponse, formatErrorResponse, formatBytes, } from '../formatters/index.js';
|
|
2
|
+
import { getClusterStatusSchema, getNextVmidSchema } from '../schemas/node.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get overall cluster status with resource usage and node information.
|
|
5
|
+
* Gracefully degrades without elevated permissions.
|
|
6
|
+
*/
|
|
7
|
+
export async function getClusterStatus(client, config, input) {
|
|
8
|
+
try {
|
|
9
|
+
// Validate input (empty schema)
|
|
10
|
+
getClusterStatusSchema.parse(input);
|
|
11
|
+
// Get nodes list
|
|
12
|
+
const nodes = (await client.request('/nodes'));
|
|
13
|
+
// Try to get cluster status if elevated, but ignore errors
|
|
14
|
+
if (config.allowElevated) {
|
|
15
|
+
try {
|
|
16
|
+
await client.request('/cluster/status');
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Ignore cluster status errors
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Format response
|
|
23
|
+
let output = '🏗️ **Proxmox Cluster Status**\n\n';
|
|
24
|
+
// Cluster overview
|
|
25
|
+
const onlineNodes = nodes.filter((n) => n.status === 'online').length;
|
|
26
|
+
const totalNodes = nodes.length;
|
|
27
|
+
output += `**Cluster Health**: ${onlineNodes === totalNodes ? '🟢 Healthy' : '🟡 Warning'}\n`;
|
|
28
|
+
output += `**Nodes**: ${onlineNodes}/${totalNodes} online\n\n`;
|
|
29
|
+
if (config.allowElevated) {
|
|
30
|
+
// Resource summary (only available with elevated permissions)
|
|
31
|
+
let totalCpu = 0;
|
|
32
|
+
let usedCpu = 0;
|
|
33
|
+
let totalMem = 0;
|
|
34
|
+
let usedMem = 0;
|
|
35
|
+
for (const node of nodes) {
|
|
36
|
+
if (node.status === 'online') {
|
|
37
|
+
totalCpu += node.maxcpu || 0;
|
|
38
|
+
usedCpu += (node.cpu || 0) * (node.maxcpu || 0);
|
|
39
|
+
totalMem += node.maxmem || 0;
|
|
40
|
+
usedMem += node.mem || 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const cpuPercent = totalCpu > 0 ? ((usedCpu / totalCpu) * 100).toFixed(1) : 'N/A';
|
|
44
|
+
const memPercent = totalMem > 0 ? ((usedMem / totalMem) * 100).toFixed(1) : 'N/A';
|
|
45
|
+
output += `**Resource Usage**:\n`;
|
|
46
|
+
output += `• CPU: ${cpuPercent}% (${usedCpu.toFixed(1)}/${totalCpu} cores)\n`;
|
|
47
|
+
output += `• Memory: ${memPercent}% (${formatBytes(usedMem)}/${formatBytes(totalMem)})\n\n`;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
output += `⚠️ **Limited Information**: Resource usage requires elevated permissions\n\n`;
|
|
51
|
+
}
|
|
52
|
+
// Node status
|
|
53
|
+
output += `**Node Details**:\n`;
|
|
54
|
+
for (const node of nodes.sort((a, b) => a.node.localeCompare(b.node))) {
|
|
55
|
+
const status = node.status === 'online' ? '🟢' : '🔴';
|
|
56
|
+
output += `${status} ${node.node} - ${node.status}\n`;
|
|
57
|
+
}
|
|
58
|
+
return formatToolResponse(output);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
return formatErrorResponse(error, 'Get Cluster Status');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get the next available VM/Container ID.
|
|
66
|
+
* No elevated permissions required.
|
|
67
|
+
*/
|
|
68
|
+
export async function getNextVMID(client, _config, input) {
|
|
69
|
+
try {
|
|
70
|
+
// Validate input (empty schema)
|
|
71
|
+
getNextVmidSchema.parse(input);
|
|
72
|
+
// Call Proxmox API
|
|
73
|
+
const result = await client.request('/cluster/nextid');
|
|
74
|
+
// Format response
|
|
75
|
+
const output = `**Next Available VM/Container ID**: ${result}`;
|
|
76
|
+
return formatToolResponse(output);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return formatErrorResponse(error, 'Get Next VMID');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=cluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../src/tools/cluster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ProxmoxApiClient } from '../client/proxmox.js';
|
|
2
|
+
import type { Config } from '../config/index.js';
|
|
3
|
+
import type { ToolResponse } from '../types/index.js';
|
|
4
|
+
import type { ExecuteVmCommandInput } from '../schemas/vm.js';
|
|
5
|
+
export declare function executeVMCommand(client: ProxmoxApiClient, config: Config, input: ExecuteVmCommandInput): Promise<ToolResponse>;
|
|
6
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/tools/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { formatToolResponse, formatErrorResponse, } from '../formatters/index.js';
|
|
2
|
+
import { requireElevated } from '../middleware/index.js';
|
|
3
|
+
import { validateNodeName, validateVMID, validateCommand } from '../validators/index.js';
|
|
4
|
+
import { executeVmCommandSchema } from '../schemas/vm.js';
|
|
5
|
+
export async function executeVMCommand(client, config, input) {
|
|
6
|
+
try {
|
|
7
|
+
requireElevated(config, 'execute VM command');
|
|
8
|
+
const validated = executeVmCommandSchema.parse(input);
|
|
9
|
+
const safeNode = validateNodeName(validated.node);
|
|
10
|
+
const safeVmid = validateVMID(validated.vmid);
|
|
11
|
+
const safeCommand = validateCommand(validated.command);
|
|
12
|
+
const type = validated.type || 'qemu';
|
|
13
|
+
const result = (await client.request(`/nodes/${safeNode}/${type}/${safeVmid}/agent/exec`, 'POST', { command: ['sh', '-c', safeCommand] }));
|
|
14
|
+
const output = `⚡ **Command Execution Started**\n\n` +
|
|
15
|
+
`• **VM ID**: ${safeVmid}\n` +
|
|
16
|
+
`• **Type**: ${type.toUpperCase()}\n` +
|
|
17
|
+
`• **Command**: \`${safeCommand}\`\n` +
|
|
18
|
+
`• **PID**: ${result.pid}\n\n` +
|
|
19
|
+
`**Note**: Command runs asynchronously via QEMU guest agent.`;
|
|
20
|
+
return formatToolResponse(output);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return formatErrorResponse(error, 'Execute VM Command');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/tools/command.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAwB,EACxB,MAAc,EACd,KAA4B;IAE5B,IAAI,CAAC;QACH,eAAe,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAE9C,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC;QAEtC,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAClC,UAAU,QAAQ,IAAI,IAAI,IAAI,QAAQ,aAAa,EACnD,MAAM,EACN,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CACvC,CAAoB,CAAC;QAEtB,MAAM,MAAM,GACV,qCAAqC;YACrC,gBAAgB,QAAQ,IAAI;YAC5B,eAAe,IAAI,CAAC,WAAW,EAAE,IAAI;YACrC,oBAAoB,WAAW,MAAM;YACrC,cAAc,MAAM,CAAC,GAAG,MAAM;YAC9B,6DAA6D,CAAC;QAEhE,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,mBAAmB,CAAC,KAAc,EAAE,oBAAoB,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ProxmoxApiClient } from '../client/proxmox.js';
|
|
2
|
+
import type { Config } from '../config/index.js';
|
|
3
|
+
import type { ToolResponse } from '../types/index.js';
|
|
4
|
+
import type { AddDiskVmInput, AddMountpointLxcInput, ResizeDiskVmInput, ResizeDiskLxcInput, RemoveDiskVmInput, RemoveMountpointLxcInput, MoveDiskVmInput, MoveDiskLxcInput } from '../schemas/disk.js';
|
|
5
|
+
/**
|
|
6
|
+
* Add a new disk to a QEMU VM
|
|
7
|
+
* Requires elevated permissions
|
|
8
|
+
*/
|
|
9
|
+
export declare function addDiskVM(client: ProxmoxApiClient, config: Config, input: AddDiskVmInput): Promise<ToolResponse>;
|
|
10
|
+
/**
|
|
11
|
+
* Add a mount point to an LXC container
|
|
12
|
+
* Requires elevated permissions
|
|
13
|
+
*/
|
|
14
|
+
export declare function addMountpointLxc(client: ProxmoxApiClient, config: Config, input: AddMountpointLxcInput): Promise<ToolResponse>;
|
|
15
|
+
/**
|
|
16
|
+
* Resize a QEMU VM disk
|
|
17
|
+
* Requires elevated permissions
|
|
18
|
+
*/
|
|
19
|
+
export declare function resizeDiskVM(client: ProxmoxApiClient, config: Config, input: ResizeDiskVmInput): Promise<ToolResponse>;
|
|
20
|
+
/**
|
|
21
|
+
* Resize an LXC container disk or mount point
|
|
22
|
+
* Requires elevated permissions
|
|
23
|
+
*/
|
|
24
|
+
export declare function resizeDiskLxc(client: ProxmoxApiClient, config: Config, input: ResizeDiskLxcInput): Promise<ToolResponse>;
|
|
25
|
+
/**
|
|
26
|
+
* Remove a disk from a QEMU VM
|
|
27
|
+
* Requires elevated permissions
|
|
28
|
+
*/
|
|
29
|
+
export declare function removeDiskVM(client: ProxmoxApiClient, config: Config, input: RemoveDiskVmInput): Promise<ToolResponse>;
|
|
30
|
+
/**
|
|
31
|
+
* Remove a mount point from an LXC container
|
|
32
|
+
* Requires elevated permissions
|
|
33
|
+
*/
|
|
34
|
+
export declare function removeMountpointLxc(client: ProxmoxApiClient, config: Config, input: RemoveMountpointLxcInput): Promise<ToolResponse>;
|
|
35
|
+
/**
|
|
36
|
+
* Move a QEMU VM disk to different storage
|
|
37
|
+
* Requires elevated permissions
|
|
38
|
+
*/
|
|
39
|
+
export declare function moveDiskVM(client: ProxmoxApiClient, config: Config, input: MoveDiskVmInput): Promise<ToolResponse>;
|
|
40
|
+
/**
|
|
41
|
+
* Move an LXC container disk to different storage
|
|
42
|
+
* Requires elevated permissions
|
|
43
|
+
*/
|
|
44
|
+
export declare function moveDiskLxc(client: ProxmoxApiClient, config: Config, input: MoveDiskLxcInput): Promise<ToolResponse>;
|
|
45
|
+
//# sourceMappingURL=disk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disk.d.ts","sourceRoot":"","sources":["../../src/tools/disk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAiBtD,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,YAAY,CAAC,CAmCvB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,CA+BvB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC,CAgCvB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,YAAY,CAAC,CAiCvB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC,CA4BvB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,YAAY,CAAC,CA4BvB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,YAAY,CAAC,CAiCvB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,CAAC,CAkCvB"}
|