@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.
Files changed (53) hide show
  1. package/README.md +1 -0
  2. package/dist/src/access-auth.d.ts +19 -0
  3. package/dist/src/access-auth.d.ts.map +1 -0
  4. package/dist/src/access-auth.js +52 -0
  5. package/dist/src/access-auth.js.map +1 -0
  6. package/dist/src/agent.d.ts +7 -0
  7. package/dist/src/agent.d.ts.map +1 -0
  8. package/dist/src/agent.js +14 -0
  9. package/dist/src/agent.js.map +1 -0
  10. package/dist/src/provenance.d.ts.map +1 -1
  11. package/dist/src/provenance.js +24 -15
  12. package/dist/src/provenance.js.map +1 -1
  13. package/dist/src/proxmox/client.d.ts.map +1 -1
  14. package/dist/src/proxmox/client.js +36 -10
  15. package/dist/src/proxmox/client.js.map +1 -1
  16. package/dist/src/tools/appliance-candidate-retire.d.ts +6 -6
  17. package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -1
  18. package/dist/src/tools/appliance-claim-tools.js +57 -181
  19. package/dist/src/tools/appliance-claim-tools.js.map +1 -1
  20. package/dist/src/tools/appliance-exec.d.ts +2 -2
  21. package/dist/src/tools/canonical-guard.d.ts +1 -1
  22. package/dist/src/tools/claim-creation-projection.d.ts.map +1 -1
  23. package/dist/src/tools/claim-creation-projection.js +14 -4
  24. package/dist/src/tools/claim-creation-projection.js.map +1 -1
  25. package/dist/src/tools/cucm-emulator-tool.d.ts +2 -2
  26. package/dist/src/tools/factory-reset.d.ts +2 -2
  27. package/dist/src/tools/kubernetes-backend.d.ts +32 -0
  28. package/dist/src/tools/kubernetes-backend.d.ts.map +1 -0
  29. package/dist/src/tools/kubernetes-backend.js +156 -0
  30. package/dist/src/tools/kubernetes-backend.js.map +1 -0
  31. package/dist/src/tools/lab-dev.d.ts +2 -2
  32. package/dist/src/tools/license-tools.d.ts +4 -4
  33. package/dist/src/tools/list-inventory.d.ts +1 -1
  34. package/dist/src/tools/renewal-claim.d.ts.map +1 -1
  35. package/dist/src/tools/renewal-claim.js +4 -6
  36. package/dist/src/tools/renewal-claim.js.map +1 -1
  37. package/dist/src/tools/server-management.d.ts +2 -2
  38. package/dist/src/tools/slot-kubernetes.d.ts +0 -2
  39. package/dist/src/tools/slot-kubernetes.d.ts.map +1 -1
  40. package/dist/src/tools/slot-kubernetes.js +21 -49
  41. package/dist/src/tools/slot-kubernetes.js.map +1 -1
  42. package/dist/src/tools/slot-tools.d.ts +4 -4
  43. package/dist/src/tools/vm-action.d.ts +8 -8
  44. package/dist/src/tools/vm-cleanup.d.ts +1 -1
  45. package/dist/src/worker-adapter.d.ts +10 -0
  46. package/dist/src/worker-adapter.d.ts.map +1 -0
  47. package/dist/src/worker-adapter.js +94 -0
  48. package/dist/src/worker-adapter.js.map +1 -0
  49. package/dist/src/worker.d.ts +36 -0
  50. package/dist/src/worker.d.ts.map +1 -0
  51. package/dist/src/worker.js +151 -0
  52. package/dist/src/worker.js.map +1 -0
  53. 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" | "status" | "destroy" | "clone";
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" | "status" | "destroy" | "clone";
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" | "status" | "destroy" | "clone";
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" | "status" | "destroy" | "clone";
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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calltelemetry/ct-lab-mcp",
3
- "version": "0.8.85",
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"