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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,cAAc,YAAY,CAAC;AAK3B;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAKtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,CAK/C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config entrypoint. Loads .env, parses env, returns AppConfig.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { loadConfig } from "./config/index.js";
|
|
6
|
+
* const cfg = loadConfig();
|
|
7
|
+
*/
|
|
8
|
+
import "dotenv/config";
|
|
9
|
+
import { parseEnv, loggerConfigFromEnv } from "./env.js";
|
|
10
|
+
import { buildAppConfig } from "./types.js";
|
|
11
|
+
export { parseEnv, loggerConfigFromEnv } from "./env.js";
|
|
12
|
+
export * from "./types.js";
|
|
13
|
+
let _config = null;
|
|
14
|
+
let _loggerConfig = null;
|
|
15
|
+
/**
|
|
16
|
+
* Load (and cache) the AppConfig. Subsequent calls return the cached value.
|
|
17
|
+
*/
|
|
18
|
+
export function loadConfig() {
|
|
19
|
+
if (_config)
|
|
20
|
+
return _config;
|
|
21
|
+
const env = parseEnv(process.env);
|
|
22
|
+
_config = buildAppConfig(env);
|
|
23
|
+
return _config;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load (and cache) the LoggerConfig.
|
|
27
|
+
*/
|
|
28
|
+
export function loadLoggerConfig() {
|
|
29
|
+
if (_loggerConfig)
|
|
30
|
+
return _loggerConfig;
|
|
31
|
+
const env = parseEnv(process.env);
|
|
32
|
+
_loggerConfig = loggerConfigFromEnv(env);
|
|
33
|
+
return _loggerConfig;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reset cached config (tests).
|
|
37
|
+
*/
|
|
38
|
+
export function resetConfig() {
|
|
39
|
+
_config = null;
|
|
40
|
+
_loggerConfig = null;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEzD,cAAc,YAAY,CAAC;AAE3B,IAAI,OAAO,GAAqB,IAAI,CAAC;AACrC,IAAI,aAAa,GAAwB,IAAI,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,aAAa,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,GAAG,IAAI,CAAC;IACf,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strongly-typed config derived from validated env.
|
|
3
|
+
*
|
|
4
|
+
* After env validation, we normalize into AppConfig — the value object every
|
|
5
|
+
* module reads from. No module should re-read process.env.
|
|
6
|
+
*/
|
|
7
|
+
import type { EnvInput } from "./env.js";
|
|
8
|
+
export interface ProxmoxConfig {
|
|
9
|
+
host: string;
|
|
10
|
+
port: number;
|
|
11
|
+
user: string;
|
|
12
|
+
tokenName: string;
|
|
13
|
+
tokenValue: string;
|
|
14
|
+
verifySsl: boolean;
|
|
15
|
+
timeoutMs: number;
|
|
16
|
+
service: "PVE" | "PMG" | "PBS";
|
|
17
|
+
}
|
|
18
|
+
export interface SafetyConfig {
|
|
19
|
+
devMode: boolean;
|
|
20
|
+
dangerouslyAllowDestructive: boolean;
|
|
21
|
+
approvalToken: string | null;
|
|
22
|
+
auditOnly: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface SshConfig {
|
|
25
|
+
user: string;
|
|
26
|
+
port: number;
|
|
27
|
+
keyFile: string | null;
|
|
28
|
+
password: string | null;
|
|
29
|
+
hostOverrides: Record<string, string>;
|
|
30
|
+
knownHostsFile: string | null;
|
|
31
|
+
strictHostKeyChecking: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface RetryJobConfig {
|
|
34
|
+
retryMax: number;
|
|
35
|
+
retryBaseMs: number;
|
|
36
|
+
jobTtlHours: number;
|
|
37
|
+
jobStore: "memory" | "sqlite";
|
|
38
|
+
jobSqlitePath: string;
|
|
39
|
+
/** HTTP transport host/port for non-stdio modes. */
|
|
40
|
+
httpHost: string;
|
|
41
|
+
httpPort: number;
|
|
42
|
+
}
|
|
43
|
+
export interface DownloadGuardConfig {
|
|
44
|
+
allowedSchemes: ReadonlyArray<string>;
|
|
45
|
+
allowedHosts: ReadonlyArray<string>;
|
|
46
|
+
}
|
|
47
|
+
export interface AppConfig {
|
|
48
|
+
proxmox: ProxmoxConfig;
|
|
49
|
+
safety: SafetyConfig;
|
|
50
|
+
ssh: SshConfig;
|
|
51
|
+
retryJob: RetryJobConfig;
|
|
52
|
+
download: DownloadGuardConfig;
|
|
53
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
54
|
+
logPretty: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build AppConfig from validated env input.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildAppConfig(env: EnvInput): AppConfig;
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B,EAAE,OAAO,CAAC;IACrC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,CA8CvD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build AppConfig from validated env input.
|
|
3
|
+
*/
|
|
4
|
+
export function buildAppConfig(env) {
|
|
5
|
+
return {
|
|
6
|
+
proxmox: {
|
|
7
|
+
host: env.PROXMOX_HOST,
|
|
8
|
+
port: env.PROXMOX_PORT,
|
|
9
|
+
user: env.PROXMOX_USER,
|
|
10
|
+
tokenName: env.PROXMOX_TOKEN_NAME,
|
|
11
|
+
tokenValue: env.PROXMOX_TOKEN_VALUE,
|
|
12
|
+
verifySsl: env.PROXMOX_VERIFY_SSL,
|
|
13
|
+
timeoutMs: env.PROXMOX_TIMEOUT_MS,
|
|
14
|
+
service: env.PROXMOX_SERVICE,
|
|
15
|
+
},
|
|
16
|
+
safety: {
|
|
17
|
+
devMode: env.PROXMOX_DEV_MODE,
|
|
18
|
+
dangerouslyAllowDestructive: env.PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE,
|
|
19
|
+
approvalToken: env.PROXMOX_MCP_APPROVAL_TOKEN && env.PROXMOX_MCP_APPROVAL_TOKEN.length >= 8
|
|
20
|
+
? env.PROXMOX_MCP_APPROVAL_TOKEN
|
|
21
|
+
: null,
|
|
22
|
+
auditOnly: env.PROXMOX_MCP_AUDIT_ONLY,
|
|
23
|
+
},
|
|
24
|
+
ssh: {
|
|
25
|
+
user: env.PROXMOX_SSH_USER,
|
|
26
|
+
port: env.PROXMOX_SSH_PORT,
|
|
27
|
+
keyFile: env.PROXMOX_SSH_KEY_FILE || null,
|
|
28
|
+
password: env.PROXMOX_SSH_PASSWORD || null,
|
|
29
|
+
hostOverrides: env.PROXMOX_SSH_HOST_OVERRIDES ?? {},
|
|
30
|
+
knownHostsFile: env.PROXMOX_SSH_KNOWN_HOSTS_FILE || null,
|
|
31
|
+
strictHostKeyChecking: env.PROXMOX_SSH_STRICT_HOST_KEY_CHECKING,
|
|
32
|
+
},
|
|
33
|
+
retryJob: {
|
|
34
|
+
retryMax: env.PROXMOX_MCP_RETRY_MAX,
|
|
35
|
+
retryBaseMs: env.PROXMOX_MCP_RETRY_BASE_MS,
|
|
36
|
+
jobTtlHours: env.PROXMOX_MCP_JOB_TTL_HOURS,
|
|
37
|
+
jobStore: env.PROXMOX_MCP_JOB_STORE,
|
|
38
|
+
jobSqlitePath: env.PROXMOX_MCP_JOB_SQLITE_PATH,
|
|
39
|
+
httpHost: env.MCP_HOST,
|
|
40
|
+
httpPort: env.MCP_PORT,
|
|
41
|
+
},
|
|
42
|
+
download: {
|
|
43
|
+
allowedSchemes: env.PROXMOX_DOWNLOAD_ALLOWED_SCHEMES,
|
|
44
|
+
allowedHosts: env.PROXMOX_DOWNLOAD_ALLOWED_HOSTS,
|
|
45
|
+
},
|
|
46
|
+
logLevel: env.LOG_LEVEL,
|
|
47
|
+
logPretty: env.LOG_PRETTY,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AA8DA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAa;IAC1C,OAAO;QACL,OAAO,EAAE;YACP,IAAI,EAAE,GAAG,CAAC,YAAY;YACtB,IAAI,EAAE,GAAG,CAAC,YAAY;YACtB,IAAI,EAAE,GAAG,CAAC,YAAY;YACtB,SAAS,EAAE,GAAG,CAAC,kBAAkB;YACjC,UAAU,EAAE,GAAG,CAAC,mBAAmB;YACnC,SAAS,EAAE,GAAG,CAAC,kBAAkB;YACjC,SAAS,EAAE,GAAG,CAAC,kBAAkB;YACjC,OAAO,EAAE,GAAG,CAAC,eAAe;SAC7B;QACD,MAAM,EAAE;YACN,OAAO,EAAE,GAAG,CAAC,gBAAgB;YAC7B,2BAA2B,EAAE,GAAG,CAAC,qCAAqC;YACtE,aAAa,EACX,GAAG,CAAC,0BAA0B,IAAI,GAAG,CAAC,0BAA0B,CAAC,MAAM,IAAI,CAAC;gBAC1E,CAAC,CAAC,GAAG,CAAC,0BAA0B;gBAChC,CAAC,CAAC,IAAI;YACV,SAAS,EAAE,GAAG,CAAC,sBAAsB;SACtC;QACD,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,CAAC,gBAAgB;YAC1B,IAAI,EAAE,GAAG,CAAC,gBAAgB;YAC1B,OAAO,EAAE,GAAG,CAAC,oBAAoB,IAAI,IAAI;YACzC,QAAQ,EAAE,GAAG,CAAC,oBAAoB,IAAI,IAAI;YAC1C,aAAa,EAAE,GAAG,CAAC,0BAA0B,IAAI,EAAE;YACnD,cAAc,EAAE,GAAG,CAAC,4BAA4B,IAAI,IAAI;YACxD,qBAAqB,EAAE,GAAG,CAAC,oCAAoC;SAChE;QACD,QAAQ,EAAE;YACR,QAAQ,EAAE,GAAG,CAAC,qBAAqB;YACnC,WAAW,EAAE,GAAG,CAAC,yBAAyB;YAC1C,WAAW,EAAE,GAAG,CAAC,yBAAyB;YAC1C,QAAQ,EAAE,GAAG,CAAC,qBAAqB;YACnC,aAAa,EAAE,GAAG,CAAC,2BAA2B;YAC9C,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,GAAG,CAAC,gCAAgC;YACpD,YAAY,EAAE,GAAG,CAAC,8BAA8B;SACjD;QACD,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP text-content helpers + runTool envelope.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes how every tool converts its result into the MCP `content` shape.
|
|
5
|
+
* Models read these as plain text; we prefer pretty-printed JSON with a
|
|
6
|
+
* short header so they're scannable in Claude Code's UI.
|
|
7
|
+
*/
|
|
8
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
9
|
+
import type { ToolContext } from "../tools/context.js";
|
|
10
|
+
/**
|
|
11
|
+
* Convert anything to a JSON string with stable formatting.
|
|
12
|
+
*/
|
|
13
|
+
export declare function toJson(value: unknown): string;
|
|
14
|
+
/**
|
|
15
|
+
* Build a successful text-content result. Tools use this for normal output.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ok(text: string): CallToolResult;
|
|
18
|
+
/**
|
|
19
|
+
* Build an error text-content result. Sets isError so the model knows.
|
|
20
|
+
*/
|
|
21
|
+
export declare function errResult(text: string): CallToolResult;
|
|
22
|
+
/**
|
|
23
|
+
* Convenience: JSON result with a header line.
|
|
24
|
+
*/
|
|
25
|
+
export declare function jsonResult(header: string, data: unknown): CallToolResult;
|
|
26
|
+
/**
|
|
27
|
+
* Render an array of objects as a compact text table.
|
|
28
|
+
* Falls back to JSON if records have varying keys.
|
|
29
|
+
*/
|
|
30
|
+
export declare function tableResult(header: string, rows: Record<string, unknown>[]): CallToolResult;
|
|
31
|
+
/**
|
|
32
|
+
* Map any thrown error into a stable error result.
|
|
33
|
+
*/
|
|
34
|
+
export declare function errorResult(error: unknown): CallToolResult;
|
|
35
|
+
/**
|
|
36
|
+
* Standard envelope for every tool handler. Catches errors and maps to MCP
|
|
37
|
+
* shape; tracks latency for logging; observes via policy gate.
|
|
38
|
+
*/
|
|
39
|
+
export declare function runTool(ctx: ToolContext, name: string, args: Record<string, unknown>, fn: () => Promise<CallToolResult>): Promise<CallToolResult>;
|
|
40
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/format/response.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAE/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAEtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,CAExE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,cAAc,CA4B3F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAuB1D;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,EAAE,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,cAAc,CAAC,CAmBzB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { ZodError } from "zod";
|
|
2
|
+
import { ApprovalRequiredError, ProxmoxApiError } from "../proxmox/errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* Convert anything to a JSON string with stable formatting.
|
|
5
|
+
*/
|
|
6
|
+
export function toJson(value) {
|
|
7
|
+
return JSON.stringify(value, null, 2);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build a successful text-content result. Tools use this for normal output.
|
|
11
|
+
*/
|
|
12
|
+
export function ok(text) {
|
|
13
|
+
return { content: [{ type: "text", text }] };
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build an error text-content result. Sets isError so the model knows.
|
|
17
|
+
*/
|
|
18
|
+
export function errResult(text) {
|
|
19
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Convenience: JSON result with a header line.
|
|
23
|
+
*/
|
|
24
|
+
export function jsonResult(header, data) {
|
|
25
|
+
return ok(`${header}\n\`\`\`json\n${toJson(data)}\n\`\`\``);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Render an array of objects as a compact text table.
|
|
29
|
+
* Falls back to JSON if records have varying keys.
|
|
30
|
+
*/
|
|
31
|
+
export function tableResult(header, rows) {
|
|
32
|
+
if (rows.length === 0) {
|
|
33
|
+
return ok(`${header}\n(empty)`);
|
|
34
|
+
}
|
|
35
|
+
// Collect all keys
|
|
36
|
+
const keys = Array.from(rows.reduce((set, r) => {
|
|
37
|
+
for (const k of Object.keys(r))
|
|
38
|
+
set.add(k);
|
|
39
|
+
return set;
|
|
40
|
+
}, new Set()));
|
|
41
|
+
// Pick a sensible subset if too many
|
|
42
|
+
const displayKeys = keys.length > 8 ? keys.slice(0, 8) : keys;
|
|
43
|
+
const widths = displayKeys.map((k) => Math.max(k.length, ...rows.map((r) => String(r[k] ?? "").length)));
|
|
44
|
+
const fmt = (cells) => cells.map((c, i) => c.padEnd(widths[i] ?? c.length)).join(" ");
|
|
45
|
+
const lines = [
|
|
46
|
+
header,
|
|
47
|
+
fmt(displayKeys),
|
|
48
|
+
fmt(widths.map((w) => "-".repeat(w))),
|
|
49
|
+
...rows.map((r) => fmt(displayKeys.map((k) => String(r[k] ?? "")))),
|
|
50
|
+
];
|
|
51
|
+
return ok(lines.join("\n"));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Map any thrown error into a stable error result.
|
|
55
|
+
*/
|
|
56
|
+
export function errorResult(error) {
|
|
57
|
+
if (error instanceof ApprovalRequiredError) {
|
|
58
|
+
return errResult(`❌ ${error.message}\n\n` +
|
|
59
|
+
`Provide an 'approval_token' argument equal to PROXMOX_MCP_APPROVAL_TOKEN, ` +
|
|
60
|
+
`or set PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE=true in the MCP server environment.`);
|
|
61
|
+
}
|
|
62
|
+
if (error instanceof ZodError) {
|
|
63
|
+
return errResult(`❌ Invalid input:\n${error.issues.map((i) => ` - ${i.path.join(".") || "(root)"}: ${i.message}`).join("\n")}`);
|
|
64
|
+
}
|
|
65
|
+
if (error instanceof ProxmoxApiError) {
|
|
66
|
+
const detail = Object.keys(error.errors).length > 0
|
|
67
|
+
? ` (${Object.entries(error.errors).map(([k, v]) => `${k}=${v}`).join(", ")})`
|
|
68
|
+
: "";
|
|
69
|
+
return errResult(`❌ Proxmox API error (${error.status})${detail}: ${error.message}`);
|
|
70
|
+
}
|
|
71
|
+
if (error instanceof Error) {
|
|
72
|
+
return errResult(`❌ ${error.message}`);
|
|
73
|
+
}
|
|
74
|
+
return errResult(`❌ ${String(error)}`);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Standard envelope for every tool handler. Catches errors and maps to MCP
|
|
78
|
+
* shape; tracks latency for logging; observes via policy gate.
|
|
79
|
+
*/
|
|
80
|
+
export async function runTool(ctx, name, args, fn) {
|
|
81
|
+
const start = Date.now();
|
|
82
|
+
const toolLogger = ctx.logger.child({ tool: name });
|
|
83
|
+
try {
|
|
84
|
+
// Enforce policy (may throw ApprovalRequiredError)
|
|
85
|
+
ctx.policy.assertAllowed(name, args);
|
|
86
|
+
const result = await fn();
|
|
87
|
+
const elapsedMs = Date.now() - start;
|
|
88
|
+
toolLogger.info({ args: scrubArgs(args), elapsedMs, ok: true }, "tool.ok");
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const elapsedMs = Date.now() - start;
|
|
93
|
+
toolLogger.warn({ args: scrubArgs(args), elapsedMs, err: error instanceof Error ? error.message : String(error) }, "tool.err");
|
|
94
|
+
return errorResult(error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function scrubArgs(args) {
|
|
98
|
+
const out = {};
|
|
99
|
+
for (const [k, v] of Object.entries(args)) {
|
|
100
|
+
if (k === "approval_token" || k === "password" || k === "new_password" || k === "cipassword") {
|
|
101
|
+
out[k] = "[REDACTED]";
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
out[k] = v;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/format/response.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Entry point. Wires env → AppConfig → McpServer → transport (stdio/sse/streamable).
|
|
4
|
+
*
|
|
5
|
+
* Transport is selected via MCP_TRANSPORT env var:
|
|
6
|
+
* - STDIO: default; for Claude Code integration
|
|
7
|
+
* - SSE: legacy HTTP+SSE
|
|
8
|
+
* - STREAMABLE: streamable HTTP (recommended for non-stdio clients)
|
|
9
|
+
*
|
|
10
|
+
* Use `npm run dev` for tsx watch, or `npm run build && npm start` for prod.
|
|
11
|
+
*/
|
|
12
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
13
|
+
import { loadConfig, loadLoggerConfig } from "./config/index.js";
|
|
14
|
+
import { getLogger } from "./log.js";
|
|
15
|
+
import { buildServer } from "./server.js";
|
|
16
|
+
import { registerAll } from "./tools/index.js";
|
|
17
|
+
async function main() {
|
|
18
|
+
// Initialize logger first so we can report config errors.
|
|
19
|
+
const loggerCfg = loadLoggerConfig();
|
|
20
|
+
const logger = getLogger(loggerCfg);
|
|
21
|
+
let config;
|
|
22
|
+
try {
|
|
23
|
+
config = loadConfig();
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
logger.fatal({ err: err instanceof Error ? err.message : String(err) }, "config.load_failed");
|
|
27
|
+
process.exit(2);
|
|
28
|
+
}
|
|
29
|
+
const transport = config.retryJob.jobStore === "sqlite" ? "sqlite-jobs" : "memory-jobs"; // placeholder so the line above compiles
|
|
30
|
+
void transport;
|
|
31
|
+
logger.info({
|
|
32
|
+
host: config.proxmox.host,
|
|
33
|
+
port: config.proxmox.port,
|
|
34
|
+
user: config.proxmox.user,
|
|
35
|
+
verifySsl: config.proxmox.verifySsl,
|
|
36
|
+
devMode: config.safety.devMode,
|
|
37
|
+
jobStore: config.retryJob.jobStore,
|
|
38
|
+
}, "proxmox-mcp.starting");
|
|
39
|
+
if (config.safety.dangerouslyAllowDestructive) {
|
|
40
|
+
logger.warn("PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE=true — destructive tools will run without approval_token");
|
|
41
|
+
}
|
|
42
|
+
if (!config.safety.approvalToken && !config.safety.dangerouslyAllowDestructive) {
|
|
43
|
+
logger.warn("Neither PROXMOX_MCP_APPROVAL_TOKEN nor PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE is set — destructive/high-risk tools will be rejected");
|
|
44
|
+
}
|
|
45
|
+
const { server, ctx, close } = buildServer({ config });
|
|
46
|
+
registerAll(server, ctx);
|
|
47
|
+
// Graceful shutdown
|
|
48
|
+
const shutdown = async (signal) => {
|
|
49
|
+
logger.info({ signal }, "proxmox-mcp.shutting_down");
|
|
50
|
+
try {
|
|
51
|
+
await close();
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
logger.error({ err }, "proxmox-mcp.shutdown_error");
|
|
55
|
+
}
|
|
56
|
+
process.exit(0);
|
|
57
|
+
};
|
|
58
|
+
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
59
|
+
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
60
|
+
// Transport selection
|
|
61
|
+
const mode = (process.env.MCP_TRANSPORT ?? "STDIO").toUpperCase();
|
|
62
|
+
try {
|
|
63
|
+
if (mode === "STDIO") {
|
|
64
|
+
const transport = new StdioServerTransport();
|
|
65
|
+
await server.connect(transport);
|
|
66
|
+
logger.info("proxmox-mcp.connected_stdio");
|
|
67
|
+
}
|
|
68
|
+
else if (mode === "SSE") {
|
|
69
|
+
logger.warn("SSE transport falls back to streamable HTTP (legacy SSE mode not separately wired)");
|
|
70
|
+
await startStreamable(server, ctx, logger);
|
|
71
|
+
logger.info({ host: config.retryJob.httpHost, port: config.retryJob.httpPort }, "proxmox-mcp.connected_streamable");
|
|
72
|
+
}
|
|
73
|
+
else if (mode === "STREAMABLE") {
|
|
74
|
+
await startStreamable(server, ctx, logger);
|
|
75
|
+
logger.info({ host: config.retryJob.httpHost, port: config.retryJob.httpPort }, "proxmox-mcp.connected_streamable");
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw new Error(`Unknown MCP_TRANSPORT: ${mode}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
logger.fatal({ err, mode }, "proxmox-mcp.connect_failed");
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function startStreamable(
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
server, _ctx, logger) {
|
|
89
|
+
// Dynamic import to avoid loading express/uuid when stdio mode is used
|
|
90
|
+
const http = await import("node:http");
|
|
91
|
+
const { randomUUID } = await import("node:crypto");
|
|
92
|
+
const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
93
|
+
const { isInitializeRequest } = await import("@modelcontextprotocol/sdk/types.js");
|
|
94
|
+
// Hard cap on incoming JSON-RPC body size. Default 1 MiB. Prevents DoS via
|
|
95
|
+
// a single oversized request (the body is accumulated into a Buffer below).
|
|
96
|
+
const MAX_BODY_BYTES = 1_048_576;
|
|
97
|
+
const rejectPayload = (res, code, msg) => {
|
|
98
|
+
res.statusCode = code;
|
|
99
|
+
res.setHeader("Content-Type", "text/plain; charset=utf-8");
|
|
100
|
+
res.end(msg);
|
|
101
|
+
};
|
|
102
|
+
const config = loadConfig();
|
|
103
|
+
const transport = new StreamableHTTPServerTransport({
|
|
104
|
+
sessionIdGenerator: () => randomUUID(),
|
|
105
|
+
onsessioninitialized: (sid) => {
|
|
106
|
+
logger.info({ sessionId: sid }, "session.initialized");
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
await server.connect(transport);
|
|
110
|
+
const httpServer = http.createServer(async (req, res) => {
|
|
111
|
+
if (!req.url) {
|
|
112
|
+
rejectPayload(res, 400, "Bad Request");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
116
|
+
if (url.pathname === "/health") {
|
|
117
|
+
res.setHeader("Content-Type", "application/json");
|
|
118
|
+
res.end(JSON.stringify({ status: "ok", service: "proxmox-mcp" }));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (url.pathname === "/mcp") {
|
|
122
|
+
// DELETE /mcp — close the session and tear down the transport.
|
|
123
|
+
if (req.method === "DELETE") {
|
|
124
|
+
await transport.close();
|
|
125
|
+
res.statusCode = 200;
|
|
126
|
+
res.end();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// GET /mcp is reserved by the SDK (SSE stream); pass through.
|
|
130
|
+
if (req.method === "GET") {
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
132
|
+
const handleReq = transport.handleRequest.bind(transport);
|
|
133
|
+
await handleReq(req, res, undefined);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// POST /mcp — the only path that carries a JSON-RPC body.
|
|
137
|
+
if (req.method !== "POST") {
|
|
138
|
+
rejectPayload(res, 405, "Method Not Allowed");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Enforce Content-Type: application/json (and any charset suffix).
|
|
142
|
+
const ct = (req.headers["content-type"] ?? "").toLowerCase();
|
|
143
|
+
if (!ct.startsWith("application/json")) {
|
|
144
|
+
rejectPayload(res, 415, "Content-Type must be application/json");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Reject upfront if Content-Length is already over the cap.
|
|
148
|
+
const declared = Number.parseInt(req.headers["content-length"] ?? "", 10);
|
|
149
|
+
if (Number.isFinite(declared) && declared > MAX_BODY_BYTES) {
|
|
150
|
+
rejectPayload(res, 413, "Payload Too Large");
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// Accumulate body, abort if it grows past the cap during streaming.
|
|
154
|
+
const chunks = [];
|
|
155
|
+
let total = 0;
|
|
156
|
+
let aborted = false;
|
|
157
|
+
try {
|
|
158
|
+
for await (const chunk of req) {
|
|
159
|
+
const buf = chunk;
|
|
160
|
+
total += buf.length;
|
|
161
|
+
if (total > MAX_BODY_BYTES) {
|
|
162
|
+
aborted = true;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
chunks.push(buf);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// socket error; nothing to do — response will be aborted by Node
|
|
170
|
+
}
|
|
171
|
+
if (aborted) {
|
|
172
|
+
rejectPayload(res, 413, "Payload Too Large");
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const body = Buffer.concat(chunks).toString("utf8");
|
|
176
|
+
let parsed;
|
|
177
|
+
try {
|
|
178
|
+
parsed = body ? JSON.parse(body) : undefined;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
rejectPayload(res, 400, "Invalid JSON");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
185
|
+
const handleReq = transport.handleRequest.bind(transport);
|
|
186
|
+
await handleReq(req, res, parsed);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
rejectPayload(res, 404, "Not Found");
|
|
190
|
+
});
|
|
191
|
+
void isInitializeRequest; // silence unused
|
|
192
|
+
await new Promise((resolve) => httpServer.listen(config.retryJob.httpPort, config.retryJob.httpHost, resolve));
|
|
193
|
+
logger.info({ host: config.retryJob.httpHost, port: config.retryJob.httpPort }, "proxmox-mcp.http_listening");
|
|
194
|
+
return httpServer;
|
|
195
|
+
}
|
|
196
|
+
main().catch((err) => {
|
|
197
|
+
process.stderr.write(`[FATAL] ${err instanceof Error ? err.message : String(err)}\n`);
|
|
198
|
+
process.exit(1);
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Logger } from "../log.js";
|
|
2
|
+
import type { CreateJobOpts, JobRecord, JobStatus, JobStore } from "./store.js";
|
|
3
|
+
export interface SqliteJobStoreOptions {
|
|
4
|
+
sqlitePath: string;
|
|
5
|
+
ttlHours: number;
|
|
6
|
+
logger?: Logger;
|
|
7
|
+
}
|
|
8
|
+
export declare class SqliteJobStore implements JobStore {
|
|
9
|
+
private readonly db;
|
|
10
|
+
private readonly ttlMs;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
private readonly stmtInsert;
|
|
13
|
+
private readonly stmtGet;
|
|
14
|
+
private readonly stmtList;
|
|
15
|
+
private readonly stmtUpdate;
|
|
16
|
+
private readonly stmtDelete;
|
|
17
|
+
private readonly stmtEvict;
|
|
18
|
+
private readonly stmtSetUpid;
|
|
19
|
+
constructor(opts: SqliteJobStoreOptions);
|
|
20
|
+
create(opts: CreateJobOpts): JobRecord;
|
|
21
|
+
get(jobId: string): JobRecord | null;
|
|
22
|
+
list(filter?: {
|
|
23
|
+
status?: JobStatus;
|
|
24
|
+
tool?: string;
|
|
25
|
+
limit?: number;
|
|
26
|
+
}): JobRecord[];
|
|
27
|
+
setUpid(jobId: string, upid: string): void;
|
|
28
|
+
update(jobId: string, patch: Partial<JobRecord>): void;
|
|
29
|
+
delete(jobId: string): boolean;
|
|
30
|
+
evictExpired(): number;
|
|
31
|
+
close(): void;
|
|
32
|
+
private migrate;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=sqlite-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../src/jobs/sqlite-store.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6BD,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAiB;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAG5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;gBAE1C,IAAI,EAAE,qBAAqB;IAgEvC,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS;IAoCtC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKpC,IAAI,CAAC,MAAM,GAAE;QAAE,MAAM,CAAC,EAAE,SAAS,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,SAAS,EAAE;IASrF,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAY1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAqBtD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAK9B,YAAY,IAAI,MAAM;IAStB,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,OAAO;CAqBhB"}
|