@agentlensai/mcp 0.3.0 → 0.6.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 (65) hide show
  1. package/dist/__tests__/context.test.d.ts +5 -0
  2. package/dist/__tests__/context.test.d.ts.map +1 -0
  3. package/dist/__tests__/context.test.js +203 -0
  4. package/dist/__tests__/context.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.d.ts +2 -0
  9. package/dist/__tests__/learn.test.d.ts.map +1 -0
  10. package/dist/__tests__/learn.test.js +381 -0
  11. package/dist/__tests__/learn.test.js.map +1 -0
  12. package/dist/__tests__/llm-call.test.js +2 -2
  13. package/dist/__tests__/llm-call.test.js.map +1 -1
  14. package/dist/__tests__/optimize.test.d.ts +5 -0
  15. package/dist/__tests__/optimize.test.d.ts.map +1 -0
  16. package/dist/__tests__/optimize.test.js +218 -0
  17. package/dist/__tests__/optimize.test.js.map +1 -0
  18. package/dist/__tests__/recall.test.d.ts +2 -0
  19. package/dist/__tests__/recall.test.d.ts.map +1 -0
  20. package/dist/__tests__/recall.test.js +193 -0
  21. package/dist/__tests__/recall.test.js.map +1 -0
  22. package/dist/__tests__/reflect.test.d.ts +5 -0
  23. package/dist/__tests__/reflect.test.d.ts.map +1 -0
  24. package/dist/__tests__/reflect.test.js +165 -0
  25. package/dist/__tests__/reflect.test.js.map +1 -0
  26. package/dist/index.js +0 -0
  27. package/dist/server.test.js +8 -2
  28. package/dist/server.test.js.map +1 -1
  29. package/dist/tools/context.d.ts +10 -0
  30. package/dist/tools/context.d.ts.map +1 -0
  31. package/dist/tools/context.js +93 -0
  32. package/dist/tools/context.js.map +1 -0
  33. package/dist/tools/health.d.ts +32 -0
  34. package/dist/tools/health.d.ts.map +1 -0
  35. package/dist/tools/health.js +102 -0
  36. package/dist/tools/health.js.map +1 -0
  37. package/dist/tools/learn.d.ts +10 -0
  38. package/dist/tools/learn.d.ts.map +1 -0
  39. package/dist/tools/learn.js +277 -0
  40. package/dist/tools/learn.js.map +1 -0
  41. package/dist/tools/optimize.d.ts +10 -0
  42. package/dist/tools/optimize.d.ts.map +1 -0
  43. package/dist/tools/optimize.js +70 -0
  44. package/dist/tools/optimize.js.map +1 -0
  45. package/dist/tools/recall.d.ts +10 -0
  46. package/dist/tools/recall.d.ts.map +1 -0
  47. package/dist/tools/recall.js +90 -0
  48. package/dist/tools/recall.js.map +1 -0
  49. package/dist/tools/reflect.d.ts +10 -0
  50. package/dist/tools/reflect.d.ts.map +1 -0
  51. package/dist/tools/reflect.js +61 -0
  52. package/dist/tools/reflect.js.map +1 -0
  53. package/dist/tools.d.ts.map +1 -1
  54. package/dist/tools.js +12 -0
  55. package/dist/tools.js.map +1 -1
  56. package/dist/tools.test.js +7 -1
  57. package/dist/tools.test.js.map +1 -1
  58. package/dist/transport.d.ts +71 -0
  59. package/dist/transport.d.ts.map +1 -1
  60. package/dist/transport.js +187 -0
  61. package/dist/transport.js.map +1 -1
  62. package/package.json +7 -7
  63. package/LICENSE +0 -21
  64. package/dist/server.test.d.ts +0 -2
  65. package/dist/tools.test.d.ts +0 -2
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for agentlens_context MCP tool (Story 5.3)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Tests for agentlens_context MCP tool (Story 5.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
+ const mockFetch = vi.fn();
11
+ beforeEach(() => {
12
+ vi.stubGlobal('fetch', mockFetch);
13
+ mockFetch.mockReset();
14
+ });
15
+ afterEach(() => {
16
+ vi.unstubAllGlobals();
17
+ });
18
+ function okResponse(data = {}) {
19
+ return new Response(JSON.stringify(data), {
20
+ status: 200,
21
+ headers: { 'Content-Type': 'application/json' },
22
+ });
23
+ }
24
+ function errorResponse(status, body) {
25
+ return new Response(body, { status });
26
+ }
27
+ async function createTestSetup() {
28
+ const transport = new AgentLensTransport({
29
+ baseUrl: 'http://localhost:3400',
30
+ apiKey: 'test-key',
31
+ });
32
+ const server = new McpServer({ name: 'agentlens-test', version: '0.0.0' }, { capabilities: { tools: {} } });
33
+ registerTools(server, transport);
34
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
35
+ const client = new Client({ name: 'test-client', version: '1.0.0' });
36
+ await server.connect(serverTransport);
37
+ await client.connect(clientTransport);
38
+ return { server, client, transport };
39
+ }
40
+ describe('agentlens_context', () => {
41
+ it('calls the context API with correct parameters', async () => {
42
+ const contextResult = {
43
+ topic: 'deployment',
44
+ sessions: [
45
+ {
46
+ sessionId: 'ses-1',
47
+ agentId: 'agent-1',
48
+ summary: 'Agent deployed to production',
49
+ relevanceScore: 0.85,
50
+ startedAt: '2024-01-01T00:00:00Z',
51
+ endedAt: '2024-01-01T01:00:00Z',
52
+ keyEvents: [
53
+ { id: 'ev-1', eventType: 'tool_call', summary: 'tool_call: deploy()', timestamp: '2024-01-01T00:30:00Z' },
54
+ ],
55
+ },
56
+ ],
57
+ lessons: [
58
+ {
59
+ id: 'les-1',
60
+ title: 'Always verify deploy',
61
+ content: 'Check health endpoint after deploying',
62
+ category: 'operations',
63
+ importance: 'high',
64
+ relevanceScore: 0.78,
65
+ },
66
+ ],
67
+ totalSessions: 1,
68
+ };
69
+ mockFetch.mockResolvedValueOnce(okResponse(contextResult));
70
+ const { client } = await createTestSetup();
71
+ const result = await client.callTool({
72
+ name: 'agentlens_context',
73
+ arguments: {
74
+ topic: 'deployment',
75
+ agentId: 'my-agent',
76
+ limit: 5,
77
+ },
78
+ });
79
+ // Verify the fetch was called with the right URL
80
+ expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining('/api/context?'), expect.objectContaining({
81
+ method: 'GET',
82
+ headers: expect.objectContaining({
83
+ Authorization: 'Bearer test-key',
84
+ }),
85
+ }));
86
+ const fetchUrl = mockFetch.mock.calls[0][0];
87
+ expect(fetchUrl).toContain('topic=deployment');
88
+ expect(fetchUrl).toContain('agentId=my-agent');
89
+ expect(fetchUrl).toContain('limit=5');
90
+ // Verify the result contains formatted data
91
+ expect(result.isError).toBeUndefined();
92
+ const content = result.content;
93
+ expect(content[0].text).toContain('ses-1');
94
+ expect(content[0].text).toContain('deployed to production');
95
+ expect(content[0].text).toContain('Always verify deploy');
96
+ });
97
+ it('handles empty results gracefully', async () => {
98
+ mockFetch.mockResolvedValueOnce(okResponse({
99
+ topic: 'nonexistent',
100
+ sessions: [],
101
+ lessons: [],
102
+ totalSessions: 0,
103
+ }));
104
+ const { client } = await createTestSetup();
105
+ const result = await client.callTool({
106
+ name: 'agentlens_context',
107
+ arguments: { topic: 'nonexistent' },
108
+ });
109
+ expect(result.isError).toBeUndefined();
110
+ const content = result.content;
111
+ expect(content[0].text).toContain('No relevant context found');
112
+ });
113
+ it('returns error on API failure', async () => {
114
+ mockFetch.mockResolvedValueOnce(errorResponse(500, 'Internal Server Error'));
115
+ const { client } = await createTestSetup();
116
+ const result = await client.callTool({
117
+ name: 'agentlens_context',
118
+ arguments: { topic: 'test' },
119
+ });
120
+ expect(result.isError).toBe(true);
121
+ const content = result.content;
122
+ expect(content[0].text).toContain('Error retrieving context');
123
+ });
124
+ it('returns error on network failure', async () => {
125
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
126
+ const { client } = await createTestSetup();
127
+ const result = await client.callTool({
128
+ name: 'agentlens_context',
129
+ arguments: { topic: 'test' },
130
+ });
131
+ expect(result.isError).toBe(true);
132
+ const content = result.content;
133
+ expect(content[0].text).toContain('Connection refused');
134
+ });
135
+ it('handles sessions-only results (no lessons)', async () => {
136
+ mockFetch.mockResolvedValueOnce(okResponse({
137
+ topic: 'file operations',
138
+ sessions: [
139
+ {
140
+ sessionId: 'ses-1',
141
+ agentId: 'agent-1',
142
+ summary: 'Agent ran file operations',
143
+ relevanceScore: 0.9,
144
+ startedAt: '2024-01-01T00:00:00Z',
145
+ keyEvents: [],
146
+ },
147
+ ],
148
+ lessons: [],
149
+ totalSessions: 1,
150
+ }));
151
+ const { client } = await createTestSetup();
152
+ const result = await client.callTool({
153
+ name: 'agentlens_context',
154
+ arguments: { topic: 'file operations' },
155
+ });
156
+ expect(result.isError).toBeUndefined();
157
+ const content = result.content;
158
+ expect(content[0].text).toContain('Related Sessions (1)');
159
+ expect(content[0].text).toContain('file operations');
160
+ });
161
+ it('handles lessons-only results (no sessions)', async () => {
162
+ mockFetch.mockResolvedValueOnce(okResponse({
163
+ topic: 'database',
164
+ sessions: [],
165
+ lessons: [
166
+ {
167
+ id: 'les-1',
168
+ title: 'Database tips',
169
+ content: 'Always index your queries',
170
+ category: 'performance',
171
+ importance: 'normal',
172
+ relevanceScore: 0.75,
173
+ },
174
+ ],
175
+ totalSessions: 0,
176
+ }));
177
+ const { client } = await createTestSetup();
178
+ const result = await client.callTool({
179
+ name: 'agentlens_context',
180
+ arguments: { topic: 'database' },
181
+ });
182
+ expect(result.isError).toBeUndefined();
183
+ const content = result.content;
184
+ expect(content[0].text).toContain('Database tips');
185
+ expect(content[0].text).toContain('Related Lessons (1)');
186
+ });
187
+ it('sends optional userId parameter', async () => {
188
+ mockFetch.mockResolvedValueOnce(okResponse({
189
+ topic: 'test',
190
+ sessions: [],
191
+ lessons: [],
192
+ totalSessions: 0,
193
+ }));
194
+ const { client } = await createTestSetup();
195
+ await client.callTool({
196
+ name: 'agentlens_context',
197
+ arguments: { topic: 'test', userId: 'user-123' },
198
+ });
199
+ const fetchUrl = mockFetch.mock.calls[0][0];
200
+ expect(fetchUrl).toContain('userId=user-123');
201
+ });
202
+ });
203
+ //# sourceMappingURL=context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../src/__tests__/context.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/health.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Tests for agentlens_health MCP tool (Story 1.5)
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 { formatHealthScore } from '../tools/health.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_HEALTH_SCORE = {
29
+ agentId: 'test-agent',
30
+ overallScore: 82,
31
+ trend: 'improving',
32
+ trendDelta: 7,
33
+ dimensions: [
34
+ { name: 'error_rate', score: 90, weight: 0.30, rawValue: 0.1, description: '1/10 sessions had errors' },
35
+ { name: 'cost_efficiency', score: 75, weight: 0.20, rawValue: 0.005, description: 'Avg cost per session: $0.0050' },
36
+ { name: 'tool_success', score: 85, weight: 0.20, rawValue: 0.85, description: '17/20 tool calls succeeded' },
37
+ { name: 'latency', score: 78, weight: 0.15, rawValue: 1200, description: 'Avg session duration: 1200ms' },
38
+ { name: 'completion_rate', score: 80, weight: 0.15, rawValue: 0.8, description: '8/10 sessions completed' },
39
+ ],
40
+ window: { from: '2026-02-01T00:00:00.000Z', to: '2026-02-08T00:00:00.000Z' },
41
+ sessionCount: 42,
42
+ computedAt: '2026-02-08T12:00:00.000Z',
43
+ };
44
+ async function createTestSetup() {
45
+ const transport = new AgentLensTransport({
46
+ baseUrl: 'http://localhost:3400',
47
+ apiKey: 'test-key',
48
+ });
49
+ const server = new McpServer({ name: 'agentlens-test', version: '0.0.0' }, { capabilities: { tools: {} } });
50
+ registerTools(server, transport);
51
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
52
+ const client = new Client({ name: 'test-client', version: '1.0.0' });
53
+ await server.connect(serverTransport);
54
+ await client.connect(clientTransport);
55
+ return { server, client, transport };
56
+ }
57
+ describe('agentlens_health', () => {
58
+ it('tool is registered with correct schema', async () => {
59
+ const { client } = await createTestSetup();
60
+ const result = await client.listTools();
61
+ const tool = result.tools.find((t) => t.name === 'agentlens_health');
62
+ expect(tool).toBeDefined();
63
+ expect(tool.description).toContain('health score');
64
+ // Check inputSchema has window property
65
+ const schema = tool.inputSchema;
66
+ expect(schema.properties).toHaveProperty('window');
67
+ });
68
+ it('total tool count is 11', async () => {
69
+ const { client } = await createTestSetup();
70
+ const result = await client.listTools();
71
+ expect(result.tools).toHaveLength(11);
72
+ });
73
+ it('returns formatted output with score, trend, and dimensions', async () => {
74
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
75
+ const { client, transport } = await createTestSetup();
76
+ // Set up an active session so the tool has an agentId
77
+ transport.setSessionAgent('ses_test', 'test-agent');
78
+ const result = await client.callTool({
79
+ name: 'agentlens_health',
80
+ arguments: { window: 7 },
81
+ });
82
+ expect(result.isError).toBeUndefined();
83
+ const content = result.content;
84
+ const text = content[0].text;
85
+ expect(text).toContain('Health Score: 82/100');
86
+ expect(text).toContain('improving');
87
+ expect(text).toContain('+7pts');
88
+ expect(text).toContain('Error Rate:');
89
+ expect(text).toContain('Cost Efficiency:');
90
+ expect(text).toContain('Tool Success:');
91
+ expect(text).toContain('Latency:');
92
+ expect(text).toContain('Completion Rate:');
93
+ expect(text).toContain('42 sessions');
94
+ });
95
+ it('handles no sessions (404 from API)', async () => {
96
+ mockFetch.mockResolvedValueOnce(errorResponse(404, JSON.stringify({ error: 'No sessions found for agent in window' })));
97
+ const { client, transport } = await createTestSetup();
98
+ transport.setSessionAgent('ses_test', 'test-agent');
99
+ const result = await client.callTool({
100
+ name: 'agentlens_health',
101
+ arguments: {},
102
+ });
103
+ // Should not be isError — just informational
104
+ expect(result.isError).toBeUndefined();
105
+ const content = result.content;
106
+ expect(content[0].text).toContain('No sessions found');
107
+ });
108
+ it('uses default window of 7', async () => {
109
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
110
+ const { client, transport } = await createTestSetup();
111
+ transport.setSessionAgent('ses_test', 'test-agent');
112
+ await client.callTool({
113
+ name: 'agentlens_health',
114
+ arguments: {},
115
+ });
116
+ // Verify fetch was called with window=7
117
+ const fetchUrl = mockFetch.mock.calls[0][0];
118
+ expect(fetchUrl).toContain('window=7');
119
+ });
120
+ it('passes custom window parameter', async () => {
121
+ mockFetch.mockResolvedValueOnce(okResponse(MOCK_HEALTH_SCORE));
122
+ const { client, transport } = await createTestSetup();
123
+ transport.setSessionAgent('ses_test', 'test-agent');
124
+ await client.callTool({
125
+ name: 'agentlens_health',
126
+ arguments: { window: 30 },
127
+ });
128
+ const fetchUrl = mockFetch.mock.calls[0][0];
129
+ expect(fetchUrl).toContain('window=30');
130
+ });
131
+ it('returns error when no active session', async () => {
132
+ const { client } = await createTestSetup();
133
+ const result = await client.callTool({
134
+ name: 'agentlens_health',
135
+ arguments: {},
136
+ });
137
+ expect(result.isError).toBe(true);
138
+ const content = result.content;
139
+ expect(content[0].text).toContain('No active session');
140
+ });
141
+ it('handles network errors', async () => {
142
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
143
+ const { client, transport } = await createTestSetup();
144
+ transport.setSessionAgent('ses_test', 'test-agent');
145
+ const result = await client.callTool({
146
+ name: 'agentlens_health',
147
+ arguments: {},
148
+ });
149
+ expect(result.isError).toBe(true);
150
+ const content = result.content;
151
+ expect(content[0].text).toContain('Connection refused');
152
+ });
153
+ });
154
+ describe('formatHealthScore', () => {
155
+ it('formats health score as readable text', () => {
156
+ const text = formatHealthScore(MOCK_HEALTH_SCORE);
157
+ expect(text).toContain('Health Score: 82/100');
158
+ expect(text).toContain('↑ improving');
159
+ expect(text).toContain('+7pts');
160
+ expect(text).toContain('Dimensions:');
161
+ expect(text).toContain('Error Rate:');
162
+ expect(text).toContain('90/100 (weight: 0.30)');
163
+ expect(text).toContain('Window: 2026-02-01 to 2026-02-08 (42 sessions)');
164
+ });
165
+ it('formats degrading trend correctly', () => {
166
+ const degrading = {
167
+ ...MOCK_HEALTH_SCORE,
168
+ trend: 'degrading',
169
+ trendDelta: -10,
170
+ };
171
+ const text = formatHealthScore(degrading);
172
+ expect(text).toContain('↓ degrading');
173
+ expect(text).toContain('-10pts');
174
+ });
175
+ });
176
+ //# sourceMappingURL=health.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.test.js","sourceRoot":"","sources":["../../src/__tests__/health.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=learn.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/learn.test.ts"],"names":[],"mappings":""}