@softtechai/quickmcp 1.0.8
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/README.md +553 -0
- package/dist/client/MCPClient.d.ts +24 -0
- package/dist/client/MCPClient.d.ts.map +1 -0
- package/dist/client/MCPClient.js +211 -0
- package/dist/client/MCPClient.js.map +1 -0
- package/dist/client/MCPClientUnified.d.ts +31 -0
- package/dist/client/MCPClientUnified.d.ts.map +1 -0
- package/dist/client/MCPClientUnified.js +275 -0
- package/dist/client/MCPClientUnified.js.map +1 -0
- package/dist/client/MCPTestRunner.d.ts +44 -0
- package/dist/client/MCPTestRunner.d.ts.map +1 -0
- package/dist/client/MCPTestRunner.js +220 -0
- package/dist/client/MCPTestRunner.js.map +1 -0
- package/dist/client/MCPTestRunnerUnified.d.ts +48 -0
- package/dist/client/MCPTestRunnerUnified.d.ts.map +1 -0
- package/dist/client/MCPTestRunnerUnified.js +183 -0
- package/dist/client/MCPTestRunnerUnified.js.map +1 -0
- package/dist/database/json-manager.d.ts +55 -0
- package/dist/database/json-manager.d.ts.map +1 -0
- package/dist/database/json-manager.js +128 -0
- package/dist/database/json-manager.js.map +1 -0
- package/dist/database/sqlite-manager.d.ts +53 -0
- package/dist/database/sqlite-manager.d.ts.map +1 -0
- package/dist/database/sqlite-manager.js +193 -0
- package/dist/database/sqlite-manager.js.map +1 -0
- package/dist/dynamic-mcp-executor.d.ts +14 -0
- package/dist/dynamic-mcp-executor.d.ts.map +1 -0
- package/dist/dynamic-mcp-executor.js +274 -0
- package/dist/dynamic-mcp-executor.js.map +1 -0
- package/dist/generators/MCPServerGenerator-new.d.ts +37 -0
- package/dist/generators/MCPServerGenerator-new.d.ts.map +1 -0
- package/dist/generators/MCPServerGenerator-new.js +287 -0
- package/dist/generators/MCPServerGenerator-new.js.map +1 -0
- package/dist/generators/MCPServerGenerator.d.ts +42 -0
- package/dist/generators/MCPServerGenerator.d.ts.map +1 -0
- package/dist/generators/MCPServerGenerator.js +494 -0
- package/dist/generators/MCPServerGenerator.js.map +1 -0
- package/dist/generators/database/sqlite-manager.d.ts +52 -0
- package/dist/generators/database/sqlite-manager.js +143 -0
- package/dist/generators/generators/MCPServerGenerator.d.ts +37 -0
- package/dist/generators/generators/MCPServerGenerator.js +396 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/integrated-mcp-server-new.d.ts +12 -0
- package/dist/integrated-mcp-server-new.d.ts.map +1 -0
- package/dist/integrated-mcp-server-new.js +253 -0
- package/dist/integrated-mcp-server-new.js.map +1 -0
- package/dist/integrated-mcp-server.d.ts +25 -0
- package/dist/integrated-mcp-server.d.ts.map +1 -0
- package/dist/integrated-mcp-server.js +541 -0
- package/dist/integrated-mcp-server.js.map +1 -0
- package/dist/mcp-inspector-server.d.ts +3 -0
- package/dist/mcp-inspector-server.d.ts.map +1 -0
- package/dist/mcp-inspector-server.js +119 -0
- package/dist/mcp-inspector-server.js.map +1 -0
- package/dist/mcp-sdk-server.d.ts +3 -0
- package/dist/mcp-sdk-server.d.ts.map +1 -0
- package/dist/mcp-sdk-server.js +90 -0
- package/dist/mcp-sdk-server.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +300 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/parsers/CsvParser.d.ts +7 -0
- package/dist/parsers/CsvParser.d.ts.map +1 -0
- package/dist/parsers/CsvParser.js +98 -0
- package/dist/parsers/CsvParser.js.map +1 -0
- package/dist/parsers/DatabaseParser.d.ts +18 -0
- package/dist/parsers/DatabaseParser.d.ts.map +1 -0
- package/dist/parsers/DatabaseParser.js +372 -0
- package/dist/parsers/DatabaseParser.js.map +1 -0
- package/dist/parsers/ExcelParser.d.ts +8 -0
- package/dist/parsers/ExcelParser.d.ts.map +1 -0
- package/dist/parsers/ExcelParser.js +119 -0
- package/dist/parsers/ExcelParser.js.map +1 -0
- package/dist/parsers/index.d.ts +13 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +88 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/parsers/ExcelParser.js +118 -0
- package/dist/parsers/types/index.js +2 -0
- package/dist/quickmcp-unified-bridge.d.ts +13 -0
- package/dist/quickmcp-unified-bridge.d.ts.map +1 -0
- package/dist/quickmcp-unified-bridge.js +176 -0
- package/dist/quickmcp-unified-bridge.js.map +1 -0
- package/dist/server/ServerManager.d.ts +37 -0
- package/dist/server/ServerManager.d.ts.map +1 -0
- package/dist/server/ServerManager.js +376 -0
- package/dist/server/ServerManager.js.map +1 -0
- package/dist/sqlite-manager.js +145 -0
- package/dist/start-new-server.d.ts +3 -0
- package/dist/start-new-server.d.ts.map +1 -0
- package/dist/start-new-server.js +10 -0
- package/dist/start-new-server.js.map +1 -0
- package/dist/test-app.d.ts +2 -0
- package/dist/test-app.d.ts.map +1 -0
- package/dist/test-app.js +119 -0
- package/dist/test-app.js.map +1 -0
- package/dist/test-new-architecture.d.ts +3 -0
- package/dist/test-new-architecture.d.ts.map +1 -0
- package/dist/test-new-architecture.js +72 -0
- package/dist/test-new-architecture.js.map +1 -0
- package/dist/transport/base-transport.d.ts +21 -0
- package/dist/transport/base-transport.d.ts.map +1 -0
- package/dist/transport/base-transport.js +16 -0
- package/dist/transport/base-transport.js.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +12 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/sse-transport.d.ts +13 -0
- package/dist/transport/sse-transport.d.ts.map +1 -0
- package/dist/transport/sse-transport.js +106 -0
- package/dist/transport/sse-transport.js.map +1 -0
- package/dist/transport/stdio-transport.d.ts +8 -0
- package/dist/transport/stdio-transport.d.ts.map +1 -0
- package/dist/transport/stdio-transport.js +53 -0
- package/dist/transport/stdio-transport.js.map +1 -0
- package/dist/transport/streamable-http-transport.d.ts +15 -0
- package/dist/transport/streamable-http-transport.d.ts.map +1 -0
- package/dist/transport/streamable-http-transport.js +151 -0
- package/dist/transport/streamable-http-transport.js.map +1 -0
- package/dist/types/index.d.ts +64 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/web/client/MCPClient.js +348 -0
- package/dist/web/client/MCPTestRunner.js +317 -0
- package/dist/web/database/json-manager.js +124 -0
- package/dist/web/database/sqlite-manager.js +146 -0
- package/dist/web/dynamic-mcp-executor.js +443 -0
- package/dist/web/generators/MCPServerGenerator-new.js +284 -0
- package/dist/web/generators/MCPServerGenerator.js +566 -0
- package/dist/web/integrated-mcp-server-new.js +394 -0
- package/dist/web/parsers/CsvParser.js +144 -0
- package/dist/web/parsers/DatabaseParser.js +637 -0
- package/dist/web/parsers/ExcelParser.js +180 -0
- package/dist/web/parsers/index.js +152 -0
- package/dist/web/server.d.ts +3 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +790 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/types/index.js +2 -0
- package/dist/web/web/server.js +860 -0
- package/package.json +68 -0
- package/quickmcp-direct-stdio.js +328 -0
- package/src/web/public/app.js +1795 -0
- package/src/web/public/database-tables.html +711 -0
- package/src/web/public/how-to-use.html +571 -0
- package/src/web/public/how-to-use.js +255 -0
- package/src/web/public/images/1-claude-quickmcp-stdio.png +0 -0
- package/src/web/public/images/2-claude-tools.png +0 -0
- package/src/web/public/images/3-claude-developer-settings.png +0 -0
- package/src/web/public/images/4-claude-config.png +0 -0
- package/src/web/public/images/5-claude-config-edit.png +0 -0
- package/src/web/public/index.html +626 -0
- package/src/web/public/manage-servers.html +198 -0
- package/src/web/public/modern-styles.css +946 -0
- package/src/web/public/shared-styles.css +2091 -0
- package/src/web/public/shared.js +93 -0
- package/src/web/public/test-servers.html +302 -0
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@softtechai/quickmcp",
|
|
3
|
+
"version": "1.0.8",
|
|
4
|
+
"description": "An application to generate MCP servers from various data sources and test them",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"quickmcp": "quickmcp-direct-stdio.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"start": "node dist/index.js",
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"mcp-server": "tsx src/mcp-server.ts",
|
|
14
|
+
"lint": "eslint src/**/*.ts",
|
|
15
|
+
"typecheck": "tsc --noEmit"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"quickmcp-direct-stdio.js",
|
|
20
|
+
"src/web/public",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=18"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@modelcontextprotocol/sdk": "^0.4.0",
|
|
32
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
33
|
+
"@types/mssql": "^9.1.8",
|
|
34
|
+
"@types/node": "^20.0.0",
|
|
35
|
+
"better-sqlite3": "^12.4.1",
|
|
36
|
+
"cors": "^2.8.5",
|
|
37
|
+
"csv-parser": "^3.0.0",
|
|
38
|
+
"exceljs": "^4.4.0",
|
|
39
|
+
"express": "^4.18.0",
|
|
40
|
+
"mssql": "^11.0.1",
|
|
41
|
+
"multer": "^1.4.5-lts.1",
|
|
42
|
+
"mysql2": "^3.6.0",
|
|
43
|
+
"pg": "^8.11.0",
|
|
44
|
+
"sqlite3": "^5.1.6",
|
|
45
|
+
"ws": "^8.14.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/cors": "^2.8.0",
|
|
49
|
+
"@types/express": "^4.17.0",
|
|
50
|
+
"@types/multer": "^1.4.0",
|
|
51
|
+
"@types/pg": "^8.15.5",
|
|
52
|
+
"@types/ws": "^8.5.0",
|
|
53
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
54
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
55
|
+
"eslint": "^8.0.0",
|
|
56
|
+
"tsx": "^4.0.0",
|
|
57
|
+
"typescript": "^5.0.0"
|
|
58
|
+
},
|
|
59
|
+
"keywords": [
|
|
60
|
+
"mcp",
|
|
61
|
+
"model-context-protocol",
|
|
62
|
+
"server-generator",
|
|
63
|
+
"ai",
|
|
64
|
+
"llm"
|
|
65
|
+
],
|
|
66
|
+
"author": "MCP Server Generator",
|
|
67
|
+
"license": "MIT"
|
|
68
|
+
}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
// Use the current working directory provided by the caller.
|
|
6
|
+
// Do not change directories; keep paths relative to this script.
|
|
7
|
+
|
|
8
|
+
const { SQLiteManager } = require('./dist/database/sqlite-manager.js');
|
|
9
|
+
|
|
10
|
+
// Parse CLI flags for convenience
|
|
11
|
+
// Supported flags:
|
|
12
|
+
// --web | -w | web -> explicitly enable web UI (default: enabled)
|
|
13
|
+
// --no-web -> disable web UI
|
|
14
|
+
// --port=NNNN -> set PORT for web UI
|
|
15
|
+
// --data-dir=PATH -> set QUICKMCP_DATA_DIR for sqlite
|
|
16
|
+
const argv = process.argv.slice(2);
|
|
17
|
+
const wantsWeb = argv.includes('--web') || argv.includes('-w') || argv.includes('web');
|
|
18
|
+
const noWeb = argv.includes('--no-web');
|
|
19
|
+
const portArg = argv.find(a => a.startsWith('--port='));
|
|
20
|
+
const dataDirArg = argv.find(a => a.startsWith('--data-dir='));
|
|
21
|
+
// Default behavior: Web UI enabled unless explicitly disabled
|
|
22
|
+
if (noWeb || process.env.QUICKMCP_ENABLE_WEB === '0' || process.env.QUICKMCP_DISABLE_WEB === '1') {
|
|
23
|
+
process.env.QUICKMCP_ENABLE_WEB = '0';
|
|
24
|
+
} else if (wantsWeb || process.env.QUICKMCP_ENABLE_WEB === '1' || process.env.QUICKMCP_ENABLE_WEB === undefined) {
|
|
25
|
+
process.env.QUICKMCP_ENABLE_WEB = '1';
|
|
26
|
+
}
|
|
27
|
+
if (portArg) {
|
|
28
|
+
const val = portArg.split('=')[1];
|
|
29
|
+
if (val) process.env.PORT = val;
|
|
30
|
+
}
|
|
31
|
+
if (dataDirArg) {
|
|
32
|
+
const val = dataDirArg.split('=')[1];
|
|
33
|
+
if (val) process.env.QUICKMCP_DATA_DIR = val;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Create SQLite manager
|
|
37
|
+
const sqliteManager = new SQLiteManager();
|
|
38
|
+
|
|
39
|
+
// Optionally start the Web UI (Express) like `npm run dev`
|
|
40
|
+
// Enable by setting QUICKMCP_ENABLE_WEB=1 (and optionally PORT, QUICKMCP_DATA_DIR)
|
|
41
|
+
if (process.env.QUICKMCP_ENABLE_WEB === '1') {
|
|
42
|
+
try {
|
|
43
|
+
console.error('[QuickMCP] QUICKMCP_ENABLE_WEB=1 -> starting Web UI server...');
|
|
44
|
+
// This require starts the Express app and integrated MCP sidecar
|
|
45
|
+
require('./dist/web/server.js');
|
|
46
|
+
} catch (e) {
|
|
47
|
+
console.error('[QuickMCP] Failed to start Web UI:', e && e.message);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Diagnostics: print environment and mssql details to help debug Claude Desktop
|
|
52
|
+
try {
|
|
53
|
+
const resolvedDynExec = require.resolve('./dist/dynamic-mcp-executor.js');
|
|
54
|
+
const mssql = require('mssql');
|
|
55
|
+
const mssqlVersion = require('mssql/package.json').version;
|
|
56
|
+
console.error('[QuickMCP] Node:', process.version);
|
|
57
|
+
console.error('[QuickMCP] CWD:', process.cwd());
|
|
58
|
+
console.error('[QuickMCP] Dynamic executor path:', resolvedDynExec);
|
|
59
|
+
console.error('[QuickMCP] mssql version:', mssqlVersion);
|
|
60
|
+
console.error('[QuickMCP] mssql exports:', {
|
|
61
|
+
hasDefault: !!mssql.default,
|
|
62
|
+
hasConnect: typeof mssql.connect,
|
|
63
|
+
typeofConnectionPool: typeof (mssql.ConnectionPool),
|
|
64
|
+
keys: Object.keys(mssql).slice(0, 10)
|
|
65
|
+
});
|
|
66
|
+
} catch (e) {
|
|
67
|
+
console.error('[QuickMCP] Diagnostic init error:', e && e.message);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Direct STDIO MCP implementation with LSP-style framing support
|
|
71
|
+
let stdinBuffer = Buffer.alloc(0);
|
|
72
|
+
let useLspFraming = null; // null until detected; true => LSP, false => line-delimited
|
|
73
|
+
|
|
74
|
+
function sendMessage(message) {
|
|
75
|
+
try {
|
|
76
|
+
const json = JSON.stringify(message);
|
|
77
|
+
if (useLspFraming) {
|
|
78
|
+
const payload = Buffer.from(json, 'utf8');
|
|
79
|
+
const header = Buffer.from(`Content-Length: ${payload.length}\r\n\r\n`, 'utf8');
|
|
80
|
+
const out = Buffer.concat([header, payload]);
|
|
81
|
+
process.stdout.write(out);
|
|
82
|
+
} else {
|
|
83
|
+
process.stdout.write(json + '\n');
|
|
84
|
+
}
|
|
85
|
+
} catch (e) {
|
|
86
|
+
console.error('[QuickMCP] Failed to send message:', e && e.message);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function handleMessage(message) {
|
|
91
|
+
console.error(`[QuickMCP] Received: ${message.method} (id: ${message.id})`);
|
|
92
|
+
|
|
93
|
+
let response;
|
|
94
|
+
|
|
95
|
+
switch (message.method) {
|
|
96
|
+
case 'initialize':
|
|
97
|
+
response = {
|
|
98
|
+
jsonrpc: '2.0',
|
|
99
|
+
id: message.id,
|
|
100
|
+
result: {
|
|
101
|
+
protocolVersion: '2024-11-05',
|
|
102
|
+
serverInfo: { name: 'quickmcp-direct', version: '1.0.0' },
|
|
103
|
+
capabilities: {
|
|
104
|
+
tools: { listChanged: true },
|
|
105
|
+
resources: { listChanged: true },
|
|
106
|
+
prompts: { listChanged: true }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
break;
|
|
111
|
+
|
|
112
|
+
case 'tools/list':
|
|
113
|
+
try {
|
|
114
|
+
const tools = sqliteManager.getAllTools();
|
|
115
|
+
console.error(`[QuickMCP] Got ${tools.length} tools from SQLite`);
|
|
116
|
+
const formattedTools = tools.map(tool => ({
|
|
117
|
+
name: `${tool.server_id}__${tool.name}`,
|
|
118
|
+
description: `[${tool.server_id}] ${tool.description}`,
|
|
119
|
+
inputSchema: typeof tool.inputSchema === 'string' ? JSON.parse(tool.inputSchema) : tool.inputSchema
|
|
120
|
+
}));
|
|
121
|
+
console.error(`[QuickMCP] Formatted ${formattedTools.length} tools`);
|
|
122
|
+
|
|
123
|
+
response = {
|
|
124
|
+
jsonrpc: '2.0',
|
|
125
|
+
id: message.id,
|
|
126
|
+
result: { tools: formattedTools }
|
|
127
|
+
};
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error('[QuickMCP] Error getting tools:', error);
|
|
130
|
+
response = {
|
|
131
|
+
jsonrpc: '2.0',
|
|
132
|
+
id: message.id,
|
|
133
|
+
result: { tools: [] }
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
break;
|
|
137
|
+
|
|
138
|
+
case 'resources/list':
|
|
139
|
+
try {
|
|
140
|
+
const resources = sqliteManager.getAllResources();
|
|
141
|
+
const formattedResources = resources.map(resource => ({
|
|
142
|
+
name: `${resource.server_id}__${resource.name}`,
|
|
143
|
+
description: `[${resource.server_id}] ${resource.description}`,
|
|
144
|
+
uri: resource.uri_template
|
|
145
|
+
}));
|
|
146
|
+
|
|
147
|
+
response = {
|
|
148
|
+
jsonrpc: '2.0',
|
|
149
|
+
id: message.id,
|
|
150
|
+
result: { resources: formattedResources }
|
|
151
|
+
};
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.error('[QuickMCP] Error getting resources:', error);
|
|
154
|
+
response = {
|
|
155
|
+
jsonrpc: '2.0',
|
|
156
|
+
id: message.id,
|
|
157
|
+
result: { resources: [] }
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
|
|
162
|
+
case 'prompts/list':
|
|
163
|
+
// Return empty prompts list for now
|
|
164
|
+
response = {
|
|
165
|
+
jsonrpc: '2.0',
|
|
166
|
+
id: message.id,
|
|
167
|
+
result: { prompts: [] }
|
|
168
|
+
};
|
|
169
|
+
break;
|
|
170
|
+
|
|
171
|
+
case 'tools/call':
|
|
172
|
+
try {
|
|
173
|
+
console.error(`[QuickMCP] Executing tool: ${message.params.name}`);
|
|
174
|
+
console.error(`[QuickMCP] Arguments:`, JSON.stringify(message.params.arguments));
|
|
175
|
+
|
|
176
|
+
const { DynamicMCPExecutor } = require('./dist/dynamic-mcp-executor.js');
|
|
177
|
+
const executor = new DynamicMCPExecutor();
|
|
178
|
+
|
|
179
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
180
|
+
setTimeout(() => reject(new Error('Tool execution timeout')), 10000);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const toolResult = await Promise.race([
|
|
184
|
+
executor.executeTool(message.params.name, message.params.arguments || {}),
|
|
185
|
+
timeoutPromise
|
|
186
|
+
]);
|
|
187
|
+
|
|
188
|
+
console.error(`[QuickMCP] Tool result:`, JSON.stringify(toolResult, null, 2));
|
|
189
|
+
|
|
190
|
+
response = {
|
|
191
|
+
jsonrpc: '2.0',
|
|
192
|
+
id: message.id,
|
|
193
|
+
result: {
|
|
194
|
+
content: [{
|
|
195
|
+
type: 'text',
|
|
196
|
+
text: JSON.stringify(toolResult, null, 2)
|
|
197
|
+
}]
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
} catch (error) {
|
|
201
|
+
console.error(`[QuickMCP] Tool execution error:`, error);
|
|
202
|
+
response = {
|
|
203
|
+
jsonrpc: '2.0',
|
|
204
|
+
id: message.id,
|
|
205
|
+
error: {
|
|
206
|
+
code: -32603,
|
|
207
|
+
message: `Tool execution failed: ${error.message}`
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
|
|
213
|
+
case 'notifications/initialized':
|
|
214
|
+
console.error('[QuickMCP] Client initialized');
|
|
215
|
+
break;
|
|
216
|
+
|
|
217
|
+
default:
|
|
218
|
+
if (message.id) {
|
|
219
|
+
response = {
|
|
220
|
+
jsonrpc: '2.0',
|
|
221
|
+
id: message.id,
|
|
222
|
+
error: { code: -32601, message: `Method not found: ${message.method}` }
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (response) {
|
|
228
|
+
console.error(`[QuickMCP] Sending: ${response.result ? 'success' : 'error'}`);
|
|
229
|
+
sendMessage(response);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function tryParseLooseLines(bufferStr) {
|
|
234
|
+
// Fallback for newline-delimited JSON (non-LSP)
|
|
235
|
+
const lines = bufferStr.split(/\n+/).filter(Boolean);
|
|
236
|
+
const messages = [];
|
|
237
|
+
let consumed = 0;
|
|
238
|
+
for (const line of lines) {
|
|
239
|
+
try {
|
|
240
|
+
const msg = JSON.parse(line);
|
|
241
|
+
messages.push(msg);
|
|
242
|
+
consumed += line.length + 1; // include one newline
|
|
243
|
+
} catch (_e) {
|
|
244
|
+
break; // stop at first non-JSON line
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return { messages, consumed };
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
process.stdin.on('data', async (data) => {
|
|
251
|
+
stdinBuffer = Buffer.concat([stdinBuffer, data]);
|
|
252
|
+
|
|
253
|
+
while (true) {
|
|
254
|
+
const str = stdinBuffer.toString('utf8');
|
|
255
|
+
const headerEnd = str.indexOf('\r\n\r\n');
|
|
256
|
+
|
|
257
|
+
if (headerEnd !== -1) {
|
|
258
|
+
// LSP-style framed message
|
|
259
|
+
const header = str.slice(0, headerEnd);
|
|
260
|
+
const match = /Content-Length:\s*(\d+)/i.exec(header);
|
|
261
|
+
if (!match) {
|
|
262
|
+
// Invalid header; drop up to headerEnd+4
|
|
263
|
+
console.error('[QuickMCP] Invalid header, dropping bytes');
|
|
264
|
+
stdinBuffer = Buffer.from(str.slice(headerEnd + 4), 'utf8');
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const contentLength = parseInt(match[1], 10);
|
|
268
|
+
const totalLength = headerEnd + 4 + contentLength;
|
|
269
|
+
if (stdinBuffer.length < totalLength) {
|
|
270
|
+
// wait for more data
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
const body = stdinBuffer.slice(headerEnd + 4, totalLength).toString('utf8');
|
|
274
|
+
try {
|
|
275
|
+
if (useLspFraming === null) {
|
|
276
|
+
useLspFraming = true;
|
|
277
|
+
console.error('[QuickMCP] Detected LSP framing (Content-Length)');
|
|
278
|
+
}
|
|
279
|
+
const message = JSON.parse(body);
|
|
280
|
+
await handleMessage(message);
|
|
281
|
+
} catch (e) {
|
|
282
|
+
console.error('[QuickMCP] Error parsing framed JSON:', e && e.message);
|
|
283
|
+
}
|
|
284
|
+
stdinBuffer = stdinBuffer.slice(totalLength);
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// No LSP header found; try newline-delimited JSON fallback
|
|
289
|
+
const { messages, consumed } = tryParseLooseLines(str);
|
|
290
|
+
if (messages.length === 0) {
|
|
291
|
+
// Need more data
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
if (useLspFraming === null) {
|
|
295
|
+
useLspFraming = false;
|
|
296
|
+
console.error('[QuickMCP] Detected newline-delimited JSON framing');
|
|
297
|
+
}
|
|
298
|
+
for (const msg of messages) {
|
|
299
|
+
try {
|
|
300
|
+
await handleMessage(msg);
|
|
301
|
+
} catch (e) {
|
|
302
|
+
console.error('[QuickMCP] Error handling message:', e && e.message);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
stdinBuffer = Buffer.from(str.slice(consumed), 'utf8');
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
process.stdin.on('end', () => {
|
|
310
|
+
console.error('[QuickMCP] STDIN ended');
|
|
311
|
+
sqliteManager.close();
|
|
312
|
+
process.exit(0);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
process.on('SIGINT', () => {
|
|
316
|
+
console.error('[QuickMCP] Interrupted');
|
|
317
|
+
sqliteManager.close();
|
|
318
|
+
process.exit(0);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
process.on('SIGTERM', () => {
|
|
322
|
+
console.error('[QuickMCP] Terminated');
|
|
323
|
+
sqliteManager.close();
|
|
324
|
+
process.exit(0);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
process.stdin.resume();
|
|
328
|
+
console.error('QuickMCP Direct STDIO Server started...');
|