@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
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MCPServerGenerator = void 0;
4
+ const sqlite_manager_js_1 = require("../database/sqlite-manager.js");
5
+ class MCPServerGenerator {
6
+ constructor() {
7
+ this.sqliteManager = new sqlite_manager_js_1.SQLiteManager();
8
+ }
9
+ async generateServer(serverId, serverName, parsedData, dbConfig) {
10
+ try {
11
+ console.error(`🚀 Generating virtual MCP server: ${serverId}`);
12
+ // Create server config
13
+ const serverConfig = {
14
+ id: serverId,
15
+ name: serverName,
16
+ dbConfig: dbConfig,
17
+ createdAt: new Date().toISOString()
18
+ };
19
+ // Save server to SQLite database only
20
+ this.sqliteManager.saveServer(serverConfig);
21
+ console.error(`✅ Server config saved to SQLite database: ${serverId}`);
22
+ // Generate and save tools
23
+ const tools = this.generateToolsForData(serverId, parsedData, dbConfig);
24
+ if (tools.length > 0) {
25
+ this.sqliteManager.saveTools(tools);
26
+ console.error(`✅ Generated ${tools.length} tools for server ${serverId}`);
27
+ }
28
+ // Generate and save resources
29
+ const resources = this.generateResourcesForData(serverId, parsedData, dbConfig);
30
+ if (resources.length > 0) {
31
+ this.sqliteManager.saveResources(resources);
32
+ console.error(`✅ Generated ${resources.length} resources for server ${serverId}`);
33
+ }
34
+ return {
35
+ success: true,
36
+ message: `Virtual MCP server '${serverId}' created successfully with ${tools.length} tools and ${resources.length} resources`
37
+ };
38
+ }
39
+ catch (error) {
40
+ console.error(`❌ Error generating server ${serverId}:`, error);
41
+ return {
42
+ success: false,
43
+ message: `Failed to generate server: ${error instanceof Error ? error.message : 'Unknown error'}`
44
+ };
45
+ }
46
+ }
47
+ generateToolsForData(serverId, parsedData, dbConfig) {
48
+ const tools = [];
49
+ for (const [tableName, rows] of Object.entries(parsedData)) {
50
+ if (!rows || rows.length === 0)
51
+ continue;
52
+ const columns = this.analyzeColumns(rows);
53
+ const cleanTableName = this.sanitizeName(tableName);
54
+ // GET tool
55
+ tools.push({
56
+ server_id: serverId,
57
+ name: `get_${cleanTableName}`,
58
+ description: `Get records from ${tableName} table`,
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ limit: {
63
+ type: 'number',
64
+ description: 'Maximum number of records to return',
65
+ default: 100,
66
+ minimum: 1,
67
+ maximum: 1000
68
+ },
69
+ offset: {
70
+ type: 'number',
71
+ description: 'Number of records to skip',
72
+ default: 0,
73
+ minimum: 0
74
+ },
75
+ ...this.generateFilterProperties(columns)
76
+ },
77
+ required: []
78
+ },
79
+ sqlQuery: this.generateSelectQuery(tableName, columns, dbConfig.type),
80
+ operation: 'SELECT'
81
+ });
82
+ // CREATE tool
83
+ tools.push({
84
+ server_id: serverId,
85
+ name: `create_${cleanTableName}`,
86
+ description: `Create a new record in ${tableName} table`,
87
+ inputSchema: {
88
+ type: 'object',
89
+ properties: this.generateInputProperties(columns, true),
90
+ required: columns.filter(col => !col.nullable && col.name.toLowerCase() !== 'id').map(col => col.name)
91
+ },
92
+ sqlQuery: this.generateInsertQuery(tableName, columns, dbConfig.type),
93
+ operation: 'INSERT'
94
+ });
95
+ // UPDATE tool
96
+ if (columns.some(col => col.name.toLowerCase() === 'id')) {
97
+ tools.push({
98
+ server_id: serverId,
99
+ name: `update_${cleanTableName}`,
100
+ description: `Update a record in ${tableName} table`,
101
+ inputSchema: {
102
+ type: 'object',
103
+ properties: {
104
+ id: {
105
+ type: ['string', 'number'],
106
+ description: 'ID of the record to update'
107
+ },
108
+ ...this.generateInputProperties(columns, false)
109
+ },
110
+ required: ['id']
111
+ },
112
+ sqlQuery: this.generateUpdateQuery(tableName, columns, dbConfig.type),
113
+ operation: 'UPDATE'
114
+ });
115
+ // DELETE tool
116
+ tools.push({
117
+ server_id: serverId,
118
+ name: `delete_${cleanTableName}`,
119
+ description: `Delete a record from ${tableName} table`,
120
+ inputSchema: {
121
+ type: 'object',
122
+ properties: {
123
+ id: {
124
+ type: ['string', 'number'],
125
+ description: 'ID of the record to delete'
126
+ }
127
+ },
128
+ required: ['id']
129
+ },
130
+ sqlQuery: this.generateDeleteQuery(tableName, dbConfig.type),
131
+ operation: 'DELETE'
132
+ });
133
+ }
134
+ }
135
+ return tools;
136
+ }
137
+ generateResourcesForData(serverId, parsedData, dbConfig) {
138
+ const resources = [];
139
+ for (const [tableName, rows] of Object.entries(parsedData)) {
140
+ if (!rows || rows.length === 0)
141
+ continue;
142
+ const cleanTableName = this.sanitizeName(tableName);
143
+ resources.push({
144
+ server_id: serverId,
145
+ name: `${cleanTableName}_list`,
146
+ description: `List all records from ${tableName} table`,
147
+ uri_template: `${cleanTableName}://list`,
148
+ sqlQuery: this.generateSelectQuery(tableName, this.analyzeColumns(rows), dbConfig.type, false)
149
+ });
150
+ }
151
+ return resources;
152
+ }
153
+ analyzeColumns(rows) {
154
+ if (!rows || rows.length === 0)
155
+ return [];
156
+ const firstRow = rows[0];
157
+ const columns = [];
158
+ for (const [key, value] of Object.entries(firstRow)) {
159
+ let type = 'string';
160
+ if (typeof value === 'number') {
161
+ type = Number.isInteger(value) ? 'integer' : 'number';
162
+ }
163
+ else if (typeof value === 'boolean') {
164
+ type = 'boolean';
165
+ }
166
+ else if (value instanceof Date) {
167
+ type = 'string'; // Dates are handled as strings in JSON
168
+ }
169
+ else if (value === null || value === undefined) {
170
+ // Check other rows to determine type
171
+ for (let i = 1; i < Math.min(rows.length, 10); i++) {
172
+ const otherValue = rows[i][key];
173
+ if (otherValue !== null && otherValue !== undefined) {
174
+ if (typeof otherValue === 'number') {
175
+ type = Number.isInteger(otherValue) ? 'integer' : 'number';
176
+ }
177
+ else if (typeof otherValue === 'boolean') {
178
+ type = 'boolean';
179
+ }
180
+ break;
181
+ }
182
+ }
183
+ }
184
+ columns.push({
185
+ name: key,
186
+ type: type,
187
+ nullable: rows.some(row => row[key] === null || row[key] === undefined)
188
+ });
189
+ }
190
+ return columns;
191
+ }
192
+ generateFilterProperties(columns) {
193
+ const properties = {};
194
+ for (const column of columns) {
195
+ const baseType = column.type === 'integer' ? 'number' : column.type;
196
+ properties[`filter_${column.name}`] = {
197
+ type: baseType,
198
+ description: `Filter by ${column.name}`
199
+ };
200
+ }
201
+ return properties;
202
+ }
203
+ generateInputProperties(columns, isCreate) {
204
+ const properties = {};
205
+ for (const column of columns) {
206
+ // Skip ID field for create operations
207
+ if (isCreate && column.name.toLowerCase() === 'id')
208
+ continue;
209
+ const baseType = column.type === 'integer' ? 'number' : column.type;
210
+ properties[column.name] = {
211
+ type: column.nullable ? [baseType, 'null'] : baseType,
212
+ description: `${column.name} field`
213
+ };
214
+ }
215
+ return properties;
216
+ }
217
+ generateSelectQuery(tableName, columns, dbType, withParams = true) {
218
+ const columnList = columns.map(col => `[${col.name}]`).join(', ');
219
+ let query = `SELECT ${columnList} FROM [${tableName}]`;
220
+ if (withParams) {
221
+ const whereConditions = columns.map(col => `(@filter_${col.name} IS NULL OR [${col.name}] = @filter_${col.name})`).join(' AND ');
222
+ query += ` WHERE ${whereConditions}`;
223
+ if (dbType === 'mssql') {
224
+ // Use TOP for SQL Server to avoid OFFSET/FETCH complexity
225
+ // Replace SELECT with SELECT TOP
226
+ query = query.replace('SELECT ', 'SELECT TOP (@limit) ');
227
+ }
228
+ else {
229
+ query += ' LIMIT @limit OFFSET @offset';
230
+ }
231
+ }
232
+ return query;
233
+ }
234
+ generateInsertQuery(tableName, columns, dbType) {
235
+ const insertColumns = columns.filter(col => col.name.toLowerCase() !== 'id');
236
+ const columnNames = insertColumns.map(col => `[${col.name}]`).join(', ');
237
+ const paramNames = insertColumns.map(col => `@${col.name}`).join(', ');
238
+ return `INSERT INTO [${tableName}] (${columnNames}) VALUES (${paramNames})`;
239
+ }
240
+ generateUpdateQuery(tableName, columns, dbType) {
241
+ const updateColumns = columns.filter(col => col.name.toLowerCase() !== 'id');
242
+ const setClause = updateColumns.map(col => `[${col.name}] = @${col.name}`).join(', ');
243
+ return `UPDATE [${tableName}] SET ${setClause} WHERE [Id] = @id`;
244
+ }
245
+ generateDeleteQuery(tableName, dbType) {
246
+ return `DELETE FROM [${tableName}] WHERE [Id] = @id`;
247
+ }
248
+ sanitizeName(name) {
249
+ return name.toLowerCase()
250
+ .replace(/[^a-z0-9]/g, '_')
251
+ .replace(/_{2,}/g, '_')
252
+ .replace(/^_|_$/g, '');
253
+ }
254
+ // Public methods for management
255
+ getAllServers() {
256
+ return this.sqliteManager.getAllServers();
257
+ }
258
+ getServer(serverId) {
259
+ return this.sqliteManager.getServer(serverId);
260
+ }
261
+ deleteServer(serverId) {
262
+ this.sqliteManager.deleteServer(serverId);
263
+ console.error(`🗑️ Deleted server from SQLite database: ${serverId}`);
264
+ }
265
+ getAllTools() {
266
+ return this.sqliteManager.getAllTools();
267
+ }
268
+ getToolsForServer(serverId) {
269
+ return this.sqliteManager.getToolsForServer(serverId);
270
+ }
271
+ getAllResources() {
272
+ return this.sqliteManager.getAllResources();
273
+ }
274
+ getResourcesForServer(serverId) {
275
+ return this.sqliteManager.getResourcesForServer(serverId);
276
+ }
277
+ getStats() {
278
+ return this.sqliteManager.getStats();
279
+ }
280
+ close() {
281
+ this.sqliteManager.close();
282
+ }
283
+ }
284
+ exports.MCPServerGenerator = MCPServerGenerator;