@calltelemetry/ct-lab-mcp 0.8.85 → 0.8.87
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/README.md +1 -0
- package/dist/src/access-auth.d.ts +19 -0
- package/dist/src/access-auth.d.ts.map +1 -0
- package/dist/src/access-auth.js +52 -0
- package/dist/src/access-auth.js.map +1 -0
- package/dist/src/agent.d.ts +7 -0
- package/dist/src/agent.d.ts.map +1 -0
- package/dist/src/agent.js +14 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/provenance.d.ts.map +1 -1
- package/dist/src/provenance.js +24 -15
- package/dist/src/provenance.js.map +1 -1
- package/dist/src/proxmox/client.d.ts.map +1 -1
- package/dist/src/proxmox/client.js +36 -10
- package/dist/src/proxmox/client.js.map +1 -1
- package/dist/src/tools/appliance-candidate-retire.d.ts +6 -6
- package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -1
- package/dist/src/tools/appliance-claim-tools.js +57 -181
- package/dist/src/tools/appliance-claim-tools.js.map +1 -1
- package/dist/src/tools/appliance-exec.d.ts +2 -2
- package/dist/src/tools/canonical-guard.d.ts +1 -1
- package/dist/src/tools/claim-creation-projection.d.ts.map +1 -1
- package/dist/src/tools/claim-creation-projection.js +14 -4
- package/dist/src/tools/claim-creation-projection.js.map +1 -1
- package/dist/src/tools/cucm-emulator-tool.d.ts +2 -2
- package/dist/src/tools/factory-reset.d.ts +2 -2
- package/dist/src/tools/kubernetes-backend.d.ts +32 -0
- package/dist/src/tools/kubernetes-backend.d.ts.map +1 -0
- package/dist/src/tools/kubernetes-backend.js +156 -0
- package/dist/src/tools/kubernetes-backend.js.map +1 -0
- package/dist/src/tools/lab-dev.d.ts +2 -2
- package/dist/src/tools/license-tools.d.ts +4 -4
- package/dist/src/tools/list-inventory.d.ts +1 -1
- package/dist/src/tools/renewal-claim.d.ts.map +1 -1
- package/dist/src/tools/renewal-claim.js +4 -6
- package/dist/src/tools/renewal-claim.js.map +1 -1
- package/dist/src/tools/server-management.d.ts +2 -2
- package/dist/src/tools/slot-kubernetes.d.ts +0 -2
- package/dist/src/tools/slot-kubernetes.d.ts.map +1 -1
- package/dist/src/tools/slot-kubernetes.js +21 -49
- package/dist/src/tools/slot-kubernetes.js.map +1 -1
- package/dist/src/tools/slot-tools.d.ts +4 -4
- package/dist/src/tools/vm-action.d.ts +8 -8
- package/dist/src/tools/vm-cleanup.d.ts +1 -1
- package/dist/src/worker-adapter.d.ts +10 -0
- package/dist/src/worker-adapter.d.ts.map +1 -0
- package/dist/src/worker-adapter.js +94 -0
- package/dist/src/worker-adapter.js.map +1 -0
- package/dist/src/worker.d.ts +36 -0
- package/dist/src/worker.d.ts.map +1 -0
- package/dist/src/worker.js +151 -0
- package/dist/src/worker.js.map +1 -0
- package/package.json +13 -4
|
@@ -127,15 +127,15 @@ export declare const VmActionInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
127
127
|
timeoutSeconds: z.ZodOptional<z.ZodNumber>;
|
|
128
128
|
format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["table", "json"]>>>;
|
|
129
129
|
}, "strip", z.ZodTypeAny, {
|
|
130
|
-
action: "config" | "start" | "stop" | "reboot" | "shutdown" | "reset" | "suspend" | "resume" | "
|
|
130
|
+
action: "status" | "config" | "start" | "stop" | "reboot" | "shutdown" | "reset" | "suspend" | "resume" | "destroy" | "clone";
|
|
131
131
|
format: "table" | "json";
|
|
132
132
|
apply: boolean;
|
|
133
133
|
force: boolean;
|
|
134
134
|
ackUntracked: boolean;
|
|
135
135
|
ackManualCleanup: boolean;
|
|
136
|
+
reason?: string | undefined;
|
|
136
137
|
host?: string | undefined;
|
|
137
138
|
vmid?: string | number | undefined;
|
|
138
|
-
reason?: string | undefined;
|
|
139
139
|
timeoutSeconds?: number | undefined;
|
|
140
140
|
hostAssetId?: string | undefined;
|
|
141
141
|
assetId?: string | undefined;
|
|
@@ -162,11 +162,11 @@ export declare const VmActionInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
162
162
|
macAddress?: string | undefined;
|
|
163
163
|
} | undefined;
|
|
164
164
|
}, {
|
|
165
|
-
action: "config" | "start" | "stop" | "reboot" | "shutdown" | "reset" | "suspend" | "resume" | "
|
|
165
|
+
action: "status" | "config" | "start" | "stop" | "reboot" | "shutdown" | "reset" | "suspend" | "resume" | "destroy" | "clone";
|
|
166
|
+
reason?: string | undefined;
|
|
166
167
|
host?: string | undefined;
|
|
167
168
|
vmid?: string | number | undefined;
|
|
168
169
|
format?: "table" | "json" | undefined;
|
|
169
|
-
reason?: string | undefined;
|
|
170
170
|
timeoutSeconds?: number | undefined;
|
|
171
171
|
hostAssetId?: string | undefined;
|
|
172
172
|
assetId?: string | undefined;
|
|
@@ -197,15 +197,15 @@ export declare const VmActionInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
197
197
|
macAddress?: string | undefined;
|
|
198
198
|
} | undefined;
|
|
199
199
|
}>, {
|
|
200
|
-
action: "config" | "start" | "stop" | "reboot" | "shutdown" | "reset" | "suspend" | "resume" | "
|
|
200
|
+
action: "status" | "config" | "start" | "stop" | "reboot" | "shutdown" | "reset" | "suspend" | "resume" | "destroy" | "clone";
|
|
201
201
|
format: "table" | "json";
|
|
202
202
|
apply: boolean;
|
|
203
203
|
force: boolean;
|
|
204
204
|
ackUntracked: boolean;
|
|
205
205
|
ackManualCleanup: boolean;
|
|
206
|
+
reason?: string | undefined;
|
|
206
207
|
host?: string | undefined;
|
|
207
208
|
vmid?: string | number | undefined;
|
|
208
|
-
reason?: string | undefined;
|
|
209
209
|
timeoutSeconds?: number | undefined;
|
|
210
210
|
hostAssetId?: string | undefined;
|
|
211
211
|
assetId?: string | undefined;
|
|
@@ -232,11 +232,11 @@ export declare const VmActionInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
232
232
|
macAddress?: string | undefined;
|
|
233
233
|
} | undefined;
|
|
234
234
|
}, {
|
|
235
|
-
action: "config" | "start" | "stop" | "reboot" | "shutdown" | "reset" | "suspend" | "resume" | "
|
|
235
|
+
action: "status" | "config" | "start" | "stop" | "reboot" | "shutdown" | "reset" | "suspend" | "resume" | "destroy" | "clone";
|
|
236
|
+
reason?: string | undefined;
|
|
236
237
|
host?: string | undefined;
|
|
237
238
|
vmid?: string | number | undefined;
|
|
238
239
|
format?: "table" | "json" | undefined;
|
|
239
|
-
reason?: string | undefined;
|
|
240
240
|
timeoutSeconds?: number | undefined;
|
|
241
241
|
hostAssetId?: string | undefined;
|
|
242
242
|
assetId?: string | undefined;
|
|
@@ -87,9 +87,9 @@ export declare const CleanupExpiredVmsInputSchema: z.ZodObject<{
|
|
|
87
87
|
warnHours?: number | undefined;
|
|
88
88
|
outputFile?: string | undefined;
|
|
89
89
|
}, {
|
|
90
|
+
reason?: string | undefined;
|
|
90
91
|
dryRun?: boolean | undefined;
|
|
91
92
|
format?: "table" | "json" | undefined;
|
|
92
|
-
reason?: string | undefined;
|
|
93
93
|
hostAssetId?: string | undefined;
|
|
94
94
|
apply?: boolean | undefined;
|
|
95
95
|
artifactReceipt?: string | undefined;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal adapter bridging v1 MCP tool registration (`server.tool(...)`)
|
|
3
|
+
* onto v2 `@modelcontextprotocol/server` (`server.registerTool(...)`).
|
|
4
|
+
*/
|
|
5
|
+
export interface UniversalToolServer {
|
|
6
|
+
tool(name: string, ...args: any[]): void;
|
|
7
|
+
registerTool(name: string, config: any, handler: any): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function createUniversalAdapter(server: any): UniversalToolServer;
|
|
10
|
+
//# sourceMappingURL=worker-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-adapter.d.ts","sourceRoot":"","sources":["../../src/worker-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACzC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;CAC7D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,mBAAmB,CA4FvE"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal adapter bridging v1 MCP tool registration (`server.tool(...)`)
|
|
3
|
+
* onto v2 `@modelcontextprotocol/server` (`server.registerTool(...)`).
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
7
|
+
import { fromJsonSchema } from '@modelcontextprotocol/server';
|
|
8
|
+
export function createUniversalAdapter(server) {
|
|
9
|
+
const adapter = {
|
|
10
|
+
registerTool(name, config, handler) {
|
|
11
|
+
let inputSchema = config?.inputSchema;
|
|
12
|
+
if (inputSchema && typeof inputSchema === 'object' && '_def' in inputSchema) {
|
|
13
|
+
const jsonSchema = zodToJsonSchema(inputSchema, { target: 'openApi3' });
|
|
14
|
+
inputSchema = fromJsonSchema(jsonSchema);
|
|
15
|
+
}
|
|
16
|
+
else if (inputSchema && typeof inputSchema === 'object' && !('type' in inputSchema) && !('$ref' in inputSchema)) {
|
|
17
|
+
const jsonSchema = zodToJsonSchema(z.object(inputSchema), { target: 'openApi3' });
|
|
18
|
+
inputSchema = fromJsonSchema(jsonSchema);
|
|
19
|
+
}
|
|
20
|
+
else if (inputSchema && typeof inputSchema === 'object') {
|
|
21
|
+
inputSchema = fromJsonSchema(inputSchema);
|
|
22
|
+
}
|
|
23
|
+
server.registerTool(name, {
|
|
24
|
+
description: config?.description || '',
|
|
25
|
+
inputSchema,
|
|
26
|
+
}, async (toolArgs) => {
|
|
27
|
+
try {
|
|
28
|
+
return await handler(toolArgs);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
return {
|
|
32
|
+
isError: true,
|
|
33
|
+
content: [
|
|
34
|
+
{
|
|
35
|
+
type: 'text',
|
|
36
|
+
text: err instanceof Error ? err.message : String(err),
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
tool(name, ...args) {
|
|
44
|
+
let description = '';
|
|
45
|
+
let schema = {};
|
|
46
|
+
let cb;
|
|
47
|
+
if (args.length === 1) {
|
|
48
|
+
cb = args[0];
|
|
49
|
+
}
|
|
50
|
+
else if (args.length === 2) {
|
|
51
|
+
if (typeof args[0] === 'string') {
|
|
52
|
+
description = args[0];
|
|
53
|
+
cb = args[1];
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
schema = args[0];
|
|
57
|
+
cb = args[1];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (args.length === 3) {
|
|
61
|
+
description = args[0];
|
|
62
|
+
schema = args[1];
|
|
63
|
+
cb = args[2];
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new Error(`Unexpected argument count ${args.length} for tool ${name}`);
|
|
67
|
+
}
|
|
68
|
+
// If schema is a raw shape object rather than a Zod schema instance, wrap with z.object()
|
|
69
|
+
const zodSchema = schema && typeof schema === 'object' && !('_def' in schema)
|
|
70
|
+
? z.object(schema)
|
|
71
|
+
: (schema || z.object({}));
|
|
72
|
+
const jsonSchema = zodToJsonSchema(zodSchema, { target: 'openApi3' });
|
|
73
|
+
const inputSchema = fromJsonSchema(jsonSchema);
|
|
74
|
+
server.registerTool(name, { description, inputSchema }, async (toolArgs) => {
|
|
75
|
+
try {
|
|
76
|
+
return await cb(toolArgs);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
return {
|
|
80
|
+
isError: true,
|
|
81
|
+
content: [
|
|
82
|
+
{
|
|
83
|
+
type: 'text',
|
|
84
|
+
text: err instanceof Error ? err.message : String(err),
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
return adapter;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=worker-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-adapter.js","sourceRoot":"","sources":["../../src/worker-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers entrypoint: stateless streamable-HTTP MCP (spec 2026-07-28)
|
|
3
|
+
* for Call Telemetry Lab MCP Server (ct-lab-mcp).
|
|
4
|
+
*
|
|
5
|
+
* One MCP server instance is created per request by `createMcpHandler`; there is
|
|
6
|
+
* no session map, so any isolate can serve any request.
|
|
7
|
+
*/
|
|
8
|
+
import { McpServer } from '@modelcontextprotocol/server';
|
|
9
|
+
import { type AccessEnv } from './access-auth.js';
|
|
10
|
+
export declare const SERVER_NAME = "ct-lab-mcp";
|
|
11
|
+
export declare const SERVER_VERSION: string;
|
|
12
|
+
export interface Env extends AccessEnv {
|
|
13
|
+
MCP_BASE_PATH?: string;
|
|
14
|
+
LAB_PROXMOX_URL?: string;
|
|
15
|
+
LAB_PROXMOX_USERNAME?: string;
|
|
16
|
+
LAB_PROXMOX_PASSWORD?: string;
|
|
17
|
+
LAB_PROXMOX_REALM?: string;
|
|
18
|
+
LAB_PROXMOX_MINIS_URL?: string;
|
|
19
|
+
LAB_PROXMOX_MINIS_USERNAME?: string;
|
|
20
|
+
LAB_PROXMOX_MINIS_PASSWORD?: string;
|
|
21
|
+
LAB_PROXMOX_MINIS_REALM?: string;
|
|
22
|
+
LAB_VM_CREDENTIALS_USERNAME?: string;
|
|
23
|
+
LAB_VM_CREDENTIALS_PASSWORD?: string;
|
|
24
|
+
ALLOW_ESXI_SLOTS?: string;
|
|
25
|
+
ESXI_SCAN?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function createWorkerServer(env: Env): McpServer;
|
|
28
|
+
export interface WorkerExecutionContext {
|
|
29
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
30
|
+
passThroughOnException?(): void;
|
|
31
|
+
}
|
|
32
|
+
declare const _default: {
|
|
33
|
+
fetch(request: Request, env: Env, ctx: WorkerExecutionContext): Promise<Response>;
|
|
34
|
+
};
|
|
35
|
+
export default _default;
|
|
36
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAehE,eAAO,MAAM,WAAW,eAAe,CAAC;AACxC,eAAO,MAAM,cAAc,QAA8B,CAAC;AAE1D,MAAM,WAAW,GAAI,SAAQ,SAAS;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CA0FtD;AASD,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C,sBAAsB,CAAC,IAAI,IAAI,CAAC;CACjC;;mBAGsB,OAAO,OAAO,GAAG,OAAO,sBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC;;AADzF,wBAsDE"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers entrypoint: stateless streamable-HTTP MCP (spec 2026-07-28)
|
|
3
|
+
* for Call Telemetry Lab MCP Server (ct-lab-mcp).
|
|
4
|
+
*
|
|
5
|
+
* One MCP server instance is created per request by `createMcpHandler`; there is
|
|
6
|
+
* no session map, so any isolate can serve any request.
|
|
7
|
+
*/
|
|
8
|
+
import { McpServer } from '@modelcontextprotocol/server';
|
|
9
|
+
import { createMcpHandler } from 'agents/mcp/server';
|
|
10
|
+
import { verifyAccess } from './access-auth.js';
|
|
11
|
+
import { agentOf } from './agent.js';
|
|
12
|
+
import { createUniversalAdapter } from './worker-adapter.js';
|
|
13
|
+
import { registerAllTools } from './tools/index.js';
|
|
14
|
+
import { MultiHypervisorManager } from './hypervisors/manager.js';
|
|
15
|
+
import { SlotManager } from './slot/manager.js';
|
|
16
|
+
import { defaultSafetyGuardrailEngine } from './guardrails/safety.js';
|
|
17
|
+
import { mockApplianceExecutor } from './appliance/mock.js';
|
|
18
|
+
import { RUNTIME_VERSION } from './provenance.js';
|
|
19
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
20
|
+
process.env.CLOUDFLARE_WORKER = '1';
|
|
21
|
+
}
|
|
22
|
+
export const SERVER_NAME = 'ct-lab-mcp';
|
|
23
|
+
export const SERVER_VERSION = RUNTIME_VERSION || '0.8.85';
|
|
24
|
+
export function createWorkerServer(env) {
|
|
25
|
+
const v2Server = new McpServer({
|
|
26
|
+
name: SERVER_NAME,
|
|
27
|
+
version: SERVER_VERSION,
|
|
28
|
+
});
|
|
29
|
+
const proxmoxUrl = (env.LAB_PROXMOX_URL || 'https://lab-pve.calltelemetry.com').replace(/\/+$/, '');
|
|
30
|
+
const proxmoxUsername = env.LAB_PROXMOX_USERNAME || 'root';
|
|
31
|
+
const proxmoxPassword = env.LAB_PROXMOX_PASSWORD || 'T3klinks!';
|
|
32
|
+
const proxmoxRealm = env.LAB_PROXMOX_REALM || 'pam';
|
|
33
|
+
const proxmoxLabConfig = {
|
|
34
|
+
id: 'proxmox-lab',
|
|
35
|
+
name: 'Proxmox VE Lab Cluster',
|
|
36
|
+
baseUrl: proxmoxUrl,
|
|
37
|
+
nodeName: 'proxmox',
|
|
38
|
+
slotSizeMb: 8192,
|
|
39
|
+
allowInsecureTls: true,
|
|
40
|
+
auth: {
|
|
41
|
+
type: 'ticket',
|
|
42
|
+
username: proxmoxUsername,
|
|
43
|
+
password: proxmoxPassword,
|
|
44
|
+
realm: proxmoxRealm,
|
|
45
|
+
},
|
|
46
|
+
protectedVmids: [100, 101, 102, 104],
|
|
47
|
+
isMock: false,
|
|
48
|
+
};
|
|
49
|
+
const proxmoxConfigs = [proxmoxLabConfig];
|
|
50
|
+
if (env.LAB_PROXMOX_MINIS_URL) {
|
|
51
|
+
proxmoxConfigs.push({
|
|
52
|
+
id: 'proxmox-mini',
|
|
53
|
+
name: 'Proxmox VE Minisforum (64GB)',
|
|
54
|
+
baseUrl: env.LAB_PROXMOX_MINIS_URL.replace(/\/+$/, ''),
|
|
55
|
+
nodeName: 'proxmox-minis',
|
|
56
|
+
slotSizeMb: 8192,
|
|
57
|
+
allowInsecureTls: true,
|
|
58
|
+
auth: {
|
|
59
|
+
type: 'ticket',
|
|
60
|
+
username: env.LAB_PROXMOX_MINIS_USERNAME || proxmoxUsername,
|
|
61
|
+
password: env.LAB_PROXMOX_MINIS_PASSWORD || proxmoxPassword,
|
|
62
|
+
realm: env.LAB_PROXMOX_MINIS_REALM || proxmoxRealm,
|
|
63
|
+
},
|
|
64
|
+
protectedVmids: [182],
|
|
65
|
+
isMock: false,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const credentials = {
|
|
69
|
+
tier: 'direct_env',
|
|
70
|
+
hosts: proxmoxConfigs,
|
|
71
|
+
proxmoxHosts: proxmoxConfigs,
|
|
72
|
+
esxiHosts: [],
|
|
73
|
+
vmCredentials: {
|
|
74
|
+
username: env.LAB_VM_CREDENTIALS_USERNAME || 'admin',
|
|
75
|
+
password: env.LAB_VM_CREDENTIALS_PASSWORD || '',
|
|
76
|
+
port: 2222,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
const guardrailEngine = defaultSafetyGuardrailEngine;
|
|
80
|
+
const hypervisorManager = new MultiHypervisorManager({
|
|
81
|
+
proxmoxConfigs,
|
|
82
|
+
esxiConfigs: [],
|
|
83
|
+
safetyEngine: guardrailEngine,
|
|
84
|
+
forceMock: false,
|
|
85
|
+
});
|
|
86
|
+
const slotManager = new SlotManager({
|
|
87
|
+
hypervisorManager,
|
|
88
|
+
guardrailEngine,
|
|
89
|
+
includeEsxi: false,
|
|
90
|
+
});
|
|
91
|
+
const context = {
|
|
92
|
+
slotManager,
|
|
93
|
+
hypervisorManager,
|
|
94
|
+
guardrailEngine,
|
|
95
|
+
applianceExecutor: mockApplianceExecutor,
|
|
96
|
+
credentials,
|
|
97
|
+
mockPermitted: false,
|
|
98
|
+
plane: 'local-sse',
|
|
99
|
+
};
|
|
100
|
+
const adapter = createUniversalAdapter(v2Server);
|
|
101
|
+
registerAllTools(adapter, context);
|
|
102
|
+
return v2Server;
|
|
103
|
+
}
|
|
104
|
+
function json(status, body) {
|
|
105
|
+
return new Response(JSON.stringify(body), {
|
|
106
|
+
status,
|
|
107
|
+
headers: { 'Content-Type': 'application/json' },
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
export default {
|
|
111
|
+
async fetch(request, env, ctx) {
|
|
112
|
+
const base = (env.MCP_BASE_PATH ?? '/ct_lab').replace(/\/+$/, '');
|
|
113
|
+
const { pathname } = new URL(request.url);
|
|
114
|
+
if (pathname === `${base}/healthz` ||
|
|
115
|
+
pathname === '/healthz' ||
|
|
116
|
+
pathname === `${base}/health` ||
|
|
117
|
+
pathname === '/health') {
|
|
118
|
+
return json(200, {
|
|
119
|
+
status: 'ok',
|
|
120
|
+
service: SERVER_NAME,
|
|
121
|
+
version: SERVER_VERSION,
|
|
122
|
+
transport: 'streamable-http',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (pathname !== `${base}/mcp`)
|
|
126
|
+
return json(404, { error: 'not found' });
|
|
127
|
+
const access = await verifyAccess(request, env);
|
|
128
|
+
if (!access.ok) {
|
|
129
|
+
console.log(JSON.stringify({
|
|
130
|
+
event: 'mcp_access_denied',
|
|
131
|
+
server: SERVER_NAME,
|
|
132
|
+
status: access.status,
|
|
133
|
+
reason: access.reason,
|
|
134
|
+
}));
|
|
135
|
+
return json(access.status, { error: access.reason });
|
|
136
|
+
}
|
|
137
|
+
const agent = await agentOf(request.headers);
|
|
138
|
+
console.log(JSON.stringify({
|
|
139
|
+
event: 'mcp_access',
|
|
140
|
+
server: SERVER_NAME,
|
|
141
|
+
identity: access.identity ?? 'unknown',
|
|
142
|
+
kind: access.kind ?? 'unknown',
|
|
143
|
+
agent,
|
|
144
|
+
method: request.method,
|
|
145
|
+
mcp_method: request.headers.get('Mcp-Method'),
|
|
146
|
+
tool: request.headers.get('Mcp-Name'),
|
|
147
|
+
}));
|
|
148
|
+
return createMcpHandler(() => createWorkerServer(env), { route: `${base}/mcp` })(request, env, ctx);
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAkB,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAoB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,IAAI,QAAQ,CAAC;AAkB1D,MAAM,UAAU,kBAAkB,CAAC,GAAQ;IACzC,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC;QAC7B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,mCAAmC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpG,MAAM,eAAe,GAAG,GAAG,CAAC,oBAAoB,IAAI,MAAM,CAAC;IAC3D,MAAM,eAAe,GAAG,GAAG,CAAC,oBAAoB,IAAI,WAAW,CAAC;IAChE,MAAM,YAAY,GAAG,GAAG,CAAC,iBAAiB,IAAI,KAAK,CAAC;IAEpD,MAAM,gBAAgB,GAAsB;QAC1C,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,IAAI;QAChB,gBAAgB,EAAE,IAAI;QACtB,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,eAAe;YACzB,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,YAAY;SACpB;QACD,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACpC,MAAM,EAAE,KAAK;KACd,CAAC;IAEF,MAAM,cAAc,GAAwB,CAAC,gBAAgB,CAAC,CAAC;IAE/D,IAAI,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAC9B,cAAc,CAAC,IAAI,CAAC;YAClB,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtD,QAAQ,EAAE,eAAe;YACzB,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,GAAG,CAAC,0BAA0B,IAAI,eAAe;gBAC3D,QAAQ,EAAE,GAAG,CAAC,0BAA0B,IAAI,eAAe;gBAC3D,KAAK,EAAE,GAAG,CAAC,uBAAuB,IAAI,YAAY;aACnD;YACD,cAAc,EAAE,CAAC,GAAG,CAAC;YACrB,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAA+B;QAC9C,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,cAAc;QACrB,YAAY,EAAE,cAAc;QAC5B,SAAS,EAAE,EAAE;QACb,aAAa,EAAE;YACb,QAAQ,EAAE,GAAG,CAAC,2BAA2B,IAAI,OAAO;YACpD,QAAQ,EAAE,GAAG,CAAC,2BAA2B,IAAI,EAAE;YAC/C,IAAI,EAAE,IAAI;SACX;KACF,CAAC;IAEF,MAAM,eAAe,GAAG,4BAA4B,CAAC;IAErD,MAAM,iBAAiB,GAAG,IAAI,sBAAsB,CAAC;QACnD,cAAc;QACd,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,eAAe;QAC7B,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,iBAAiB;QACjB,eAAe;QACf,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAgB;QAC3B,WAAW;QACX,iBAAiB;QACjB,eAAe;QACf,iBAAiB,EAAE,qBAAqB;QACxC,WAAW;QACX,aAAa,EAAE,KAAK;QACpB,KAAK,EAAE,WAAW;KACnB,CAAC;IAEF,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjD,gBAAgB,CAAC,OAAc,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,IAAI,CAAC,MAAc,EAAE,IAAa;IACzC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAOD,eAAe;IACb,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,GAAQ,EAAE,GAA2B;QACjE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE1C,IACE,QAAQ,KAAK,GAAG,IAAI,UAAU;YAC9B,QAAQ,KAAK,UAAU;YACvB,QAAQ,KAAK,GAAG,IAAI,SAAS;YAC7B,QAAQ,KAAK,SAAS,EACtB,CAAC;YACD,OAAO,IAAI,CAAC,GAAG,EAAE;gBACf,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,cAAc;gBACvB,SAAS,EAAE,iBAAiB;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,KAAK,GAAG,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,mBAAmB;gBAC1B,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CACH,CAAC;YACF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC;YACb,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;YACtC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS;YAC9B,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YAC7C,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;SACtC,CAAC,CACH,CAAC;QAEF,OAAO,gBAAgB,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,MAAM,EAAE,CAAC,CAC9E,OAAO,EACP,GAAG,EACH,GAAY,CACb,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@calltelemetry/ct-lab-mcp",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.87",
|
|
4
4
|
"description": "Expanded Model Context Protocol (MCP) server for Call Telemetry lab, fleet, and appliance management across Proxmox VE and VMware ESXi.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
@@ -24,7 +24,10 @@
|
|
|
24
24
|
"test:coverage": "vitest run --coverage",
|
|
25
25
|
"prepack": "npm run build",
|
|
26
26
|
"prepublishOnly": "npm run build",
|
|
27
|
-
"start": "node dist/bin/ct-lab-mcp.js"
|
|
27
|
+
"start": "node dist/bin/ct-lab-mcp.js",
|
|
28
|
+
"dev:worker": "wrangler dev --env development",
|
|
29
|
+
"deploy:worker": "wrangler deploy",
|
|
30
|
+
"build:worker": "wrangler deploy --dry-run --outdir dist-worker"
|
|
28
31
|
},
|
|
29
32
|
"publishConfig": {
|
|
30
33
|
"access": "public"
|
|
@@ -54,15 +57,20 @@
|
|
|
54
57
|
"license": "MIT",
|
|
55
58
|
"dependencies": {
|
|
56
59
|
"@modelcontextprotocol/sdk": "^1.6.0",
|
|
60
|
+
"@modelcontextprotocol/server": "2.0.0",
|
|
61
|
+
"agents": "^0.28.0",
|
|
57
62
|
"commander": "^13.1.0",
|
|
58
63
|
"dotenv": "^16.4.7",
|
|
59
64
|
"express": "^4.21.2",
|
|
65
|
+
"jose": "^6.2.12",
|
|
60
66
|
"js-yaml": "^5.3.0",
|
|
61
67
|
"ssh2": "^1.16.0",
|
|
62
68
|
"undici": "^7.4.0",
|
|
63
|
-
"zod": "^3.24.2"
|
|
69
|
+
"zod": "^3.24.2",
|
|
70
|
+
"zod-to-json-schema": "^3.25.2"
|
|
64
71
|
},
|
|
65
72
|
"devDependencies": {
|
|
73
|
+
"@cloudflare/workers-types": "^5.20261010.1",
|
|
66
74
|
"@types/express": "^5.0.0",
|
|
67
75
|
"@types/js-yaml": "^4.0.9",
|
|
68
76
|
"@types/node": "^22.13.5",
|
|
@@ -71,7 +79,8 @@
|
|
|
71
79
|
"ajv": "^8.20.0",
|
|
72
80
|
"tsx": "^4.19.3",
|
|
73
81
|
"typescript": "^5.7.3",
|
|
74
|
-
"vitest": "^3.0.7"
|
|
82
|
+
"vitest": "^3.0.7",
|
|
83
|
+
"wrangler": "^4.149.0"
|
|
75
84
|
},
|
|
76
85
|
"engines": {
|
|
77
86
|
"node": ">=20.0.0"
|