@agentlensai/mcp 0.6.0 → 0.7.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.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_benchmark MCP tool (Stories 4.2, 4.3)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=benchmark.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/benchmark.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Tests for agentlens_benchmark MCP tool (Stories 4.2, 4.3)
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
7
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
8
+ import { registerTools } from '../tools.js';
9
+ import { AgentLensTransport } from '../transport.js';
10
+ import { formatBenchmarkList, formatBenchmarkCreated, formatBenchmarkStatus, formatBenchmarkResults, } from '../tools/benchmark.js';
11
+ const mockFetch = vi.fn();
12
+ beforeEach(() => {
13
+ vi.stubGlobal('fetch', mockFetch);
14
+ mockFetch.mockReset();
15
+ });
16
+ afterEach(() => {
17
+ vi.unstubAllGlobals();
18
+ });
19
+ function okResponse(data = {}) {
20
+ return new Response(JSON.stringify(data), {
21
+ status: 200,
22
+ headers: { 'Content-Type': 'application/json' },
23
+ });
24
+ }
25
+ function errorResponse(status, body) {
26
+ return new Response(body, { status });
27
+ }
28
+ const MOCK_BENCHMARK_DETAIL = {
29
+ id: 'bench_001',
30
+ name: 'GPT-4o vs Claude',
31
+ status: 'draft',
32
+ description: 'Compare models on coding tasks',
33
+ variants: [
34
+ { name: 'gpt-4o', tag: 'v-gpt4o', description: 'OpenAI GPT-4o', sessionCount: 0 },
35
+ { name: 'claude-3.5', tag: 'v-claude', description: 'Anthropic Claude 3.5', sessionCount: 0 },
36
+ ],
37
+ metrics: ['cost', 'latency', 'success_rate'],
38
+ minSessions: 20,
39
+ agentId: 'test-agent',
40
+ createdAt: '2026-02-08T10:00:00.000Z',
41
+ };
42
+ const MOCK_BENCHMARK_RUNNING = {
43
+ ...MOCK_BENCHMARK_DETAIL,
44
+ status: 'running',
45
+ startedAt: '2026-02-08T11:00:00.000Z',
46
+ variants: [
47
+ { name: 'gpt-4o', tag: 'v-gpt4o', sessionCount: 15 },
48
+ { name: 'claude-3.5', tag: 'v-claude', sessionCount: 18 },
49
+ ],
50
+ };
51
+ const MOCK_BENCHMARK_LIST = [
52
+ {
53
+ id: 'bench_001',
54
+ name: 'GPT-4o vs Claude',
55
+ status: 'running',
56
+ variants: [
57
+ { name: 'gpt-4o', tag: 'v-gpt4o' },
58
+ { name: 'claude-3.5', tag: 'v-claude' },
59
+ ],
60
+ createdAt: '2026-02-08T10:00:00.000Z',
61
+ },
62
+ {
63
+ id: 'bench_002',
64
+ name: 'Temperature Sweep',
65
+ status: 'completed',
66
+ variants: [
67
+ { name: 'temp-0.0', tag: 'v-t0' },
68
+ { name: 'temp-0.7', tag: 'v-t7' },
69
+ { name: 'temp-1.0', tag: 'v-t10' },
70
+ ],
71
+ createdAt: '2026-02-07T10:00:00.000Z',
72
+ description: 'Comparing temperature settings',
73
+ },
74
+ ];
75
+ const MOCK_RESULTS = {
76
+ benchmarkId: 'bench_001',
77
+ name: 'GPT-4o vs Claude',
78
+ status: 'completed',
79
+ metrics: [
80
+ {
81
+ metric: 'cost',
82
+ variants: [
83
+ { name: 'gpt-4o', mean: 0.0045, stddev: 0.001, n: 20 },
84
+ { name: 'claude-3.5', mean: 0.0032, stddev: 0.0008, n: 20 },
85
+ ],
86
+ pValue: 0.003,
87
+ significant: true,
88
+ winner: 'claude-3.5',
89
+ difference: -0.0013,
90
+ differencePercent: -28.9,
91
+ },
92
+ {
93
+ metric: 'latency',
94
+ variants: [
95
+ { name: 'gpt-4o', mean: 1200, stddev: 300, n: 20 },
96
+ { name: 'claude-3.5', mean: 1150, stddev: 280, n: 20 },
97
+ ],
98
+ pValue: 0.42,
99
+ significant: false,
100
+ },
101
+ {
102
+ metric: 'success_rate',
103
+ variants: [
104
+ { name: 'gpt-4o', mean: 0.92, stddev: 0.05, n: 20 },
105
+ { name: 'claude-3.5', mean: 0.95, stddev: 0.03, n: 20 },
106
+ ],
107
+ pValue: 0.02,
108
+ significant: true,
109
+ winner: 'claude-3.5',
110
+ difference: 0.03,
111
+ differencePercent: 3.3,
112
+ },
113
+ ],
114
+ summary: 'Claude 3.5 wins on cost (p<0.01) and success rate (p<0.05). No significant difference in latency.',
115
+ };
116
+ async function createTestSetup() {
117
+ const transport = new AgentLensTransport({
118
+ baseUrl: 'http://localhost:3400',
119
+ apiKey: 'test-key',
120
+ });
121
+ const server = new McpServer({ name: 'agentlens-test', version: '0.0.0' }, { capabilities: { tools: {} } });
122
+ registerTools(server, transport);
123
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
124
+ const client = new Client({ name: 'test-client', version: '1.0.0' });
125
+ await server.connect(serverTransport);
126
+ await client.connect(clientTransport);
127
+ return { server, client, transport };
128
+ }
129
+ describe('agentlens_benchmark', () => {
130
+ it('tool is registered with correct schema', async () => {
131
+ const { client } = await createTestSetup();
132
+ const result = await client.listTools();
133
+ const tool = result.tools.find((t) => t.name === 'agentlens_benchmark');
134
+ expect(tool).toBeDefined();
135
+ expect(tool.description).toContain('benchmark');
136
+ const schema = tool.inputSchema;
137
+ expect(schema.properties).toHaveProperty('action');
138
+ expect(schema.properties).toHaveProperty('name');
139
+ expect(schema.properties).toHaveProperty('variants');
140
+ expect(schema.properties).toHaveProperty('benchmarkId');
141
+ expect(schema.required).toContain('action');
142
+ });
143
+ it('total tool count is 13', async () => {
144
+ const { client } = await createTestSetup();
145
+ const result = await client.listTools();
146
+ expect(result.tools).toHaveLength(13);
147
+ });
148
+ // ─── Create ───────────────────────────────────────────────
149
+ it('creates a benchmark successfully', async () => {
150
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_BENCHMARK_DETAIL));
151
+ const { client } = await createTestSetup();
152
+ const result = await client.callTool({
153
+ name: 'agentlens_benchmark',
154
+ arguments: {
155
+ action: 'create',
156
+ name: 'GPT-4o vs Claude',
157
+ description: 'Compare models on coding tasks',
158
+ variants: [
159
+ { name: 'gpt-4o', tag: 'v-gpt4o' },
160
+ { name: 'claude-3.5', tag: 'v-claude' },
161
+ ],
162
+ metrics: ['cost', 'latency', 'success_rate'],
163
+ minSessions: 20,
164
+ },
165
+ });
166
+ expect(result.isError).toBeUndefined();
167
+ const content = result.content;
168
+ const text = content[0].text;
169
+ expect(text).toContain('✅ Benchmark created');
170
+ expect(text).toContain('GPT-4o vs Claude');
171
+ expect(text).toContain('bench_001');
172
+ expect(text).toContain('Next steps');
173
+ });
174
+ it('validates: name required for create', async () => {
175
+ const { client } = await createTestSetup();
176
+ const result = await client.callTool({
177
+ name: 'agentlens_benchmark',
178
+ arguments: {
179
+ action: 'create',
180
+ variants: [
181
+ { name: 'a', tag: 'ta' },
182
+ { name: 'b', tag: 'tb' },
183
+ ],
184
+ },
185
+ });
186
+ expect(result.isError).toBe(true);
187
+ const content = result.content;
188
+ expect(content[0].text).toContain('name');
189
+ });
190
+ it('validates: at least 2 variants required', async () => {
191
+ const { client } = await createTestSetup();
192
+ const result = await client.callTool({
193
+ name: 'agentlens_benchmark',
194
+ arguments: {
195
+ action: 'create',
196
+ name: 'Test',
197
+ variants: [{ name: 'only-one', tag: 'v1' }],
198
+ },
199
+ });
200
+ expect(result.isError).toBe(true);
201
+ const content = result.content;
202
+ expect(content[0].text).toContain('2 variants');
203
+ });
204
+ // ─── List ─────────────────────────────────────────────────
205
+ it('lists benchmarks', async () => {
206
+ mockFetch.mockResolvedValueOnce(okResponse({ benchmarks: MOCK_BENCHMARK_LIST }));
207
+ const { client } = await createTestSetup();
208
+ const result = await client.callTool({
209
+ name: 'agentlens_benchmark',
210
+ arguments: { action: 'list' },
211
+ });
212
+ expect(result.isError).toBeUndefined();
213
+ const content = result.content;
214
+ const text = content[0].text;
215
+ expect(text).toContain('Benchmarks (2)');
216
+ expect(text).toContain('GPT-4o vs Claude');
217
+ expect(text).toContain('Temperature Sweep');
218
+ });
219
+ it('lists benchmarks with status filter', async () => {
220
+ mockFetch.mockResolvedValueOnce(okResponse({ benchmarks: [MOCK_BENCHMARK_LIST[0]] }));
221
+ const { client } = await createTestSetup();
222
+ await client.callTool({
223
+ name: 'agentlens_benchmark',
224
+ arguments: { action: 'list', status: 'running' },
225
+ });
226
+ const fetchUrl = mockFetch.mock.calls[0][0];
227
+ expect(fetchUrl).toContain('status=running');
228
+ });
229
+ // ─── Status ───────────────────────────────────────────────
230
+ it('gets benchmark status with session counts', async () => {
231
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_BENCHMARK_RUNNING));
232
+ const { client } = await createTestSetup();
233
+ const result = await client.callTool({
234
+ name: 'agentlens_benchmark',
235
+ arguments: { action: 'status', benchmarkId: 'bench_001' },
236
+ });
237
+ expect(result.isError).toBeUndefined();
238
+ const content = result.content;
239
+ const text = content[0].text;
240
+ expect(text).toContain('🏃 Benchmark: GPT-4o vs Claude [running]');
241
+ expect(text).toContain('15/20');
242
+ expect(text).toContain('18/20');
243
+ });
244
+ it('validates: benchmarkId required for status', async () => {
245
+ const { client } = await createTestSetup();
246
+ const result = await client.callTool({
247
+ name: 'agentlens_benchmark',
248
+ arguments: { action: 'status' },
249
+ });
250
+ expect(result.isError).toBe(true);
251
+ const content = result.content;
252
+ expect(content[0].text).toContain('benchmarkId');
253
+ });
254
+ // ─── Results ──────────────────────────────────────────────
255
+ it('gets benchmark results as formatted table', async () => {
256
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_RESULTS));
257
+ const { client } = await createTestSetup();
258
+ const result = await client.callTool({
259
+ name: 'agentlens_benchmark',
260
+ arguments: { action: 'results', benchmarkId: 'bench_001' },
261
+ });
262
+ expect(result.isError).toBeUndefined();
263
+ const content = result.content;
264
+ const text = content[0].text;
265
+ expect(text).toContain('Benchmark Results');
266
+ expect(text).toContain('cost');
267
+ expect(text).toContain('latency');
268
+ expect(text).toContain('success_rate');
269
+ expect(text).toContain('claude-3.5 wins');
270
+ expect(text).toContain('no sig. diff.');
271
+ expect(text).toContain('★★');
272
+ expect(text).toContain('p<0.05');
273
+ });
274
+ // ─── Start ────────────────────────────────────────────────
275
+ it('starts a benchmark', async () => {
276
+ mockFetch.mockResolvedValueOnce(okResponse({ ...MOCK_BENCHMARK_DETAIL, status: 'running', name: 'GPT-4o vs Claude' }));
277
+ const { client } = await createTestSetup();
278
+ const result = await client.callTool({
279
+ name: 'agentlens_benchmark',
280
+ arguments: { action: 'start', benchmarkId: 'bench_001' },
281
+ });
282
+ expect(result.isError).toBeUndefined();
283
+ const content = result.content;
284
+ expect(content[0].text).toContain('🏃 Benchmark "GPT-4o vs Claude" is now running');
285
+ // Verify correct API call
286
+ const fetchUrl = mockFetch.mock.calls[0][0];
287
+ expect(fetchUrl).toContain('/api/benchmarks/bench_001/status');
288
+ const fetchOpts = mockFetch.mock.calls[0][1];
289
+ expect(JSON.parse(fetchOpts.body)).toEqual({ status: 'running' });
290
+ });
291
+ // ─── Complete ─────────────────────────────────────────────
292
+ it('completes a benchmark', async () => {
293
+ mockFetch.mockResolvedValueOnce(okResponse({
294
+ ...MOCK_BENCHMARK_DETAIL,
295
+ status: 'completed',
296
+ name: 'GPT-4o vs Claude',
297
+ results: MOCK_RESULTS,
298
+ }));
299
+ const { client } = await createTestSetup();
300
+ const result = await client.callTool({
301
+ name: 'agentlens_benchmark',
302
+ arguments: { action: 'complete', benchmarkId: 'bench_001' },
303
+ });
304
+ expect(result.isError).toBeUndefined();
305
+ const content = result.content;
306
+ const text = content[0].text;
307
+ expect(text).toContain('✅ Benchmark "GPT-4o vs Claude" is now completed');
308
+ expect(text).toContain('Benchmark Results');
309
+ });
310
+ // ─── Error Handling ───────────────────────────────────────
311
+ it('handles 404 error for invalid benchmark', async () => {
312
+ mockFetch.mockResolvedValueOnce(errorResponse(404, '{"error":"Not found"}'));
313
+ const { client } = await createTestSetup();
314
+ const result = await client.callTool({
315
+ name: 'agentlens_benchmark',
316
+ arguments: { action: 'status', benchmarkId: 'nonexistent' },
317
+ });
318
+ expect(result.isError).toBe(true);
319
+ const content = result.content;
320
+ expect(content[0].text).toContain('Benchmark not found');
321
+ });
322
+ it('handles network errors', async () => {
323
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
324
+ const { client } = await createTestSetup();
325
+ const result = await client.callTool({
326
+ name: 'agentlens_benchmark',
327
+ arguments: { action: 'list' },
328
+ });
329
+ expect(result.isError).toBe(true);
330
+ const content = result.content;
331
+ expect(content[0].text).toContain('Connection refused');
332
+ });
333
+ });
334
+ describe('formatBenchmarkList', () => {
335
+ it('formats empty list', () => {
336
+ expect(formatBenchmarkList([])).toBe('No benchmarks found.');
337
+ });
338
+ it('formats list with status icons and variant names', () => {
339
+ const text = formatBenchmarkList(MOCK_BENCHMARK_LIST);
340
+ expect(text).toContain('📊 Benchmarks (2)');
341
+ expect(text).toContain('🏃 GPT-4o vs Claude [running]');
342
+ expect(text).toContain('✅ Temperature Sweep [completed]');
343
+ expect(text).toContain('gpt-4o vs claude-3.5');
344
+ expect(text).toContain('temp-0.0 vs temp-0.7 vs temp-1.0');
345
+ expect(text).toContain('Comparing temperature settings');
346
+ });
347
+ });
348
+ describe('formatBenchmarkResults', () => {
349
+ it('formats results as ASCII table with confidence stars', () => {
350
+ const text = formatBenchmarkResults(MOCK_RESULTS);
351
+ expect(text).toContain('Benchmark Results: GPT-4o vs Claude');
352
+ expect(text).toContain('cost');
353
+ expect(text).toContain('latency');
354
+ expect(text).toContain('success_rate');
355
+ expect(text).toContain('claude-3.5 wins');
356
+ expect(text).toContain('no sig. diff.');
357
+ // p=0.003 → ★★
358
+ expect(text).toContain('★★');
359
+ // p=0.02 → ★
360
+ expect(text).toContain('★');
361
+ expect(text).toContain('Confidence:');
362
+ expect(text).toContain('Summary:');
363
+ });
364
+ it('formats empty results', () => {
365
+ const empty = {
366
+ benchmarkId: 'bench_001',
367
+ name: 'Test',
368
+ status: 'running',
369
+ metrics: [],
370
+ summary: '',
371
+ };
372
+ const text = formatBenchmarkResults(empty);
373
+ expect(text).toContain('No results available yet');
374
+ });
375
+ });
376
+ describe('formatBenchmarkStatus', () => {
377
+ it('formats status with session progress', () => {
378
+ const text = formatBenchmarkStatus(MOCK_BENCHMARK_RUNNING);
379
+ expect(text).toContain('🏃 Benchmark: GPT-4o vs Claude [running]');
380
+ expect(text).toContain('gpt-4o [v-gpt4o]');
381
+ expect(text).toContain('15/20');
382
+ expect(text).toContain('claude-3.5 [v-claude]');
383
+ expect(text).toContain('18/20');
384
+ expect(text).toContain('Metrics: cost, latency, success_rate');
385
+ });
386
+ });
387
+ //# sourceMappingURL=benchmark.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.test.js","sourceRoot":"","sources":["../../src/__tests__/benchmark.test.ts"],"names":[],"mappings":"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"}
@@ -68,7 +68,7 @@ describe('agentlens_health', () => {
68
68
  it('total tool count is 11', async () => {
69
69
  const { client } = await createTestSetup();
70
70
  const result = await client.listTools();
71
- expect(result.tools).toHaveLength(11);
71
+ expect(result.tools).toHaveLength(13);
72
72
  });
73
73
  it('returns formatted output with score, trend, and dimensions', async () => {
74
74
  mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
@@ -51,10 +51,10 @@ describe('agentlens_learn registration', () => {
51
51
  const toolNames = result.tools.map((t) => t.name);
52
52
  expect(toolNames).toContain('agentlens_learn');
53
53
  });
54
- it('registers 11 tools total', async () => {
54
+ it('registers 13 tools total', async () => {
55
55
  const { client } = await createTestSetup();
56
56
  const result = await client.listTools();
57
- expect(result.tools).toHaveLength(11);
57
+ expect(result.tools).toHaveLength(13);
58
58
  });
59
59
  it('has a description', async () => {
60
60
  const { client } = await createTestSetup();
@@ -58,10 +58,10 @@ describe('agentlens_log_llm_call registration', () => {
58
58
  const toolNames = result.tools.map((t) => t.name);
59
59
  expect(toolNames).toContain('agentlens_log_llm_call');
60
60
  });
61
- it('now registers 11 tools total', async () => {
61
+ it('now registers 13 tools total', async () => {
62
62
  const { client } = await createTestSetup();
63
63
  const result = await client.listTools();
64
- expect(result.tools).toHaveLength(11);
64
+ expect(result.tools).toHaveLength(13);
65
65
  });
66
66
  it('has a description', async () => {
67
67
  const { client } = await createTestSetup();
@@ -47,10 +47,10 @@ describe('agentlens_optimize', () => {
47
47
  expect(tool.inputSchema.properties).toHaveProperty('period');
48
48
  expect(tool.inputSchema.properties).toHaveProperty('limit');
49
49
  });
50
- it('registers 11 tools total (10 existing + optimize)', async () => {
50
+ it('registers 13 tools total (10 existing + optimize)', async () => {
51
51
  const { client } = await createTestSetup();
52
52
  const result = await client.listTools();
53
- expect(result.tools).toHaveLength(11);
53
+ expect(result.tools).toHaveLength(13);
54
54
  const toolNames = result.tools.map((t) => t.name);
55
55
  expect(toolNames).toContain('agentlens_optimize');
56
56
  });
@@ -45,10 +45,10 @@ describe('agentlens_recall registration', () => {
45
45
  const toolNames = result.tools.map((t) => t.name);
46
46
  expect(toolNames).toContain('agentlens_recall');
47
47
  });
48
- it('registers 11 tools total', async () => {
48
+ it('registers 13 tools total', async () => {
49
49
  const { client } = await createTestSetup();
50
50
  const result = await client.listTools();
51
- expect(result.tools).toHaveLength(11);
51
+ expect(result.tools).toHaveLength(13);
52
52
  });
53
53
  it('has a description mentioning semantic search', async () => {
54
54
  const { client } = await createTestSetup();
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_replay MCP tool (Story 4.1)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=replay.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/replay.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}