@agentlensai/mcp 0.5.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.
Files changed (51) hide show
  1. package/dist/__tests__/benchmark.test.d.ts +5 -0
  2. package/dist/__tests__/benchmark.test.d.ts.map +1 -0
  3. package/dist/__tests__/benchmark.test.js +387 -0
  4. package/dist/__tests__/benchmark.test.js.map +1 -0
  5. package/dist/__tests__/health.test.d.ts.map +1 -0
  6. package/dist/__tests__/health.test.js +176 -0
  7. package/dist/__tests__/health.test.js.map +1 -0
  8. package/dist/__tests__/learn.test.js +2 -2
  9. package/dist/__tests__/learn.test.js.map +1 -1
  10. package/dist/__tests__/llm-call.test.js +2 -2
  11. package/dist/__tests__/llm-call.test.js.map +1 -1
  12. package/dist/__tests__/optimize.test.d.ts +5 -0
  13. package/dist/__tests__/optimize.test.d.ts.map +1 -0
  14. package/dist/__tests__/optimize.test.js +218 -0
  15. package/dist/__tests__/optimize.test.js.map +1 -0
  16. package/dist/__tests__/recall.test.js +2 -2
  17. package/dist/__tests__/recall.test.js.map +1 -1
  18. package/dist/__tests__/replay.test.d.ts +5 -0
  19. package/dist/__tests__/replay.test.d.ts.map +1 -0
  20. package/dist/__tests__/replay.test.js +245 -0
  21. package/dist/__tests__/replay.test.js.map +1 -0
  22. package/dist/server.test.js +6 -2
  23. package/dist/server.test.js.map +1 -1
  24. package/dist/tools/benchmark.d.ts +69 -0
  25. package/dist/tools/benchmark.d.ts.map +1 -0
  26. package/dist/tools/benchmark.js +378 -0
  27. package/dist/tools/benchmark.js.map +1 -0
  28. package/dist/tools/health.d.ts +32 -0
  29. package/dist/tools/health.d.ts.map +1 -0
  30. package/dist/tools/health.js +102 -0
  31. package/dist/tools/health.js.map +1 -0
  32. package/dist/tools/optimize.d.ts +10 -0
  33. package/dist/tools/optimize.d.ts.map +1 -0
  34. package/dist/tools/optimize.js +70 -0
  35. package/dist/tools/optimize.js.map +1 -0
  36. package/dist/tools/replay.d.ts +45 -0
  37. package/dist/tools/replay.d.ts.map +1 -0
  38. package/dist/tools/replay.js +183 -0
  39. package/dist/tools/replay.js.map +1 -0
  40. package/dist/tools.d.ts.map +1 -1
  41. package/dist/tools.js +8 -0
  42. package/dist/tools.js.map +1 -1
  43. package/dist/tools.test.js +5 -1
  44. package/dist/tools.test.js.map +1 -1
  45. package/dist/transport.d.ts +45 -0
  46. package/dist/transport.d.ts.map +1 -1
  47. package/dist/transport.js +164 -0
  48. package/dist/transport.js.map +1 -1
  49. package/package.json +2 -2
  50. package/dist/server.test.d.ts +0 -2
  51. package/dist/tools.test.d.ts +0 -2
@@ -0,0 +1,378 @@
1
+ /**
2
+ * agentlens_benchmark MCP Tool (Stories 4.2, 4.3)
3
+ *
4
+ * Create, list, manage, and analyze A/B benchmarks.
5
+ * Actions: create, list, status, results, start, complete.
6
+ */
7
+ import { z } from 'zod';
8
+ // ─── Formatting ─────────────────────────────────────────────────────
9
+ const STATUS_ICONS = {
10
+ draft: '📝',
11
+ running: '🏃',
12
+ completed: '✅',
13
+ cancelled: '❌',
14
+ };
15
+ function statusIcon(status) {
16
+ return STATUS_ICONS[status] ?? '❓';
17
+ }
18
+ /**
19
+ * Confidence stars from the API's confidence field.
20
+ * Falls back to p-value thresholds matching the server (★ p<0.1, ★★ p<0.05, ★★★ p<0.01).
21
+ */
22
+ function confidenceStars(pValue, confidence) {
23
+ if (confidence) {
24
+ if (confidence === 'high')
25
+ return ' ★★★';
26
+ if (confidence === 'medium')
27
+ return ' ★★';
28
+ if (confidence === 'low')
29
+ return ' ★';
30
+ return '';
31
+ }
32
+ // Fallback: match server thresholds
33
+ if (pValue === undefined)
34
+ return '';
35
+ if (pValue < 0.01)
36
+ return ' ★★★';
37
+ if (pValue < 0.05)
38
+ return ' ★★';
39
+ if (pValue < 0.1)
40
+ return ' ★';
41
+ return '';
42
+ }
43
+ /**
44
+ * Format a benchmark list.
45
+ */
46
+ export function formatBenchmarkList(benchmarks) {
47
+ if (benchmarks.length === 0) {
48
+ return 'No benchmarks found.';
49
+ }
50
+ const lines = [];
51
+ lines.push(`📊 Benchmarks (${benchmarks.length})`);
52
+ lines.push('');
53
+ for (const b of benchmarks) {
54
+ const icon = statusIcon(b.status);
55
+ const variantNames = b.variants.map((v) => v.name).join(' vs ');
56
+ lines.push(`${icon} ${b.name} [${b.status}]`);
57
+ lines.push(` ID: ${b.id}`);
58
+ lines.push(` Variants: ${variantNames}`);
59
+ if (b.description) {
60
+ lines.push(` ${b.description}`);
61
+ }
62
+ lines.push('');
63
+ }
64
+ return lines.join('\n').trimEnd();
65
+ }
66
+ /**
67
+ * Format a created benchmark confirmation.
68
+ */
69
+ export function formatBenchmarkCreated(benchmark) {
70
+ const lines = [];
71
+ lines.push(`✅ Benchmark created: ${benchmark.name}`);
72
+ lines.push('');
73
+ lines.push(`ID: ${benchmark.id}`);
74
+ lines.push(`Status: ${benchmark.status}`);
75
+ lines.push(`Variants: ${benchmark.variants.map((v) => `${v.name} (tag: ${v.tag})`).join(', ')}`);
76
+ if (benchmark.metrics.length > 0) {
77
+ lines.push(`Metrics: ${benchmark.metrics.join(', ')}`);
78
+ }
79
+ lines.push(`Min Sessions: ${benchmark.minSessions}`);
80
+ if (benchmark.agentId) {
81
+ lines.push(`Agent: ${benchmark.agentId}`);
82
+ }
83
+ lines.push('');
84
+ lines.push('Next steps:');
85
+ lines.push('1. Tag sessions with variant tags');
86
+ lines.push('2. Start the benchmark with action: "start"');
87
+ lines.push('3. Collect data, then check with action: "results"');
88
+ return lines.join('\n');
89
+ }
90
+ /**
91
+ * Format benchmark status/detail.
92
+ */
93
+ export function formatBenchmarkStatus(benchmark) {
94
+ const lines = [];
95
+ const icon = statusIcon(benchmark.status);
96
+ lines.push(`${icon} Benchmark: ${benchmark.name} [${benchmark.status}]`);
97
+ lines.push('');
98
+ lines.push(`ID: ${benchmark.id}`);
99
+ if (benchmark.description) {
100
+ lines.push(`Description: ${benchmark.description}`);
101
+ }
102
+ if (benchmark.agentId) {
103
+ lines.push(`Agent: ${benchmark.agentId}`);
104
+ }
105
+ lines.push(`Created: ${benchmark.createdAt}`);
106
+ if (benchmark.startedAt)
107
+ lines.push(`Started: ${benchmark.startedAt}`);
108
+ if (benchmark.completedAt)
109
+ lines.push(`Completed: ${benchmark.completedAt}`);
110
+ lines.push('');
111
+ lines.push('Variants:');
112
+ for (const v of benchmark.variants) {
113
+ const count = v.sessionCount ?? 0;
114
+ const progress = benchmark.minSessions > 0
115
+ ? ` (${count}/${benchmark.minSessions})`
116
+ : ` (${count} sessions)`;
117
+ lines.push(` • ${v.name} [${v.tag}]${progress}`);
118
+ if (v.description)
119
+ lines.push(` ${v.description}`);
120
+ }
121
+ if (benchmark.metrics.length > 0) {
122
+ lines.push('');
123
+ lines.push(`Metrics: ${benchmark.metrics.join(', ')}`);
124
+ }
125
+ return lines.join('\n');
126
+ }
127
+ /**
128
+ * Format benchmark results as an ASCII table.
129
+ */
130
+ export function formatBenchmarkResults(results) {
131
+ const lines = [];
132
+ const icon = statusIcon(results.status);
133
+ lines.push(`${icon} Benchmark Results: ${results.name}`);
134
+ lines.push('');
135
+ if (results.metrics.length === 0) {
136
+ lines.push('No results available yet. Collect more data and try again.');
137
+ return lines.join('\n');
138
+ }
139
+ // Build ASCII table
140
+ // Collect all variant names
141
+ const variantNames = results.metrics[0].variants.map((v) => v.name);
142
+ // Header row
143
+ const metricColWidth = Math.max(8, ...results.metrics.map((m) => m.metric.length));
144
+ const variantColWidth = Math.max(12, ...variantNames.map((n) => n.length + 2));
145
+ const statsColWidth = 14;
146
+ const headerCols = ['Metric'.padEnd(metricColWidth)];
147
+ for (const name of variantNames) {
148
+ headerCols.push(name.padEnd(variantColWidth));
149
+ }
150
+ headerCols.push('p-value'.padEnd(statsColWidth));
151
+ headerCols.push('Result');
152
+ const headerLine = '| ' + headerCols.join(' | ') + ' |';
153
+ const separator = '|' + headerCols.map((col) => '-'.repeat(col.length + 2)).join('|') + '|';
154
+ lines.push(headerLine);
155
+ lines.push(separator);
156
+ // Data rows
157
+ for (const metric of results.metrics) {
158
+ const cols = [metric.metric.padEnd(metricColWidth)];
159
+ for (const variant of metric.variants) {
160
+ const val = `${variant.mean.toFixed(2)}±${variant.stddev.toFixed(2)}`;
161
+ cols.push(val.padEnd(variantColWidth));
162
+ }
163
+ const pStr = metric.pValue !== undefined ? metric.pValue.toFixed(4) : 'n/a';
164
+ cols.push(pStr.padEnd(statsColWidth));
165
+ let resultStr = metric.significant ? `${metric.winner ?? '?'} wins` : 'no sig. diff.';
166
+ resultStr += confidenceStars(metric.pValue, metric.confidence);
167
+ cols.push(resultStr);
168
+ lines.push('| ' + cols.join(' | ') + ' |');
169
+ }
170
+ lines.push('');
171
+ lines.push(`Confidence: ★ p<0.1 ★★ p<0.05 ★★★ p<0.01`);
172
+ if (results.summary) {
173
+ lines.push('');
174
+ lines.push(`Summary: ${results.summary}`);
175
+ }
176
+ return lines.join('\n');
177
+ }
178
+ // ─── Tool Registration ──────────────────────────────────────────────
179
+ const variantSchema = z.object({
180
+ name: z.string().describe('Variant display name'),
181
+ tag: z.string().describe('Tag to associate sessions with this variant'),
182
+ description: z.string().optional().describe('Variant description'),
183
+ });
184
+ export function registerBenchmarkTool(server, transport) {
185
+ server.tool('agentlens_benchmark', `Manage A/B benchmarks: create, list, check status, get results, and control lifecycle.
186
+
187
+ **When to use:** To set up controlled experiments comparing different agent configurations (models, prompts, parameters), track which variant performs better, and get statistical results.
188
+
189
+ **Workflow:**
190
+ 1. \`create\` — Define a benchmark with 2+ variants and metrics
191
+ 2. Tag sessions with variant tags during data collection
192
+ 3. \`start\` — Transition benchmark to running
193
+ 4. \`status\` — Check progress (session counts per variant)
194
+ 5. \`results\` — Get statistical comparison with p-values
195
+ 6. \`complete\` — Finalize the benchmark
196
+
197
+ **Actions:**
198
+ - \`create\`: Set up a new benchmark (name, variants[], metrics[])
199
+ - \`list\`: List benchmarks, optionally filter by status
200
+ - \`status\`: Get benchmark detail with per-variant session counts
201
+ - \`results\`: Get formatted comparison table with statistical analysis
202
+ - \`start\`: Transition benchmark to running state
203
+ - \`complete\`: Transition benchmark to completed state
204
+
205
+ **Example:** agentlens_benchmark({ action: "create", name: "GPT-4o vs Claude", variants: [{name: "gpt4o", tag: "v-gpt4o"}, {name: "claude", tag: "v-claude"}], metrics: ["cost", "latency", "success_rate"] })`, {
206
+ action: z
207
+ .enum(['create', 'list', 'status', 'results', 'start', 'complete'])
208
+ .describe('Action to perform'),
209
+ // Create params
210
+ name: z.string().optional().describe('Benchmark name (required for create)'),
211
+ description: z.string().optional().describe('Benchmark description'),
212
+ variants: z
213
+ .array(variantSchema)
214
+ .optional()
215
+ .describe('Variants to compare (required for create, min 2)'),
216
+ metrics: z
217
+ .array(z.string())
218
+ .optional()
219
+ .describe('Metrics to track (e.g., ["cost", "latency", "success_rate"])'),
220
+ minSessions: z
221
+ .number()
222
+ .int()
223
+ .optional()
224
+ .describe('Minimum sessions per variant before results are meaningful'),
225
+ agentId: z.string().optional().describe('Agent ID to scope the benchmark to'),
226
+ // List params
227
+ status: z.string().optional().describe('Filter by status (for list action)'),
228
+ // Status/Results/Lifecycle params
229
+ benchmarkId: z.string().optional().describe('Benchmark ID (required for status/results/start/complete)'),
230
+ }, async (params) => {
231
+ try {
232
+ switch (params.action) {
233
+ case 'create':
234
+ return await handleCreate(transport, params);
235
+ case 'list':
236
+ return await handleList(transport, params);
237
+ case 'status':
238
+ return await handleStatus(transport, params);
239
+ case 'results':
240
+ return await handleResults(transport, params);
241
+ case 'start':
242
+ return await handleStart(transport, params);
243
+ case 'complete':
244
+ return await handleComplete(transport, params);
245
+ default:
246
+ return {
247
+ content: [
248
+ {
249
+ type: 'text',
250
+ text: `Unknown action: ${params.action}`,
251
+ },
252
+ ],
253
+ isError: true,
254
+ };
255
+ }
256
+ }
257
+ catch (error) {
258
+ const message = error instanceof Error ? error.message : 'Unknown error';
259
+ if (message.includes('404')) {
260
+ return {
261
+ content: [
262
+ {
263
+ type: 'text',
264
+ text: `Benchmark not found. Check the benchmark ID and try again.`,
265
+ },
266
+ ],
267
+ isError: true,
268
+ };
269
+ }
270
+ return {
271
+ content: [
272
+ {
273
+ type: 'text',
274
+ text: `Error: ${message}`,
275
+ },
276
+ ],
277
+ isError: true,
278
+ };
279
+ }
280
+ });
281
+ }
282
+ async function handleCreate(transport, params) {
283
+ // Validation
284
+ if (!params.name) {
285
+ return {
286
+ content: [{ type: 'text', text: 'Validation error: "name" is required for create action.' }],
287
+ isError: true,
288
+ };
289
+ }
290
+ if (!params.variants || params.variants.length < 2) {
291
+ return {
292
+ content: [
293
+ { type: 'text', text: 'Validation error: At least 2 variants are required for create action.' },
294
+ ],
295
+ isError: true,
296
+ };
297
+ }
298
+ const body = {
299
+ name: params.name,
300
+ variants: params.variants,
301
+ };
302
+ if (params.description)
303
+ body.description = params.description;
304
+ if (params.metrics)
305
+ body.metrics = params.metrics;
306
+ if (params.minSessions !== undefined)
307
+ body.minSessions = params.minSessions;
308
+ if (params.agentId)
309
+ body.agentId = params.agentId;
310
+ const data = (await transport.createBenchmark(body));
311
+ return {
312
+ content: [{ type: 'text', text: formatBenchmarkCreated(data) }],
313
+ };
314
+ }
315
+ async function handleList(transport, params) {
316
+ const data = (await transport.listBenchmarks(params.status));
317
+ return {
318
+ content: [{ type: 'text', text: formatBenchmarkList(data.benchmarks) }],
319
+ };
320
+ }
321
+ async function handleStatus(transport, params) {
322
+ if (!params.benchmarkId) {
323
+ return {
324
+ content: [{ type: 'text', text: 'Validation error: "benchmarkId" is required for status action.' }],
325
+ isError: true,
326
+ };
327
+ }
328
+ const data = (await transport.getBenchmark(params.benchmarkId));
329
+ return {
330
+ content: [{ type: 'text', text: formatBenchmarkStatus(data) }],
331
+ };
332
+ }
333
+ async function handleResults(transport, params) {
334
+ if (!params.benchmarkId) {
335
+ return {
336
+ content: [{ type: 'text', text: 'Validation error: "benchmarkId" is required for results action.' }],
337
+ isError: true,
338
+ };
339
+ }
340
+ const data = (await transport.getBenchmarkResults(params.benchmarkId));
341
+ return {
342
+ content: [{ type: 'text', text: formatBenchmarkResults(data) }],
343
+ };
344
+ }
345
+ async function handleStart(transport, params) {
346
+ if (!params.benchmarkId) {
347
+ return {
348
+ content: [{ type: 'text', text: 'Validation error: "benchmarkId" is required for start action.' }],
349
+ isError: true,
350
+ };
351
+ }
352
+ const data = (await transport.updateBenchmarkStatus(params.benchmarkId, 'running'));
353
+ return {
354
+ content: [
355
+ {
356
+ type: 'text',
357
+ text: `🏃 Benchmark "${data.name}" is now running.\n\nTag sessions with variant tags to collect data. Check progress with action: "status".`,
358
+ },
359
+ ],
360
+ };
361
+ }
362
+ async function handleComplete(transport, params) {
363
+ if (!params.benchmarkId) {
364
+ return {
365
+ content: [{ type: 'text', text: 'Validation error: "benchmarkId" is required for complete action.' }],
366
+ isError: true,
367
+ };
368
+ }
369
+ const data = (await transport.updateBenchmarkStatus(params.benchmarkId, 'completed'));
370
+ let text = `✅ Benchmark "${data.name}" is now completed.`;
371
+ if (data.results) {
372
+ text += '\n\n' + formatBenchmarkResults(data.results);
373
+ }
374
+ return {
375
+ content: [{ type: 'text', text }],
376
+ };
377
+ }
378
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/tools/benchmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * agentlens_health MCP Tool (Story 1.5)
3
+ *
4
+ * Check the health score of the current agent.
5
+ * Returns overall score (0-100), trend, and dimension breakdown.
6
+ */
7
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { AgentLensTransport } from '../transport.js';
9
+ /** Type for the health score response from the API */
10
+ interface HealthScoreResponse {
11
+ agentId: string;
12
+ overallScore: number;
13
+ trend: 'improving' | 'stable' | 'degrading';
14
+ trendDelta: number;
15
+ dimensions: Array<{
16
+ name: string;
17
+ score: number;
18
+ weight: number;
19
+ rawValue: number;
20
+ description: string;
21
+ }>;
22
+ window: {
23
+ from: string;
24
+ to: string;
25
+ };
26
+ sessionCount: number;
27
+ computedAt: string;
28
+ }
29
+ export declare function formatHealthScore(data: HealthScoreResponse): string;
30
+ export declare function registerHealthTool(server: McpServer, transport: AgentLensTransport): void;
31
+ export {};
32
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,sDAAsD;AACtD,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAsBnE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAwEzF"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * agentlens_health MCP Tool (Story 1.5)
3
+ *
4
+ * Check the health score of the current agent.
5
+ * Returns overall score (0-100), trend, and dimension breakdown.
6
+ */
7
+ import { z } from 'zod';
8
+ /** Dimension display names */
9
+ const DIMENSION_LABELS = {
10
+ error_rate: 'Error Rate',
11
+ cost_efficiency: 'Cost Efficiency',
12
+ tool_success: 'Tool Success',
13
+ latency: 'Latency',
14
+ completion_rate: 'Completion Rate',
15
+ };
16
+ /** Trend arrows */
17
+ const TREND_ARROWS = {
18
+ improving: '↑',
19
+ stable: '→',
20
+ degrading: '↓',
21
+ };
22
+ export function formatHealthScore(data) {
23
+ const arrow = TREND_ARROWS[data.trend] ?? '→';
24
+ const deltaStr = data.trendDelta >= 0 ? `+${data.trendDelta}pts` : `${data.trendDelta}pts`;
25
+ const parts = [];
26
+ parts.push(`Health Score: ${Math.round(data.overallScore)}/100 (${arrow} ${data.trend}, ${deltaStr})`);
27
+ parts.push('');
28
+ parts.push('Dimensions:');
29
+ for (const dim of data.dimensions) {
30
+ const label = DIMENSION_LABELS[dim.name] ?? dim.name;
31
+ const padded = `${label}:`.padEnd(18);
32
+ parts.push(` ${padded}${Math.round(dim.score)}/100 (weight: ${dim.weight.toFixed(2)})`);
33
+ }
34
+ // Format window dates (just the date portion)
35
+ const fromDate = data.window.from.slice(0, 10);
36
+ const toDate = data.window.to.slice(0, 10);
37
+ parts.push('');
38
+ parts.push(`Window: ${fromDate} to ${toDate} (${data.sessionCount} sessions)`);
39
+ return parts.join('\n');
40
+ }
41
+ export function registerHealthTool(server, transport) {
42
+ server.tool('agentlens_health', `Check the health score of the current agent. Returns overall score (0-100), trend, and dimension breakdown.
43
+
44
+ **When to use:** To assess the current health and performance of the agent, to check if error rates or latency are degrading, or to get a quick overview of agent reliability metrics.
45
+
46
+ **What it returns:** An overall health score (0-100), a trend indicator (improving/stable/degrading), and a breakdown by five dimensions: error rate, cost efficiency, tool success, latency, and completion rate.
47
+
48
+ **Example:** agentlens_health({ window: 7 }) → returns health score with dimension breakdown for the last 7 days.`, {
49
+ window: z
50
+ .number()
51
+ .optional()
52
+ .describe('Rolling window in days (default: 7)'),
53
+ }, async ({ window }) => {
54
+ try {
55
+ const agentId = transport.getFirstActiveAgent();
56
+ if (!agentId) {
57
+ return {
58
+ content: [
59
+ {
60
+ type: 'text',
61
+ text: 'No active session found. Start a session with agentlens_session_start first, then check health.',
62
+ },
63
+ ],
64
+ isError: true,
65
+ };
66
+ }
67
+ const data = (await transport.getHealth(agentId, window ?? 7));
68
+ return {
69
+ content: [
70
+ {
71
+ type: 'text',
72
+ text: formatHealthScore(data),
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ catch (error) {
78
+ const message = error instanceof Error ? error.message : 'Unknown error';
79
+ // Check for 404 (no sessions)
80
+ if (message.includes('404')) {
81
+ return {
82
+ content: [
83
+ {
84
+ type: 'text',
85
+ text: 'No sessions found for this agent in the specified window. Health scores require at least one completed session.',
86
+ },
87
+ ],
88
+ };
89
+ }
90
+ return {
91
+ content: [
92
+ {
93
+ type: 'text',
94
+ text: `Error checking health: ${message}`,
95
+ },
96
+ ],
97
+ isError: true,
98
+ };
99
+ }
100
+ });
101
+ }
102
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * agentlens_optimize MCP Tool (Story 2.5)
3
+ *
4
+ * Provides cost optimization recommendations via the optimize endpoint.
5
+ * Tool name: agentlens_optimize
6
+ */
7
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { AgentLensTransport } from '../transport.js';
9
+ export declare function registerOptimizeTool(server: McpServer, transport: AgentLensTransport): void;
10
+ //# sourceMappingURL=optimize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAuB1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,GAAG,IAAI,CA4C3F"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * agentlens_optimize MCP Tool (Story 2.5)
3
+ *
4
+ * Provides cost optimization recommendations via the optimize endpoint.
5
+ * Tool name: agentlens_optimize
6
+ */
7
+ import { z } from 'zod';
8
+ export function registerOptimizeTool(server, transport) {
9
+ server.tool('agentlens_optimize', `Get cost optimization recommendations. Analyzes LLM call patterns and suggests cheaper model alternatives.
10
+
11
+ **When to use:** To identify cost-saving opportunities by switching expensive models to cheaper alternatives for tasks that don't require the most capable model. Analyzes call complexity (simple/moderate/complex) and success rates.
12
+
13
+ **What it returns:** A list of model switch recommendations with estimated monthly savings, confidence levels, and success rate comparisons. Sorted by potential savings.
14
+
15
+ **Example:** agentlens_optimize({ period: 7 }) → returns recommendations like "Switch gpt-4o → gpt-4o-mini for SIMPLE tasks, saving $89/month".`, {
16
+ period: z.number().optional().describe('Analysis period in days (default: 7, max: 90)'),
17
+ limit: z.number().optional().describe('Max recommendations to return (default: 5, max: 50)'),
18
+ }, async ({ period, limit }) => {
19
+ try {
20
+ const result = (await transport.getOptimizationRecommendations({
21
+ period: period ?? 7,
22
+ limit: limit ?? 5,
23
+ }));
24
+ const text = formatOptimizationResult(result);
25
+ return {
26
+ content: [
27
+ {
28
+ type: 'text',
29
+ text,
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ catch (error) {
35
+ return {
36
+ content: [
37
+ {
38
+ type: 'text',
39
+ text: `Error getting optimization recommendations: ${error instanceof Error ? error.message : 'Unknown error'}`,
40
+ },
41
+ ],
42
+ isError: true,
43
+ };
44
+ }
45
+ });
46
+ }
47
+ /**
48
+ * Format the optimization result as a readable text block.
49
+ */
50
+ function formatOptimizationResult(result) {
51
+ if (result.recommendations.length === 0) {
52
+ if (result.analyzedCalls === 0) {
53
+ return '💰 Cost Optimization Recommendations\n\nNo LLM call data found for the analysis period. Start logging calls to get recommendations!';
54
+ }
55
+ return `💰 Cost Optimization Recommendations\n\nAnalyzed ${result.analyzedCalls.toLocaleString()} calls over ${result.period} days.\n\nNo recommendations? Your model usage is already optimized! 🎉`;
56
+ }
57
+ const lines = [];
58
+ lines.push('💰 Cost Optimization Recommendations');
59
+ lines.push('');
60
+ lines.push(`Total Potential Savings: $${result.totalPotentialSavings.toFixed(2)}/month (analyzed ${result.analyzedCalls.toLocaleString()} calls over ${result.period} days)`);
61
+ for (let i = 0; i < result.recommendations.length; i++) {
62
+ const rec = result.recommendations[i];
63
+ lines.push('');
64
+ lines.push(`${i + 1}. Switch ${rec.currentModel} → ${rec.recommendedModel} for ${rec.complexityTier.toUpperCase()} tasks`);
65
+ lines.push(` Savings: $${rec.monthlySavings.toFixed(2)}/month | Confidence: ${rec.confidence.toUpperCase()} (${rec.callVolume} calls)`);
66
+ lines.push(` Current success: ${(rec.currentSuccessRate * 100).toFixed(0)}% → Recommended success: ${(rec.recommendedSuccessRate * 100).toFixed(0)}%`);
67
+ }
68
+ return lines.join('\n');
69
+ }
70
+ //# sourceMappingURL=optimize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/tools/optimize.ts"],"names":[],"mappings":"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"}