@calltelemetry/ct-lab-mcp 0.8.49 → 0.8.51

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 (35) hide show
  1. package/README.md +11 -0
  2. package/dist/src/appliance/commands.d.ts.map +1 -1
  3. package/dist/src/appliance/commands.js +39 -0
  4. package/dist/src/appliance/commands.js.map +1 -1
  5. package/dist/src/appliance/types.d.ts +4 -1
  6. package/dist/src/appliance/types.d.ts.map +1 -1
  7. package/dist/src/appliance/types.js.map +1 -1
  8. package/dist/src/hypervisors/esxi/client.d.ts.map +1 -1
  9. package/dist/src/hypervisors/esxi/client.js +29 -15
  10. package/dist/src/hypervisors/esxi/client.js.map +1 -1
  11. package/dist/src/tools/appliance-claim-tools.d.ts +188 -0
  12. package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -0
  13. package/dist/src/tools/appliance-claim-tools.js +365 -0
  14. package/dist/src/tools/appliance-claim-tools.js.map +1 -0
  15. package/dist/src/tools/appliance-id.d.ts +33 -0
  16. package/dist/src/tools/appliance-id.d.ts.map +1 -0
  17. package/dist/src/tools/appliance-id.js +88 -0
  18. package/dist/src/tools/appliance-id.js.map +1 -0
  19. package/dist/src/tools/index.d.ts +4 -0
  20. package/dist/src/tools/index.d.ts.map +1 -1
  21. package/dist/src/tools/index.js +41 -1
  22. package/dist/src/tools/index.js.map +1 -1
  23. package/dist/src/tools/license-tools.d.ts +88 -0
  24. package/dist/src/tools/license-tools.d.ts.map +1 -1
  25. package/dist/src/tools/license-tools.js +253 -0
  26. package/dist/src/tools/license-tools.js.map +1 -1
  27. package/dist/src/tools/sideload-runner.d.ts +56 -0
  28. package/dist/src/tools/sideload-runner.d.ts.map +1 -0
  29. package/dist/src/tools/sideload-runner.js +175 -0
  30. package/dist/src/tools/sideload-runner.js.map +1 -0
  31. package/dist/src/tools/verify-demo.d.ts +125 -0
  32. package/dist/src/tools/verify-demo.d.ts.map +1 -0
  33. package/dist/src/tools/verify-demo.js +435 -0
  34. package/dist/src/tools/verify-demo.js.map +1 -0
  35. package/package.json +1 -1
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Automated 5-Point Demo Verification Gate MCP Tool
3
+ *
4
+ * Runs an automated 5-point verification check against a target CallTelemetry appliance
5
+ * to certify demo readiness before handing off to customers or UAT:
6
+ * 1. API & Session Authentication (POST /api/session)
7
+ * 2. Active License & Tier Gate (GET /api/org/:id/settings)
8
+ * 3. CUBE Trunks & Voice Gateways (GET /api/cubes or /api/org/:id/cubes)
9
+ * 4. Phone Registrations & RTP Endpoints (GET /api/phones or /api/org/:id/phones)
10
+ * 5. Call Records, CDR Processing & Analytics (GET /api/calls or /api/org/:id/calls)
11
+ */
12
+ import { z } from "zod";
13
+ import { Agent, fetch } from "undici";
14
+ import { ProxmoxErrorCode, createToolErrorResult } from "../types/mcp.js";
15
+ import { logger } from "../utils/logger.js";
16
+ import { defaultRedactor } from "../utils/redactor.js";
17
+ import { telemetry } from "../telemetry/registry.js";
18
+ const insecureAgent = new Agent({
19
+ connect: {
20
+ rejectUnauthorized: false
21
+ }
22
+ });
23
+ export const ExpectedMetricsSchema = z.object({
24
+ minCubes: z.number().int().min(0).optional().default(1).describe("Minimum expected CUBEs configured (default: 1)."),
25
+ minPhones: z.number().int().min(0).optional().default(1).describe("Minimum expected phone endpoints (default: 1)."),
26
+ minCalls: z.number().int().min(0).optional().default(1).describe("Minimum expected processed call records (default: 1)."),
27
+ requireActiveLicense: z.boolean().optional().default(true).describe("Whether an active non-expired license is required (default: true).")
28
+ });
29
+ export const VerifyApplianceDemoInputShape = {
30
+ targetIp: z
31
+ .string()
32
+ .min(1)
33
+ .describe("Target IP address or hostname of the Call Telemetry appliance (e.g. '192.168.124.221')."),
34
+ port: z
35
+ .number()
36
+ .int()
37
+ .min(1)
38
+ .max(65535)
39
+ .optional()
40
+ .default(443)
41
+ .describe("HTTPS port (default: 443)."),
42
+ email: z
43
+ .string()
44
+ .optional()
45
+ .default("demo@calltelemetry.com")
46
+ .describe("Admin email for authentication (default: 'demo@calltelemetry.com')."),
47
+ password: z
48
+ .string()
49
+ .optional()
50
+ .default("demo")
51
+ .describe("Admin password for authentication (default: 'demo')."),
52
+ orgId: z
53
+ .number()
54
+ .int()
55
+ .positive()
56
+ .optional()
57
+ .default(1)
58
+ .describe("Appliance organization ID (default: 1)."),
59
+ expectedMetrics: ExpectedMetricsSchema.optional().default({}),
60
+ timeoutMs: z
61
+ .number()
62
+ .int()
63
+ .min(2000)
64
+ .max(60000)
65
+ .optional()
66
+ .default(15000)
67
+ .describe("Request timeout in milliseconds (default: 15000).")
68
+ };
69
+ export const VerifyApplianceDemoInputSchema = z.object(VerifyApplianceDemoInputShape);
70
+ export async function handleVerifyApplianceDemo(args, _context) {
71
+ const parsed = VerifyApplianceDemoInputSchema.safeParse(args);
72
+ if (!parsed.success) {
73
+ const issues = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
74
+ return createToolErrorResult(ProxmoxErrorCode.VALIDATION_ERROR, issues);
75
+ }
76
+ const { targetIp, port, email, password, orgId, expectedMetrics, timeoutMs } = parsed.data;
77
+ let baseUrl = targetIp.trim();
78
+ if (!baseUrl.startsWith("http://") && !baseUrl.startsWith("https://")) {
79
+ baseUrl = port === 443 ? `https://${baseUrl}` : `https://${baseUrl}:${port}`;
80
+ }
81
+ baseUrl = baseUrl.replace(/\/+$/, "");
82
+ logger.info(`Running 5-point demo verification on ${baseUrl}...`);
83
+ const report = {
84
+ readyForDemo: false,
85
+ targetIp,
86
+ score: "0/5",
87
+ checks: {
88
+ apiAuth: { passed: false, message: "Not checked" },
89
+ license: { passed: false, message: "Not checked" },
90
+ cubes: { passed: false, message: "Not checked" },
91
+ phones: { passed: false, message: "Not checked" },
92
+ callRecords: { passed: false, message: "Not checked" }
93
+ },
94
+ issues: []
95
+ };
96
+ const authHeaders = { "Content-Type": "application/json" };
97
+ // Candidate credentials to attempt
98
+ const credentialsToTry = [
99
+ { email, password },
100
+ { email: process.env.CT_TEST_USER_EMAIL || "demo@calltelemetry.com", password: process.env.CT_TEST_USER_PASSWORD || "demo" },
101
+ { email: "admin@calltelemetry.com", password: "Password123!" },
102
+ { email: "admin@calltelemetry.com", password: "calltelemetry" },
103
+ { email: "test@calltelemetry.com", password: "Password123!" }
104
+ ];
105
+ try {
106
+ // -------------------------------------------------------------
107
+ // Gate 1: API & Session Authentication Check
108
+ // -------------------------------------------------------------
109
+ let authenticated = false;
110
+ let authError = "";
111
+ const sessionUrl = `${baseUrl}/api/session`;
112
+ for (const cred of credentialsToTry) {
113
+ try {
114
+ const sessionRes = await fetch(sessionUrl, {
115
+ method: "POST",
116
+ headers: { "Content-Type": "application/json" },
117
+ body: JSON.stringify({ user: { email: cred.email, password: cred.password } }),
118
+ dispatcher: insecureAgent,
119
+ signal: AbortSignal.timeout(Math.min(timeoutMs, 5000))
120
+ });
121
+ if (sessionRes.status === 200 || sessionRes.ok) {
122
+ const sessionData = (await sessionRes.json().catch(() => ({})));
123
+ const accessToken = sessionData?.access_token || sessionData?.data?.access_token || sessionData?.token;
124
+ const setCookie = sessionRes.headers.get("set-cookie") || "";
125
+ const sessionCookie = setCookie.split(";")[0];
126
+ if (sessionCookie)
127
+ authHeaders["Cookie"] = sessionCookie;
128
+ if (accessToken) {
129
+ authHeaders["Authorization"] = `Bearer ${accessToken}`;
130
+ defaultRedactor.registerSecret(accessToken);
131
+ }
132
+ authenticated = true;
133
+ report.checks.apiAuth = {
134
+ passed: true,
135
+ message: `Authenticated successfully as ${cred.email}`,
136
+ accessTokenFound: Boolean(accessToken),
137
+ cookieReceived: Boolean(sessionCookie)
138
+ };
139
+ break;
140
+ }
141
+ else {
142
+ authError = `HTTP ${sessionRes.status}`;
143
+ }
144
+ }
145
+ catch (err) {
146
+ authError = err.message;
147
+ }
148
+ }
149
+ if (!authenticated) {
150
+ report.checks.apiAuth = {
151
+ passed: false,
152
+ message: `Failed to authenticate to ${sessionUrl}: ${authError}`,
153
+ accessTokenFound: false
154
+ };
155
+ report.issues.push(`API Auth Failed: ${authError}`);
156
+ // Cannot proceed with subsequent checks without authentication
157
+ return {
158
+ content: [
159
+ {
160
+ type: "text",
161
+ text: JSON.stringify(report, null, 2)
162
+ }
163
+ ]
164
+ };
165
+ }
166
+ // -------------------------------------------------------------
167
+ // Gate 2: License Status Check
168
+ // -------------------------------------------------------------
169
+ try {
170
+ const settingsRes = await fetch(`${baseUrl}/api/org/${orgId}/settings`, {
171
+ method: "GET",
172
+ headers: authHeaders,
173
+ dispatcher: insecureAgent,
174
+ signal: AbortSignal.timeout(timeoutMs)
175
+ });
176
+ if (settingsRes.ok) {
177
+ const settingsJson = (await settingsRes.json().catch(() => ({}))) || {};
178
+ const settings = settingsJson.settings || settingsJson.data || settingsJson;
179
+ const lic = settings.license || settings.license_map || {};
180
+ const tier = settings.license_level || lic.subscription || lic.level || "Unknown";
181
+ const active = lic.active !== undefined ? Boolean(lic.active) : tier !== "Community" && tier !== "Unknown";
182
+ const daysRemaining = lic.days_remaining !== undefined ? Number(lic.days_remaining) : 90;
183
+ const licenseOk = !expectedMetrics.requireActiveLicense || (active && daysRemaining > 0);
184
+ report.checks.license = {
185
+ passed: licenseOk,
186
+ message: licenseOk
187
+ ? `Active ${tier} license verified (${daysRemaining} days remaining)`
188
+ : `License gate failed: tier=${tier}, active=${active}, daysRemaining=${daysRemaining}`,
189
+ tier,
190
+ active,
191
+ daysRemaining
192
+ };
193
+ if (!licenseOk) {
194
+ report.issues.push(`License gate failed: tier=${tier}, active=${active}, daysRemaining=${daysRemaining}`);
195
+ }
196
+ }
197
+ else {
198
+ report.checks.license = {
199
+ passed: false,
200
+ message: `Settings query failed with HTTP ${settingsRes.status}`
201
+ };
202
+ report.issues.push(`License Check Failed: HTTP ${settingsRes.status}`);
203
+ }
204
+ }
205
+ catch (licErr) {
206
+ report.checks.license = { passed: false, message: licErr.message };
207
+ report.issues.push(`License Check Exception: ${licErr.message}`);
208
+ }
209
+ // -------------------------------------------------------------
210
+ // Gate 3: CUBE Trunks & Voice Gateways Check
211
+ // -------------------------------------------------------------
212
+ try {
213
+ const cubesRes = await fetch(`${baseUrl}/api/cubes`, {
214
+ method: "GET",
215
+ headers: authHeaders,
216
+ dispatcher: insecureAgent,
217
+ signal: AbortSignal.timeout(timeoutMs)
218
+ });
219
+ if (cubesRes.ok) {
220
+ const cubesJson = (await cubesRes.json().catch(() => ({}))) || {};
221
+ const cubesList = Array.isArray(cubesJson) ? cubesJson : cubesJson.data || cubesJson.cubes || [];
222
+ const count = cubesList.length;
223
+ const cubesOk = count >= expectedMetrics.minCubes;
224
+ report.checks.cubes = {
225
+ passed: cubesOk,
226
+ message: cubesOk
227
+ ? `${count} CUBE gateway(s) configured (min required: ${expectedMetrics.minCubes})`
228
+ : `Insufficient CUBE gateways: found ${count}, expected at least ${expectedMetrics.minCubes}`,
229
+ count,
230
+ expectedMin: expectedMetrics.minCubes
231
+ };
232
+ if (!cubesOk) {
233
+ report.issues.push(`CUBE Check: found ${count}, expected at least ${expectedMetrics.minCubes}`);
234
+ }
235
+ }
236
+ else {
237
+ // Fallback to checking org cubes
238
+ const orgCubesRes = await fetch(`${baseUrl}/api/org/${orgId}/cubes`, {
239
+ method: "GET",
240
+ headers: authHeaders,
241
+ dispatcher: insecureAgent,
242
+ signal: AbortSignal.timeout(timeoutMs)
243
+ });
244
+ if (orgCubesRes.ok) {
245
+ const orgCubesJson = (await orgCubesRes.json().catch(() => ({}))) || {};
246
+ const cubesList = Array.isArray(orgCubesJson) ? orgCubesJson : orgCubesJson.data || orgCubesJson.cubes || [];
247
+ const count = cubesList.length;
248
+ const cubesOk = count >= expectedMetrics.minCubes;
249
+ report.checks.cubes = {
250
+ passed: cubesOk,
251
+ message: `${count} CUBE gateway(s) configured via org cubes`,
252
+ count,
253
+ expectedMin: expectedMetrics.minCubes
254
+ };
255
+ if (!cubesOk) {
256
+ report.issues.push(`CUBE Check: found ${count}, expected at least ${expectedMetrics.minCubes}`);
257
+ }
258
+ }
259
+ else {
260
+ report.checks.cubes = {
261
+ passed: false,
262
+ message: `CUBEs query returned HTTP ${cubesRes.status}`
263
+ };
264
+ report.issues.push(`CUBEs Endpoint Error: HTTP ${cubesRes.status}`);
265
+ }
266
+ }
267
+ }
268
+ catch (cubeErr) {
269
+ report.checks.cubes = { passed: false, message: cubeErr.message };
270
+ report.issues.push(`CUBE Check Exception: ${cubeErr.message}`);
271
+ }
272
+ // -------------------------------------------------------------
273
+ // Gate 4: Phone Extensions & Endpoints Check
274
+ // -------------------------------------------------------------
275
+ try {
276
+ const phonesRes = await fetch(`${baseUrl}/api/phones`, {
277
+ method: "GET",
278
+ headers: authHeaders,
279
+ dispatcher: insecureAgent,
280
+ signal: AbortSignal.timeout(timeoutMs)
281
+ });
282
+ if (phonesRes.ok) {
283
+ const phonesJson = (await phonesRes.json().catch(() => ({}))) || {};
284
+ const phonesList = Array.isArray(phonesJson) ? phonesJson : phonesJson.data || phonesJson.phones || [];
285
+ const count = phonesList.length;
286
+ const phonesOk = count >= expectedMetrics.minPhones;
287
+ report.checks.phones = {
288
+ passed: phonesOk,
289
+ message: phonesOk
290
+ ? `${count} phone endpoint(s) registered (min required: ${expectedMetrics.minPhones})`
291
+ : `Insufficient phone endpoints: found ${count}, expected at least ${expectedMetrics.minPhones}`,
292
+ count,
293
+ expectedMin: expectedMetrics.minPhones
294
+ };
295
+ if (!phonesOk) {
296
+ report.issues.push(`Phones Check: found ${count}, expected at least ${expectedMetrics.minPhones}`);
297
+ }
298
+ }
299
+ else {
300
+ const orgPhonesRes = await fetch(`${baseUrl}/api/org/${orgId}/phones`, {
301
+ method: "GET",
302
+ headers: authHeaders,
303
+ dispatcher: insecureAgent,
304
+ signal: AbortSignal.timeout(timeoutMs)
305
+ });
306
+ if (orgPhonesRes.ok) {
307
+ const orgPhonesJson = (await orgPhonesRes.json().catch(() => ({}))) || {};
308
+ const phonesList = Array.isArray(orgPhonesJson) ? orgPhonesJson : orgPhonesJson.data || orgPhonesJson.phones || [];
309
+ const count = phonesList.length;
310
+ const phonesOk = count >= expectedMetrics.minPhones;
311
+ report.checks.phones = {
312
+ passed: phonesOk,
313
+ message: `${count} phone endpoint(s) registered via org`,
314
+ count,
315
+ expectedMin: expectedMetrics.minPhones
316
+ };
317
+ if (!phonesOk) {
318
+ report.issues.push(`Phones Check: found ${count}, expected at least ${expectedMetrics.minPhones}`);
319
+ }
320
+ }
321
+ else {
322
+ report.checks.phones = {
323
+ passed: false,
324
+ message: `Phones query returned HTTP ${phonesRes.status}`
325
+ };
326
+ report.issues.push(`Phones Endpoint Error: HTTP ${phonesRes.status}`);
327
+ }
328
+ }
329
+ }
330
+ catch (phoneErr) {
331
+ report.checks.phones = { passed: false, message: phoneErr.message };
332
+ report.issues.push(`Phones Check Exception: ${phoneErr.message}`);
333
+ }
334
+ // -------------------------------------------------------------
335
+ // Gate 5: Call Analytics, CDRs & Policy Check
336
+ // -------------------------------------------------------------
337
+ try {
338
+ const callsRes = await fetch(`${baseUrl}/api/calls`, {
339
+ method: "GET",
340
+ headers: authHeaders,
341
+ dispatcher: insecureAgent,
342
+ signal: AbortSignal.timeout(timeoutMs)
343
+ });
344
+ if (callsRes.ok) {
345
+ const callsJson = (await callsRes.json().catch(() => ({}))) || {};
346
+ const callsList = Array.isArray(callsJson) ? callsJson : callsJson.data || callsJson.calls || [];
347
+ const count = callsList.length;
348
+ const callsOk = count >= expectedMetrics.minCalls;
349
+ report.checks.callRecords = {
350
+ passed: callsOk,
351
+ message: callsOk
352
+ ? `${count} processed call record(s) verified (min required: ${expectedMetrics.minCalls})`
353
+ : `Insufficient call records: found ${count}, expected at least ${expectedMetrics.minCalls}`,
354
+ count,
355
+ expectedMin: expectedMetrics.minCalls
356
+ };
357
+ if (!callsOk) {
358
+ report.issues.push(`Call Records Check: found ${count}, expected at least ${expectedMetrics.minCalls}`);
359
+ }
360
+ }
361
+ else {
362
+ const orgCallsRes = await fetch(`${baseUrl}/api/org/${orgId}/calls`, {
363
+ method: "GET",
364
+ headers: authHeaders,
365
+ dispatcher: insecureAgent,
366
+ signal: AbortSignal.timeout(timeoutMs)
367
+ });
368
+ if (orgCallsRes.ok) {
369
+ const orgCallsJson = (await orgCallsRes.json().catch(() => ({}))) || {};
370
+ const callsList = Array.isArray(orgCallsJson) ? orgCallsJson : orgCallsJson.data || orgCallsJson.calls || [];
371
+ const count = callsList.length;
372
+ const callsOk = count >= expectedMetrics.minCalls;
373
+ report.checks.callRecords = {
374
+ passed: callsOk,
375
+ message: `${count} processed call record(s) verified via org`,
376
+ count,
377
+ expectedMin: expectedMetrics.minCalls
378
+ };
379
+ if (!callsOk) {
380
+ report.issues.push(`Call Records Check: found ${count}, expected at least ${expectedMetrics.minCalls}`);
381
+ }
382
+ }
383
+ else {
384
+ report.checks.callRecords = {
385
+ passed: false,
386
+ message: `Calls query returned HTTP ${callsRes.status}`
387
+ };
388
+ report.issues.push(`Calls Endpoint Error: HTTP ${callsRes.status}`);
389
+ }
390
+ }
391
+ }
392
+ catch (callsErr) {
393
+ report.checks.callRecords = { passed: false, message: callsErr.message };
394
+ report.issues.push(`Call Records Check Exception: ${callsErr.message}`);
395
+ }
396
+ // -------------------------------------------------------------
397
+ // Evaluation & Scoring
398
+ // -------------------------------------------------------------
399
+ const checkArray = [
400
+ report.checks.apiAuth.passed,
401
+ report.checks.license.passed,
402
+ report.checks.cubes.passed,
403
+ report.checks.phones.passed,
404
+ report.checks.callRecords.passed
405
+ ];
406
+ const passedCount = checkArray.filter(Boolean).length;
407
+ report.score = `${passedCount}/5`;
408
+ report.readyForDemo = passedCount === 5;
409
+ telemetry.emit({
410
+ event: "appliance.demo.verified",
411
+ actor: "ct-lab-mcp",
412
+ status: report.readyForDemo ? "success" : "failure",
413
+ metadata: {
414
+ target: targetIp,
415
+ score: report.score,
416
+ passedCount,
417
+ readyForDemo: report.readyForDemo,
418
+ issuesCount: report.issues.length
419
+ }
420
+ });
421
+ return {
422
+ content: [
423
+ {
424
+ type: "text",
425
+ text: JSON.stringify(report, null, 2)
426
+ }
427
+ ]
428
+ };
429
+ }
430
+ catch (err) {
431
+ logger.error(`Demo verification failed on ${targetIp}: ${err.message}`);
432
+ return createToolErrorResult(ProxmoxErrorCode.APPLIANCE_EXECUTION_FAILED, `Demo verification failed on ${targetIp}: ${err.message}`);
433
+ }
434
+ }
435
+ //# sourceMappingURL=verify-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-demo.js","sourceRoot":"","sources":["../../../src/tools/verify-demo.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.49",
3
+ "version": "0.8.51",
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",