cache-overflow-mcp 0.3.3 → 0.3.5
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.
- package/.env.example +3 -3
- package/AGENTS.md +24 -3
- package/README.md +59 -0
- package/TROUBLESHOOTING.md +219 -0
- package/dist/cli.js +13 -1
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +54 -10
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/logger.d.ts +16 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +127 -0
- package/dist/logger.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +50 -7
- package/dist/server.js.map +1 -1
- package/dist/testing/mock-data.js +40 -40
- package/dist/ui/verification-dialog.d.ts.map +1 -1
- package/dist/ui/verification-dialog.js +307 -268
- package/dist/ui/verification-dialog.js.map +1 -1
- package/package.json +3 -2
- package/scripts/view-logs.js +125 -0
- package/src/cli.ts +23 -10
- package/src/client.test.ts +116 -116
- package/src/client.ts +122 -76
- package/src/config.ts +14 -9
- package/src/index.ts +3 -3
- package/src/logger.ts +150 -0
- package/src/server.ts +49 -7
- package/src/testing/mock-data.ts +142 -142
- package/src/testing/mock-server.ts +176 -176
- package/src/tools/index.ts +23 -23
- package/src/types.ts +39 -39
- package/src/ui/verification-dialog.ts +382 -342
- package/tsconfig.json +20 -20
- package/dist/tools/get-balance.d.ts +0 -3
- package/dist/tools/get-balance.d.ts.map +0 -1
- package/dist/tools/get-balance.js +0 -34
- package/dist/tools/get-balance.js.map +0 -1
package/dist/server.js
CHANGED
|
@@ -4,13 +4,14 @@ import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema
|
|
|
4
4
|
import { CacheOverflowClient } from './client.js';
|
|
5
5
|
import { tools } from './tools/index.js';
|
|
6
6
|
import { prompts } from './prompts/index.js';
|
|
7
|
+
import { logger } from './logger.js';
|
|
7
8
|
export class CacheOverflowServer {
|
|
8
9
|
server;
|
|
9
10
|
client;
|
|
10
11
|
constructor() {
|
|
11
12
|
this.server = new Server({
|
|
12
13
|
name: 'cache-overflow',
|
|
13
|
-
version: '0.3.
|
|
14
|
+
version: '0.3.5',
|
|
14
15
|
}, {
|
|
15
16
|
capabilities: {
|
|
16
17
|
tools: {},
|
|
@@ -28,9 +29,28 @@ export class CacheOverflowServer {
|
|
|
28
29
|
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
29
30
|
const tool = tools.find((t) => t.definition.name === request.params.name);
|
|
30
31
|
if (!tool) {
|
|
31
|
-
|
|
32
|
+
const error = new Error(`Unknown tool: ${request.params.name}`);
|
|
33
|
+
logger.error('Unknown tool requested', error, {
|
|
34
|
+
toolName: request.params.name,
|
|
35
|
+
availableTools: tools.map(t => t.definition.name),
|
|
36
|
+
});
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
logger.info(`Executing tool: ${request.params.name}`, {
|
|
41
|
+
toolName: request.params.name,
|
|
42
|
+
// Don't log full arguments as they might contain sensitive data
|
|
43
|
+
hasArguments: Object.keys(request.params.arguments ?? {}).length > 0,
|
|
44
|
+
});
|
|
45
|
+
return await tool.handler(request.params.arguments ?? {}, this.client);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
logger.error(`Tool execution failed: ${request.params.name}`, error, {
|
|
49
|
+
toolName: request.params.name,
|
|
50
|
+
errorType: 'TOOL_EXECUTION_FAILURE',
|
|
51
|
+
});
|
|
52
|
+
throw error;
|
|
32
53
|
}
|
|
33
|
-
return tool.handler(request.params.arguments ?? {}, this.client);
|
|
34
54
|
});
|
|
35
55
|
// Prompt handlers
|
|
36
56
|
this.server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
@@ -39,14 +59,37 @@ export class CacheOverflowServer {
|
|
|
39
59
|
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
40
60
|
const prompt = prompts.find((p) => p.definition.name === request.params.name);
|
|
41
61
|
if (!prompt) {
|
|
42
|
-
|
|
62
|
+
const error = new Error(`Unknown prompt: ${request.params.name}`);
|
|
63
|
+
logger.error('Unknown prompt requested', error, {
|
|
64
|
+
promptName: request.params.name,
|
|
65
|
+
availablePrompts: prompts.map(p => p.definition.name),
|
|
66
|
+
});
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
return await prompt.handler(request.params.arguments ?? {});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.error(`Prompt execution failed: ${request.params.name}`, error, {
|
|
74
|
+
promptName: request.params.name,
|
|
75
|
+
errorType: 'PROMPT_EXECUTION_FAILURE',
|
|
76
|
+
});
|
|
77
|
+
throw error;
|
|
43
78
|
}
|
|
44
|
-
return prompt.handler(request.params.arguments ?? {});
|
|
45
79
|
});
|
|
46
80
|
}
|
|
47
81
|
async start() {
|
|
48
|
-
|
|
49
|
-
|
|
82
|
+
try {
|
|
83
|
+
const transport = new StdioServerTransport();
|
|
84
|
+
await this.server.connect(transport);
|
|
85
|
+
logger.info('MCP server connected successfully via stdio transport');
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
logger.error('Failed to connect MCP server', error, {
|
|
89
|
+
errorType: 'CONNECTION_FAILURE',
|
|
90
|
+
});
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
50
93
|
}
|
|
51
94
|
}
|
|
52
95
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,16 +3,16 @@ export const mockSolutions = [
|
|
|
3
3
|
id: 'sol_001',
|
|
4
4
|
author_id: 'user_123',
|
|
5
5
|
query_title: 'How to implement binary search in TypeScript',
|
|
6
|
-
solution_body: `function binarySearch<T>(arr: T[], target: T): number {
|
|
7
|
-
let left = 0;
|
|
8
|
-
let right = arr.length - 1;
|
|
9
|
-
while (left <= right) {
|
|
10
|
-
const mid = Math.floor((left + right) / 2);
|
|
11
|
-
if (arr[mid] === target) return mid;
|
|
12
|
-
if (arr[mid] < target) left = mid + 1;
|
|
13
|
-
else right = mid - 1;
|
|
14
|
-
}
|
|
15
|
-
return -1;
|
|
6
|
+
solution_body: `function binarySearch<T>(arr: T[], target: T): number {
|
|
7
|
+
let left = 0;
|
|
8
|
+
let right = arr.length - 1;
|
|
9
|
+
while (left <= right) {
|
|
10
|
+
const mid = Math.floor((left + right) / 2);
|
|
11
|
+
if (arr[mid] === target) return mid;
|
|
12
|
+
if (arr[mid] < target) left = mid + 1;
|
|
13
|
+
else right = mid - 1;
|
|
14
|
+
}
|
|
15
|
+
return -1;
|
|
16
16
|
}`,
|
|
17
17
|
price_current: 50,
|
|
18
18
|
verification_state: 'VERIFIED',
|
|
@@ -24,13 +24,13 @@ export const mockSolutions = [
|
|
|
24
24
|
id: 'sol_002',
|
|
25
25
|
author_id: 'user_456',
|
|
26
26
|
query_title: 'Fix memory leak in Node.js event listeners',
|
|
27
|
-
solution_body: `// Always remove event listeners when done
|
|
28
|
-
const handler = () => { /* ... */ };
|
|
29
|
-
emitter.on('event', handler);
|
|
30
|
-
// Later:
|
|
31
|
-
emitter.off('event', handler);
|
|
32
|
-
|
|
33
|
-
// Or use once() for one-time listeners
|
|
27
|
+
solution_body: `// Always remove event listeners when done
|
|
28
|
+
const handler = () => { /* ... */ };
|
|
29
|
+
emitter.on('event', handler);
|
|
30
|
+
// Later:
|
|
31
|
+
emitter.off('event', handler);
|
|
32
|
+
|
|
33
|
+
// Or use once() for one-time listeners
|
|
34
34
|
emitter.once('event', () => { /* ... */ });`,
|
|
35
35
|
price_current: 75,
|
|
36
36
|
verification_state: 'VERIFIED',
|
|
@@ -42,14 +42,14 @@ emitter.once('event', () => { /* ... */ });`,
|
|
|
42
42
|
id: 'sol_003',
|
|
43
43
|
author_id: 'user_789',
|
|
44
44
|
query_title: 'Optimize React re-renders with useMemo',
|
|
45
|
-
solution_body: `import { useMemo } from 'react';
|
|
46
|
-
|
|
47
|
-
function ExpensiveComponent({ data }) {
|
|
48
|
-
const processed = useMemo(() => {
|
|
49
|
-
return data.map(item => heavyComputation(item));
|
|
50
|
-
}, [data]);
|
|
51
|
-
|
|
52
|
-
return <div>{processed}</div>;
|
|
45
|
+
solution_body: `import { useMemo } from 'react';
|
|
46
|
+
|
|
47
|
+
function ExpensiveComponent({ data }) {
|
|
48
|
+
const processed = useMemo(() => {
|
|
49
|
+
return data.map(item => heavyComputation(item));
|
|
50
|
+
}, [data]);
|
|
51
|
+
|
|
52
|
+
return <div>{processed}</div>;
|
|
53
53
|
}`,
|
|
54
54
|
price_current: 60,
|
|
55
55
|
verification_state: 'PENDING',
|
|
@@ -67,27 +67,27 @@ export const mockFindResults = [
|
|
|
67
67
|
{
|
|
68
68
|
solution_id: 'sol_002',
|
|
69
69
|
query_title: 'Fix memory leak in Node.js event listeners',
|
|
70
|
-
solution_body: `// Always remove event listeners when done
|
|
71
|
-
const handler = () => { /* ... */ };
|
|
72
|
-
emitter.on('event', handler);
|
|
73
|
-
// Later:
|
|
74
|
-
emitter.off('event', handler);
|
|
75
|
-
|
|
76
|
-
// Or use once() for one-time listeners
|
|
70
|
+
solution_body: `// Always remove event listeners when done
|
|
71
|
+
const handler = () => { /* ... */ };
|
|
72
|
+
emitter.on('event', handler);
|
|
73
|
+
// Later:
|
|
74
|
+
emitter.off('event', handler);
|
|
75
|
+
|
|
76
|
+
// Or use once() for one-time listeners
|
|
77
77
|
emitter.once('event', () => { /* ... */ });`,
|
|
78
78
|
human_verification_required: true,
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
solution_id: 'sol_003',
|
|
82
82
|
query_title: 'Optimize React re-renders with useMemo',
|
|
83
|
-
solution_body: `import { useMemo } from 'react';
|
|
84
|
-
|
|
85
|
-
function ExpensiveComponent({ data }) {
|
|
86
|
-
const processed = useMemo(() => {
|
|
87
|
-
return data.map(item => heavyComputation(item));
|
|
88
|
-
}, [data]);
|
|
89
|
-
|
|
90
|
-
return <div>{processed}</div>;
|
|
83
|
+
solution_body: `import { useMemo } from 'react';
|
|
84
|
+
|
|
85
|
+
function ExpensiveComponent({ data }) {
|
|
86
|
+
const processed = useMemo(() => {
|
|
87
|
+
return data.map(item => heavyComputation(item));
|
|
88
|
+
}, [data]);
|
|
89
|
+
|
|
90
|
+
return <div>{processed}</div>;
|
|
91
91
|
}`,
|
|
92
92
|
human_verification_required: false,
|
|
93
93
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/verification-dialog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verification-dialog.d.ts","sourceRoot":"","sources":["../../src/ui/verification-dialog.ts"],"names":[],"mappings":"AA0RA;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CA0FzB"}
|