@inspectr/mcplab 1.28.1 → 1.28.2

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.
@@ -16,7 +16,7 @@
16
16
  <meta name="twitter:card" content="summary_large_image" />
17
17
  <meta name="twitter:site" content="@Inspectr" />
18
18
  <meta name="twitter:image" content="" />
19
- <script type="module" crossorigin src="/assets/index-C73rVN95.js"></script>
19
+ <script type="module" crossorigin src="/assets/index-Bug5M-yX.js"></script>
20
20
  <link rel="stylesheet" crossorigin href="/assets/index-CVe_v-Bh.css">
21
21
  </head>
22
22
 
@@ -0,0 +1,61 @@
1
+ import { Agent } from '@mastra/core/agent';
2
+ import { Mastra } from '@mastra/core/mastra';
3
+ import { Memory } from '@mastra/memory';
4
+ import { LibSQLStore } from '@mastra/libsql';
5
+ import type { AgentConfig, McpClientManager, ToolDef } from '@inspectr/mcplab-core';
6
+ import { type ScenarioAssistantProposal } from './mastra-scenario-tools.js';
7
+ export interface MastraScenarioContext {
8
+ scenario: {
9
+ id: string;
10
+ name?: string;
11
+ prompt: string;
12
+ serverNames: string[];
13
+ evalRules: unknown[];
14
+ extractRules: unknown[];
15
+ };
16
+ }
17
+ export declare function scenarioAssistantScopeKey(params: {
18
+ scenarioId: string;
19
+ configPath?: string;
20
+ }): string;
21
+ export interface MastraScenarioAssistantOptions {
22
+ storagePath: string;
23
+ scopeKey?: string;
24
+ agentConfig: AgentConfig;
25
+ tools: ToolDef[];
26
+ toolMappings: Map<
27
+ string,
28
+ {
29
+ server: string;
30
+ tool: string;
31
+ }
32
+ >;
33
+ mcp: McpClientManager;
34
+ context: MastraScenarioContext;
35
+ onProposal?: (proposal: ScenarioAssistantProposal) => void;
36
+ }
37
+ export declare class MastraScenarioAssistant {
38
+ readonly threadId: string;
39
+ readonly resourceId: string;
40
+ readonly storage: LibSQLStore;
41
+ readonly mastra: Mastra;
42
+ readonly memory: Memory;
43
+ readonly agent: Agent;
44
+ constructor(options: MastraScenarioAssistantOptions);
45
+ init(): Promise<void>;
46
+ listSuspendedRuns(): Promise<import('@mastra/core/agent').AgentListSuspendedRunsResult>;
47
+ stream(
48
+ message: string,
49
+ context: MastraScenarioContext,
50
+ signal?: AbortSignal
51
+ ): Promise<import('@mastra/core/stream').MastraModelOutput<undefined>>;
52
+ resumeStream(
53
+ runId: string,
54
+ approved: boolean,
55
+ signal?: AbortSignal,
56
+ toolCallId?: string
57
+ ): Promise<import('@mastra/core/stream').MastraModelOutput<undefined>>;
58
+ close(): Promise<void>;
59
+ }
60
+ export declare function buildScenarioAssistantInstructions(context: MastraScenarioContext): string;
61
+ //# sourceMappingURL=mastra-scenario-assistant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mastra-scenario-assistant.d.ts","sourceRoot":"","sources":["../../src/app-server/mastra-scenario-assistant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAIL,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,EAAE,OAAO,EAAE,CAAC;QACrB,YAAY,EAAE,OAAO,EAAE,CAAC;KACzB,CAAC;CACH;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAIT;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,GAAG,EAAE,gBAAgB,CAAC;IACtB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,CAAC;CAC5D;AAED,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAEV,OAAO,EAAE,8BAA8B;IAmC7C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,iBAAiB;IAIvB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,WAAW;IAS5E,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,MAAM;IAWlF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAUzF"}
@@ -0,0 +1,88 @@
1
+ import { Agent } from '@mastra/core/agent';
2
+ import { Mastra } from '@mastra/core/mastra';
3
+ import { Memory } from '@mastra/memory';
4
+ import { LibSQLStore } from '@mastra/libsql';
5
+ import { createMastraScenarioTools, createScenarioAssistantProposalTool, resolveMastraScenarioModel } from './mastra-scenario-tools.js';
6
+ export function scenarioAssistantScopeKey(params) {
7
+ return params.configPath
8
+ ? `config:${params.configPath}:${params.scenarioId}`
9
+ : `library:${params.scenarioId}`;
10
+ }
11
+ export class MastraScenarioAssistant {
12
+ threadId;
13
+ resourceId;
14
+ storage;
15
+ mastra;
16
+ memory;
17
+ agent;
18
+ constructor(options) {
19
+ const scope = options.scopeKey ?? `scenario:${options.context.scenario.id}`;
20
+ this.threadId = scope;
21
+ this.resourceId = scope;
22
+ this.storage = new LibSQLStore({
23
+ id: 'mcplab-scenario-assistant',
24
+ url: `file:${options.storagePath}`
25
+ });
26
+ this.mastra = new Mastra({ storage: this.storage });
27
+ this.memory = new Memory({ storage: this.storage, options: { lastMessages: 50 } });
28
+ const mcpTools = createMastraScenarioTools({
29
+ tools: options.tools,
30
+ mappings: options.toolMappings,
31
+ callTool: (server, tool, args, callOptions) => options.mcp.callTool(server, tool, args, callOptions)
32
+ });
33
+ const proposalTool = createScenarioAssistantProposalTool(options.onProposal ?? (() => undefined));
34
+ this.agent = new Agent({
35
+ id: 'mcplab-scenario-assistant',
36
+ name: 'MCPLab Scenario Assistant',
37
+ description: 'Authors MCP evaluation test cases.',
38
+ instructions: buildScenarioAssistantInstructions(options.context),
39
+ model: resolveMastraScenarioModel(options.agentConfig, {
40
+ endpoint: process.env.AZURE_OPENAI_ENDPOINT,
41
+ apiKey: process.env.AZURE_OPENAI_API_KEY,
42
+ apiVersion: process.env.AZURE_OPENAI_API_VERSION
43
+ }),
44
+ tools: { ...mcpTools, propose_test_case_patch: proposalTool },
45
+ memory: this.memory,
46
+ mastra: this.mastra
47
+ });
48
+ }
49
+ async init() {
50
+ await this.storage.init();
51
+ }
52
+ async listSuspendedRuns() {
53
+ return this.agent.listSuspendedRuns({ threadId: this.threadId, resourceId: this.resourceId });
54
+ }
55
+ stream(message, context, signal) {
56
+ return this.agent.stream(message, {
57
+ memory: { thread: this.threadId, resource: this.resourceId },
58
+ instructions: buildScenarioAssistantInstructions(context),
59
+ abortSignal: signal,
60
+ maxSteps: 25
61
+ });
62
+ }
63
+ resumeStream(runId, approved, signal, toolCallId) {
64
+ const options = {
65
+ runId,
66
+ memory: { thread: this.threadId, resource: this.resourceId },
67
+ abortSignal: signal
68
+ };
69
+ return approved
70
+ ? this.agent.approveToolCall({ ...options, toolCallId })
71
+ : this.agent.declineToolCall({ ...options, toolCallId, reason: 'User denied tool call' });
72
+ }
73
+ async close() {
74
+ await this.storage.close();
75
+ }
76
+ }
77
+ export function buildScenarioAssistantInstructions(context) {
78
+ return [
79
+ 'You are a Scenario Authoring Assistant for MCP evaluation test cases.',
80
+ 'Help the user author a deterministic prompt, Checks, and Value Capture Rules.',
81
+ 'Use MCP tools when live server information is needed. Read-only tools may run automatically; all other tools require user approval.',
82
+ 'Use user-facing terminology: Checks and Value Capture Rules.',
83
+ 'When proposing edits, call propose_test_case_patch with the structured replacement payload. Never mutate the test case directly.',
84
+ 'Ask clarifying questions when the test-case intent is unclear.',
85
+ `Current test-case context: ${JSON.stringify(context.scenario)}`
86
+ ].join('\n');
87
+ }
88
+ //# sourceMappingURL=mastra-scenario-assistant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mastra-scenario-assistant.js","sourceRoot":"","sources":["../../src/app-server/mastra-scenario-assistant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { AgentConfig, ToolDef } from '@inspectr/mcplab-core';
2
+ export interface MastraScenarioToolMapping {
3
+ server: string;
4
+ tool: string;
5
+ }
6
+ export interface MastraScenarioToolSource {
7
+ tools: ToolDef[];
8
+ mappings: Map<string, MastraScenarioToolMapping>;
9
+ callTool: (
10
+ server: string,
11
+ tool: string,
12
+ args: unknown,
13
+ options?: {
14
+ signal?: AbortSignal;
15
+ }
16
+ ) => Promise<unknown>;
17
+ }
18
+ export interface ScenarioAssistantProposal {
19
+ prompt?: {
20
+ replacement: string;
21
+ rationale?: string;
22
+ };
23
+ evalRules?: {
24
+ replacement: Array<Record<string, unknown>>;
25
+ rationale?: string;
26
+ };
27
+ extractRules?: {
28
+ replacement: Array<{
29
+ name: string;
30
+ pattern: string;
31
+ }>;
32
+ rationale?: string;
33
+ };
34
+ notes?: string[];
35
+ }
36
+ export declare function resolveMastraScenarioModel(
37
+ agent: AgentConfig,
38
+ azure?: {
39
+ endpoint?: string;
40
+ apiKey?: string;
41
+ apiVersion?: string;
42
+ },
43
+ credentials?: {
44
+ openaiApiKey?: string;
45
+ anthropicApiKey?: string;
46
+ }
47
+ ): import('@ai-sdk/provider').LanguageModelV4;
48
+ /** Adapt MCPLab's already-authenticated MCP tools to Mastra's tool contract. */
49
+ export declare function createMastraScenarioTools(
50
+ source: MastraScenarioToolSource
51
+ ): Record<
52
+ string,
53
+ import('@mastra/core/tools').Tool<
54
+ any,
55
+ any,
56
+ any,
57
+ any,
58
+ import('@mastra/core/tools').ToolExecutionContext<any, any, unknown>,
59
+ string,
60
+ unknown
61
+ >
62
+ >;
63
+ export declare function createScenarioAssistantProposalTool(
64
+ onProposal: (proposal: ScenarioAssistantProposal) => void
65
+ ): import('@mastra/core/tools').Tool<
66
+ {
67
+ prompt?:
68
+ | {
69
+ replacement: string;
70
+ rationale?: string | undefined;
71
+ }
72
+ | undefined;
73
+ evalRules?:
74
+ | {
75
+ replacement: Record<string, unknown>[];
76
+ rationale?: string | undefined;
77
+ }
78
+ | undefined;
79
+ extractRules?:
80
+ | {
81
+ replacement: {
82
+ name: string;
83
+ pattern: string;
84
+ }[];
85
+ rationale?: string | undefined;
86
+ }
87
+ | undefined;
88
+ notes?: string[] | undefined;
89
+ },
90
+ unknown,
91
+ unknown,
92
+ unknown,
93
+ import('@mastra/core/tools').ToolExecutionContext<unknown, unknown, unknown>,
94
+ 'propose_test_case_patch',
95
+ unknown
96
+ >;
97
+ //# sourceMappingURL=mastra-scenario-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mastra-scenario-tools.d.ts","sourceRoot":"","sources":["../../src/app-server/mastra-scenario-tools.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACjD,QAAQ,EAAE,CACR,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,SAAS,CAAC,EAAE;QAAE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,YAAY,CAAC,EAAE;QAAE,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,WAAW,EAClB,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACnE,WAAW,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,8CAmBlE;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,wBAAwB,gKA2BzE;AAED,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI;;;;;;;;;;;;;;;;;gJAwB1D"}
@@ -0,0 +1,76 @@
1
+ import { createTool } from '@mastra/core/tools';
2
+ import { jsonSchemaToZod } from '@mastra/core/workflows';
3
+ import { createAnthropic } from '@ai-sdk/anthropic';
4
+ import { createOpenAI } from '@ai-sdk/openai';
5
+ import { createAzure } from '@ai-sdk/azure';
6
+ import { z } from 'zod';
7
+ export function resolveMastraScenarioModel(agent, azure, credentials) {
8
+ if (agent.provider === 'openai') {
9
+ return createOpenAI({ apiKey: credentials?.openaiApiKey ?? process.env.OPENAI_API_KEY }).chat(agent.model);
10
+ }
11
+ if (agent.provider === 'anthropic') {
12
+ return createAnthropic({
13
+ apiKey: credentials?.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY
14
+ }).chat(agent.model);
15
+ }
16
+ const provider = createAzure({
17
+ baseURL: azure?.endpoint,
18
+ apiKey: azure?.apiKey,
19
+ apiVersion: azure?.apiVersion,
20
+ useDeploymentBasedUrls: true
21
+ });
22
+ return provider.chat(agent.model);
23
+ }
24
+ /** Adapt MCPLab's already-authenticated MCP tools to Mastra's tool contract. */
25
+ export function createMastraScenarioTools(source) {
26
+ const result = {};
27
+ for (const definition of source.tools) {
28
+ const mapping = source.mappings.get(definition.name);
29
+ if (!mapping)
30
+ continue;
31
+ let inputSchema = z.record(z.string(), z.unknown());
32
+ if (definition.inputSchema && typeof definition.inputSchema === 'object') {
33
+ try {
34
+ inputSchema = jsonSchemaToZod(definition.inputSchema);
35
+ }
36
+ catch {
37
+ // Keep a permissive schema for non-standard MCP schemas.
38
+ }
39
+ }
40
+ result[definition.name] = createTool({
41
+ id: definition.name,
42
+ description: definition.description ?? definition.name,
43
+ inputSchema,
44
+ requireApproval: definition.annotations?.readOnlyHint !== true,
45
+ execute: async (args, context) => source.callTool(mapping.server, mapping.tool, args, {
46
+ signal: context?.abortSignal
47
+ })
48
+ });
49
+ }
50
+ return result;
51
+ }
52
+ export function createScenarioAssistantProposalTool(onProposal) {
53
+ const rule = z.record(z.string(), z.unknown());
54
+ return createTool({
55
+ id: 'propose_test_case_patch',
56
+ description: 'Propose apply-ready changes to the current MCP evaluation test case.',
57
+ inputSchema: z.object({
58
+ prompt: z.object({ replacement: z.string(), rationale: z.string().optional() }).optional(),
59
+ evalRules: z
60
+ .object({ replacement: z.array(rule), rationale: z.string().optional() })
61
+ .optional(),
62
+ extractRules: z
63
+ .object({
64
+ replacement: z.array(z.object({ name: z.string(), pattern: z.string() })),
65
+ rationale: z.string().optional()
66
+ })
67
+ .optional(),
68
+ notes: z.array(z.string()).optional()
69
+ }),
70
+ execute: async (proposal) => {
71
+ onProposal(proposal);
72
+ return { recorded: true };
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=mastra-scenario-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mastra-scenario-tools.js","sourceRoot":"","sources":["../../src/app-server/mastra-scenario-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type ScenarioAssistantRuntime = 'legacy' | 'mastra';
2
+ export declare function resolveScenarioAssistantRuntime(
3
+ value?: string | undefined
4
+ ): ScenarioAssistantRuntime;
5
+ //# sourceMappingURL=scenario-assistant-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-assistant-runtime.d.ts","sourceRoot":"","sources":["../../src/app-server/scenario-assistant-runtime.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,wBAAgB,+BAA+B,CAC7C,KAAK,qBAAgD,GACpD,wBAAwB,CAI1B"}
@@ -0,0 +1,7 @@
1
+ export function resolveScenarioAssistantRuntime(value = process.env.MCPLAB_SCENARIO_ASSISTANT_RUNTIME) {
2
+ const runtime = value?.trim().toLowerCase() || 'mastra';
3
+ if (runtime === 'legacy' || runtime === 'mastra')
4
+ return runtime;
5
+ throw new Error('MCPLAB_SCENARIO_ASSISTANT_RUNTIME must be either "mastra" or "legacy"');
6
+ }
7
+ //# sourceMappingURL=scenario-assistant-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-assistant-runtime.js","sourceRoot":"","sources":["../../src/app-server/scenario-assistant-runtime.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,+BAA+B,CAC7C,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC;IAErD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC;IACxD,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IACjE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;AAC3F,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inspectr/mcplab",
3
- "version": "1.28.1",
3
+ "version": "1.28.2",
4
4
  "description": "MCPLab - Test and evaluate MCP servers with LLMs — run evals, compare agents and launch the MCPLab web app",
5
5
  "license": "MIT",
6
6
  "homepage": "https://mcplab.inspectr.dev",
@@ -44,9 +44,9 @@
44
44
  "vitest": "^4.1.8"
45
45
  },
46
46
  "dependencies": {
47
- "@inspectr/mcplab-core": "1.22.1",
48
- "@inspectr/mcplab-mcp-server": "1.8.1",
49
- "@inspectr/mcplab-reporting": "1.2.3",
47
+ "@inspectr/mcplab-core": "1.22.2",
48
+ "@inspectr/mcplab-mcp-server": "1.8.2",
49
+ "@inspectr/mcplab-reporting": "1.2.4",
50
50
  "commander": "^12.1.0",
51
51
  "dotenv": "^16.6.1",
52
52
  "kleur": "^4.1.5",