@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.
Files changed (163) hide show
  1. package/README.md +553 -0
  2. package/dist/client/MCPClient.d.ts +24 -0
  3. package/dist/client/MCPClient.d.ts.map +1 -0
  4. package/dist/client/MCPClient.js +211 -0
  5. package/dist/client/MCPClient.js.map +1 -0
  6. package/dist/client/MCPClientUnified.d.ts +31 -0
  7. package/dist/client/MCPClientUnified.d.ts.map +1 -0
  8. package/dist/client/MCPClientUnified.js +275 -0
  9. package/dist/client/MCPClientUnified.js.map +1 -0
  10. package/dist/client/MCPTestRunner.d.ts +44 -0
  11. package/dist/client/MCPTestRunner.d.ts.map +1 -0
  12. package/dist/client/MCPTestRunner.js +220 -0
  13. package/dist/client/MCPTestRunner.js.map +1 -0
  14. package/dist/client/MCPTestRunnerUnified.d.ts +48 -0
  15. package/dist/client/MCPTestRunnerUnified.d.ts.map +1 -0
  16. package/dist/client/MCPTestRunnerUnified.js +183 -0
  17. package/dist/client/MCPTestRunnerUnified.js.map +1 -0
  18. package/dist/database/json-manager.d.ts +55 -0
  19. package/dist/database/json-manager.d.ts.map +1 -0
  20. package/dist/database/json-manager.js +128 -0
  21. package/dist/database/json-manager.js.map +1 -0
  22. package/dist/database/sqlite-manager.d.ts +53 -0
  23. package/dist/database/sqlite-manager.d.ts.map +1 -0
  24. package/dist/database/sqlite-manager.js +193 -0
  25. package/dist/database/sqlite-manager.js.map +1 -0
  26. package/dist/dynamic-mcp-executor.d.ts +14 -0
  27. package/dist/dynamic-mcp-executor.d.ts.map +1 -0
  28. package/dist/dynamic-mcp-executor.js +274 -0
  29. package/dist/dynamic-mcp-executor.js.map +1 -0
  30. package/dist/generators/MCPServerGenerator-new.d.ts +37 -0
  31. package/dist/generators/MCPServerGenerator-new.d.ts.map +1 -0
  32. package/dist/generators/MCPServerGenerator-new.js +287 -0
  33. package/dist/generators/MCPServerGenerator-new.js.map +1 -0
  34. package/dist/generators/MCPServerGenerator.d.ts +42 -0
  35. package/dist/generators/MCPServerGenerator.d.ts.map +1 -0
  36. package/dist/generators/MCPServerGenerator.js +494 -0
  37. package/dist/generators/MCPServerGenerator.js.map +1 -0
  38. package/dist/generators/database/sqlite-manager.d.ts +52 -0
  39. package/dist/generators/database/sqlite-manager.js +143 -0
  40. package/dist/generators/generators/MCPServerGenerator.d.ts +37 -0
  41. package/dist/generators/generators/MCPServerGenerator.js +396 -0
  42. package/dist/index.d.ts +7 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +23 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/integrated-mcp-server-new.d.ts +12 -0
  47. package/dist/integrated-mcp-server-new.d.ts.map +1 -0
  48. package/dist/integrated-mcp-server-new.js +253 -0
  49. package/dist/integrated-mcp-server-new.js.map +1 -0
  50. package/dist/integrated-mcp-server.d.ts +25 -0
  51. package/dist/integrated-mcp-server.d.ts.map +1 -0
  52. package/dist/integrated-mcp-server.js +541 -0
  53. package/dist/integrated-mcp-server.js.map +1 -0
  54. package/dist/mcp-inspector-server.d.ts +3 -0
  55. package/dist/mcp-inspector-server.d.ts.map +1 -0
  56. package/dist/mcp-inspector-server.js +119 -0
  57. package/dist/mcp-inspector-server.js.map +1 -0
  58. package/dist/mcp-sdk-server.d.ts +3 -0
  59. package/dist/mcp-sdk-server.d.ts.map +1 -0
  60. package/dist/mcp-sdk-server.js +90 -0
  61. package/dist/mcp-sdk-server.js.map +1 -0
  62. package/dist/mcp-server.d.ts +3 -0
  63. package/dist/mcp-server.d.ts.map +1 -0
  64. package/dist/mcp-server.js +300 -0
  65. package/dist/mcp-server.js.map +1 -0
  66. package/dist/parsers/CsvParser.d.ts +7 -0
  67. package/dist/parsers/CsvParser.d.ts.map +1 -0
  68. package/dist/parsers/CsvParser.js +98 -0
  69. package/dist/parsers/CsvParser.js.map +1 -0
  70. package/dist/parsers/DatabaseParser.d.ts +18 -0
  71. package/dist/parsers/DatabaseParser.d.ts.map +1 -0
  72. package/dist/parsers/DatabaseParser.js +372 -0
  73. package/dist/parsers/DatabaseParser.js.map +1 -0
  74. package/dist/parsers/ExcelParser.d.ts +8 -0
  75. package/dist/parsers/ExcelParser.d.ts.map +1 -0
  76. package/dist/parsers/ExcelParser.js +119 -0
  77. package/dist/parsers/ExcelParser.js.map +1 -0
  78. package/dist/parsers/index.d.ts +13 -0
  79. package/dist/parsers/index.d.ts.map +1 -0
  80. package/dist/parsers/index.js +88 -0
  81. package/dist/parsers/index.js.map +1 -0
  82. package/dist/parsers/parsers/ExcelParser.js +118 -0
  83. package/dist/parsers/types/index.js +2 -0
  84. package/dist/quickmcp-unified-bridge.d.ts +13 -0
  85. package/dist/quickmcp-unified-bridge.d.ts.map +1 -0
  86. package/dist/quickmcp-unified-bridge.js +176 -0
  87. package/dist/quickmcp-unified-bridge.js.map +1 -0
  88. package/dist/server/ServerManager.d.ts +37 -0
  89. package/dist/server/ServerManager.d.ts.map +1 -0
  90. package/dist/server/ServerManager.js +376 -0
  91. package/dist/server/ServerManager.js.map +1 -0
  92. package/dist/sqlite-manager.js +145 -0
  93. package/dist/start-new-server.d.ts +3 -0
  94. package/dist/start-new-server.d.ts.map +1 -0
  95. package/dist/start-new-server.js +10 -0
  96. package/dist/start-new-server.js.map +1 -0
  97. package/dist/test-app.d.ts +2 -0
  98. package/dist/test-app.d.ts.map +1 -0
  99. package/dist/test-app.js +119 -0
  100. package/dist/test-app.js.map +1 -0
  101. package/dist/test-new-architecture.d.ts +3 -0
  102. package/dist/test-new-architecture.d.ts.map +1 -0
  103. package/dist/test-new-architecture.js +72 -0
  104. package/dist/test-new-architecture.js.map +1 -0
  105. package/dist/transport/base-transport.d.ts +21 -0
  106. package/dist/transport/base-transport.d.ts.map +1 -0
  107. package/dist/transport/base-transport.js +16 -0
  108. package/dist/transport/base-transport.js.map +1 -0
  109. package/dist/transport/index.d.ts +10 -0
  110. package/dist/transport/index.d.ts.map +1 -0
  111. package/dist/transport/index.js +12 -0
  112. package/dist/transport/index.js.map +1 -0
  113. package/dist/transport/sse-transport.d.ts +13 -0
  114. package/dist/transport/sse-transport.d.ts.map +1 -0
  115. package/dist/transport/sse-transport.js +106 -0
  116. package/dist/transport/sse-transport.js.map +1 -0
  117. package/dist/transport/stdio-transport.d.ts +8 -0
  118. package/dist/transport/stdio-transport.d.ts.map +1 -0
  119. package/dist/transport/stdio-transport.js +53 -0
  120. package/dist/transport/stdio-transport.js.map +1 -0
  121. package/dist/transport/streamable-http-transport.d.ts +15 -0
  122. package/dist/transport/streamable-http-transport.d.ts.map +1 -0
  123. package/dist/transport/streamable-http-transport.js +151 -0
  124. package/dist/transport/streamable-http-transport.js.map +1 -0
  125. package/dist/types/index.d.ts +64 -0
  126. package/dist/types/index.d.ts.map +1 -0
  127. package/dist/types/index.js +3 -0
  128. package/dist/types/index.js.map +1 -0
  129. package/dist/web/client/MCPClient.js +348 -0
  130. package/dist/web/client/MCPTestRunner.js +317 -0
  131. package/dist/web/database/json-manager.js +124 -0
  132. package/dist/web/database/sqlite-manager.js +146 -0
  133. package/dist/web/dynamic-mcp-executor.js +443 -0
  134. package/dist/web/generators/MCPServerGenerator-new.js +284 -0
  135. package/dist/web/generators/MCPServerGenerator.js +566 -0
  136. package/dist/web/integrated-mcp-server-new.js +394 -0
  137. package/dist/web/parsers/CsvParser.js +144 -0
  138. package/dist/web/parsers/DatabaseParser.js +637 -0
  139. package/dist/web/parsers/ExcelParser.js +180 -0
  140. package/dist/web/parsers/index.js +152 -0
  141. package/dist/web/server.d.ts +3 -0
  142. package/dist/web/server.d.ts.map +1 -0
  143. package/dist/web/server.js +790 -0
  144. package/dist/web/server.js.map +1 -0
  145. package/dist/web/types/index.js +2 -0
  146. package/dist/web/web/server.js +860 -0
  147. package/package.json +68 -0
  148. package/quickmcp-direct-stdio.js +328 -0
  149. package/src/web/public/app.js +1795 -0
  150. package/src/web/public/database-tables.html +711 -0
  151. package/src/web/public/how-to-use.html +571 -0
  152. package/src/web/public/how-to-use.js +255 -0
  153. package/src/web/public/images/1-claude-quickmcp-stdio.png +0 -0
  154. package/src/web/public/images/2-claude-tools.png +0 -0
  155. package/src/web/public/images/3-claude-developer-settings.png +0 -0
  156. package/src/web/public/images/4-claude-config.png +0 -0
  157. package/src/web/public/images/5-claude-config-edit.png +0 -0
  158. package/src/web/public/index.html +626 -0
  159. package/src/web/public/manage-servers.html +198 -0
  160. package/src/web/public/modern-styles.css +946 -0
  161. package/src/web/public/shared-styles.css +2091 -0
  162. package/src/web/public/shared.js +93 -0
  163. 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...');