@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,566 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.MCPServerGenerator = void 0;
51
+ var sqlite_manager_js_1 = require("../database/sqlite-manager.js");
52
+ var MCPServerGenerator = /** @class */ (function () {
53
+ function MCPServerGenerator() {
54
+ this.sqliteManager = new sqlite_manager_js_1.SQLiteManager();
55
+ }
56
+ MCPServerGenerator.prototype.generateServer = function (serverId, serverName, parsedData, dbConfig, selectedTables) {
57
+ return __awaiter(this, void 0, void 0, function () {
58
+ var serverConfig, tools, resources;
59
+ return __generator(this, function (_a) {
60
+ try {
61
+ console.log("\uD83D\uDE80 Generating virtual MCP server: ".concat(serverId));
62
+ // Create server config
63
+ console.log("\uD83D\uDCDD Creating server config with serverId: \"".concat(serverId, "\", serverName: \"").concat(serverName, "\""));
64
+ serverConfig = {
65
+ id: serverId,
66
+ name: serverName,
67
+ dbConfig: dbConfig,
68
+ createdAt: new Date().toISOString()
69
+ };
70
+ console.log('📄 Server config created:', JSON.stringify(serverConfig, null, 2));
71
+ // Save server to SQLite database only
72
+ this.sqliteManager.saveServer(serverConfig);
73
+ console.log("\u2705 Server config saved to SQLite database: ".concat(serverId));
74
+ tools = this.generateToolsForData(serverId, parsedData, dbConfig, selectedTables);
75
+ if (tools.length > 0) {
76
+ this.sqliteManager.saveTools(tools);
77
+ console.log("\u2705 Generated ".concat(tools.length, " tools for server ").concat(serverId));
78
+ }
79
+ resources = this.generateResourcesForData(serverId, parsedData, dbConfig);
80
+ if (resources.length > 0) {
81
+ this.sqliteManager.saveResources(resources);
82
+ console.log("\u2705 Generated ".concat(resources.length, " resources for server ").concat(serverId));
83
+ }
84
+ return [2 /*return*/, {
85
+ success: true,
86
+ message: "Virtual MCP server '".concat(serverId, "' created successfully with ").concat(tools.length, " tools and ").concat(resources.length, " resources")
87
+ }];
88
+ }
89
+ catch (error) {
90
+ console.error("\u274C Error generating server ".concat(serverId, ":"), error);
91
+ return [2 /*return*/, {
92
+ success: false,
93
+ message: "Failed to generate server: ".concat(error instanceof Error ? error.message : 'Unknown error')
94
+ }];
95
+ }
96
+ return [2 /*return*/];
97
+ });
98
+ });
99
+ };
100
+ MCPServerGenerator.prototype.generateToolsForData = function (serverId, parsedData, dbConfig, selectedTables) {
101
+ var _this = this;
102
+ var tools = [];
103
+ console.log('🔍 generateToolsForData called with selectedTables:', selectedTables);
104
+ var _loop_1 = function (tableName, rows) {
105
+ if (!rows || rows.length === 0)
106
+ return "continue";
107
+ // Find table configuration in selectedTables
108
+ var tableIndex = Object.keys(parsedData).indexOf(tableName);
109
+ var tableConfig = selectedTables === null || selectedTables === void 0 ? void 0 : selectedTables.find(function (config) { return config.index === tableIndex; });
110
+ // Skip table if not selected
111
+ if (selectedTables && selectedTables.length > 0 && !tableConfig) {
112
+ console.log("\uD83D\uDD0D Skipping table ".concat(tableName, " - not selected"));
113
+ return "continue";
114
+ }
115
+ console.log("\uD83D\uDD0D Processing table ".concat(tableName, " with config:"), tableConfig === null || tableConfig === void 0 ? void 0 : tableConfig.tools);
116
+ var columns = this_1.analyzeColumns(rows);
117
+ var cleanTableName = this_1.sanitizeName(tableName);
118
+ // Get tools configuration (default all true if no config)
119
+ var toolsConfig = (tableConfig === null || tableConfig === void 0 ? void 0 : tableConfig.tools) || {
120
+ get: true, create: true, update: true, delete: true, count: true,
121
+ min: true, max: true, sum: true, avg: true
122
+ };
123
+ // GET tool
124
+ if (toolsConfig.get) {
125
+ tools.push({
126
+ server_id: serverId,
127
+ name: "get_".concat(cleanTableName),
128
+ description: "Get records from ".concat(tableName, " table"),
129
+ inputSchema: {
130
+ type: 'object',
131
+ properties: __assign({ limit: {
132
+ type: 'number',
133
+ description: 'Maximum number of records to return',
134
+ default: 100,
135
+ minimum: 1,
136
+ maximum: 1000
137
+ }, offset: {
138
+ type: 'number',
139
+ description: 'Number of records to skip',
140
+ default: 0,
141
+ minimum: 0
142
+ } }, this_1.generateFilterProperties(columns)),
143
+ required: []
144
+ },
145
+ sqlQuery: this_1.generateSelectQuery(tableName, columns, dbConfig.type),
146
+ operation: 'SELECT'
147
+ });
148
+ }
149
+ // CREATE tool
150
+ if (toolsConfig.create && columns.length > 0) {
151
+ tools.push({
152
+ server_id: serverId,
153
+ name: "create_".concat(cleanTableName),
154
+ description: "Create a new record in ".concat(tableName, " table"),
155
+ inputSchema: {
156
+ type: 'object',
157
+ properties: this_1.generateInputProperties(columns, true),
158
+ required: columns.filter(function (col) { return !col.nullable && col.name.toLowerCase() !== 'id'; }).map(function (col) { return col.name; })
159
+ },
160
+ sqlQuery: this_1.generateInsertQuery(tableName, columns, dbConfig.type),
161
+ operation: 'INSERT'
162
+ });
163
+ }
164
+ // UPDATE tool
165
+ if (toolsConfig.update && columns.some(function (col) { return col.name.toLowerCase() === 'id'; })) {
166
+ tools.push({
167
+ server_id: serverId,
168
+ name: "update_".concat(cleanTableName),
169
+ description: "Update a record in ".concat(tableName, " table"),
170
+ inputSchema: {
171
+ type: 'object',
172
+ properties: __assign({ id: {
173
+ type: ['string', 'number'],
174
+ description: 'ID of the record to update'
175
+ } }, this_1.generateInputProperties(columns, false)),
176
+ required: ['id']
177
+ },
178
+ sqlQuery: this_1.generateUpdateQuery(tableName, columns, dbConfig.type),
179
+ operation: 'UPDATE'
180
+ });
181
+ }
182
+ // DELETE tool
183
+ if (toolsConfig.delete && columns.some(function (col) { return col.name.toLowerCase() === 'id'; })) {
184
+ tools.push({
185
+ server_id: serverId,
186
+ name: "delete_".concat(cleanTableName),
187
+ description: "Delete a record from ".concat(tableName, " table"),
188
+ inputSchema: {
189
+ type: 'object',
190
+ properties: {
191
+ id: {
192
+ type: ['string', 'number'],
193
+ description: 'ID of the record to delete'
194
+ }
195
+ },
196
+ required: ['id']
197
+ },
198
+ sqlQuery: this_1.generateDeleteQuery(tableName, dbConfig.type),
199
+ operation: 'DELETE'
200
+ });
201
+ }
202
+ // COUNT tool
203
+ if (toolsConfig.count) {
204
+ tools.push({
205
+ server_id: serverId,
206
+ name: "count_".concat(cleanTableName),
207
+ description: "Get total count of records in ".concat(tableName, " table"),
208
+ inputSchema: {
209
+ type: 'object',
210
+ properties: this_1.generateFilterProperties(columns),
211
+ required: []
212
+ },
213
+ sqlQuery: this_1.generateCountQuery(tableName, columns, dbConfig.type),
214
+ operation: 'SELECT'
215
+ });
216
+ }
217
+ // Get numeric columns for aggregate functions
218
+ //console.log(`🔍 Table ${tableName} columns:`, columns.map(col => ({ name: col.name, type: col.type })));
219
+ var numericColumns = columns.filter(function (col) {
220
+ var type = col.type.toLowerCase();
221
+ return type.includes('int') || type.includes('float') || type.includes('decimal') ||
222
+ type.includes('numeric') || type.includes('real') || type.includes('double') ||
223
+ type === 'number';
224
+ });
225
+ //console.log(`🔍 Numeric columns found in ${tableName}:`, numericColumns.map(col => ({ name: col.name, type: col.type })));
226
+ if (numericColumns.length > 0) {
227
+ // MIN tools for each numeric column
228
+ if (toolsConfig.min) {
229
+ numericColumns.forEach(function (col) {
230
+ var toolName = "min_".concat(cleanTableName, "_").concat(_this.sanitizeName(col.name));
231
+ console.log("\uD83D\uDD0D Creating MIN tool: ".concat(toolName, " for column ").concat(col.name));
232
+ tools.push({
233
+ server_id: serverId,
234
+ name: toolName,
235
+ description: "Get minimum value of ".concat(col.name, " in ").concat(tableName, " table"),
236
+ inputSchema: {
237
+ type: 'object',
238
+ properties: _this.generateFilterProperties(columns),
239
+ required: []
240
+ },
241
+ sqlQuery: _this.generateMinQuery(tableName, col.name, columns, dbConfig.type),
242
+ operation: 'SELECT'
243
+ });
244
+ });
245
+ }
246
+ // MAX tools for each numeric column
247
+ if (toolsConfig.max) {
248
+ numericColumns.forEach(function (col) {
249
+ var toolName = "max_".concat(cleanTableName, "_").concat(_this.sanitizeName(col.name));
250
+ tools.push({
251
+ server_id: serverId,
252
+ name: toolName,
253
+ description: "Get maximum value of ".concat(col.name, " in ").concat(tableName, " table"),
254
+ inputSchema: {
255
+ type: 'object',
256
+ properties: _this.generateFilterProperties(columns),
257
+ required: []
258
+ },
259
+ sqlQuery: _this.generateMaxQuery(tableName, col.name, columns, dbConfig.type),
260
+ operation: 'SELECT'
261
+ });
262
+ });
263
+ }
264
+ // SUM tools for each numeric column
265
+ if (toolsConfig.sum) {
266
+ numericColumns.forEach(function (col) {
267
+ var toolName = "sum_".concat(cleanTableName, "_").concat(_this.sanitizeName(col.name));
268
+ tools.push({
269
+ server_id: serverId,
270
+ name: toolName,
271
+ description: "Get sum of all values of ".concat(col.name, " in ").concat(tableName, " table"),
272
+ inputSchema: {
273
+ type: 'object',
274
+ properties: _this.generateFilterProperties(columns),
275
+ required: []
276
+ },
277
+ sqlQuery: _this.generateSumQuery(tableName, col.name, columns, dbConfig.type),
278
+ operation: 'SELECT'
279
+ });
280
+ });
281
+ }
282
+ // AVG tools for each numeric column
283
+ if (toolsConfig.avg) {
284
+ numericColumns.forEach(function (col) {
285
+ var toolName = "avg_".concat(cleanTableName, "_").concat(_this.sanitizeName(col.name));
286
+ tools.push({
287
+ server_id: serverId,
288
+ name: toolName,
289
+ description: "Get average value of ".concat(col.name, " in ").concat(tableName, " table"),
290
+ inputSchema: {
291
+ type: 'object',
292
+ properties: _this.generateFilterProperties(columns),
293
+ required: []
294
+ },
295
+ sqlQuery: _this.generateAvgQuery(tableName, col.name, columns, dbConfig.type),
296
+ operation: 'SELECT'
297
+ });
298
+ });
299
+ }
300
+ }
301
+ };
302
+ var this_1 = this;
303
+ for (var _i = 0, _a = Object.entries(parsedData); _i < _a.length; _i++) {
304
+ var _b = _a[_i], tableName = _b[0], rows = _b[1];
305
+ _loop_1(tableName, rows);
306
+ }
307
+ //console.log(`🔍 Total tools created: ${tools.length}`);
308
+ //console.log(`🔍 Tool names:`, tools.map(tool => tool.name));
309
+ return tools;
310
+ };
311
+ MCPServerGenerator.prototype.generateResourcesForData = function (serverId, parsedData, dbConfig) {
312
+ var resources = [];
313
+ for (var _i = 0, _a = Object.entries(parsedData); _i < _a.length; _i++) {
314
+ var _b = _a[_i], tableName = _b[0], rows = _b[1];
315
+ if (!rows || rows.length === 0)
316
+ continue;
317
+ var cleanTableName = this.sanitizeName(tableName);
318
+ resources.push({
319
+ server_id: serverId,
320
+ name: "".concat(cleanTableName, "_list"),
321
+ description: "List all records from ".concat(tableName, " table"),
322
+ uri_template: "".concat(cleanTableName, "://list"),
323
+ sqlQuery: this.generateSelectQuery(tableName, this.analyzeColumns(rows), dbConfig.type, false)
324
+ });
325
+ }
326
+ return resources;
327
+ };
328
+ MCPServerGenerator.prototype.analyzeColumns = function (rows) {
329
+ if (!rows || rows.length === 0)
330
+ return [];
331
+ var firstRow = rows[0];
332
+ var columns = [];
333
+ var _loop_2 = function (key, value) {
334
+ var type = 'string';
335
+ if (typeof value === 'number') {
336
+ type = Number.isInteger(value) ? 'integer' : 'number';
337
+ }
338
+ else if (typeof value === 'boolean') {
339
+ type = 'boolean';
340
+ }
341
+ else if (value instanceof Date) {
342
+ type = 'string'; // Dates are handled as strings in JSON
343
+ }
344
+ else if (value === null || value === undefined) {
345
+ // Check other rows to determine type
346
+ for (var i = 1; i < Math.min(rows.length, 10); i++) {
347
+ var otherValue = rows[i][key];
348
+ if (otherValue !== null && otherValue !== undefined) {
349
+ if (typeof otherValue === 'number') {
350
+ type = Number.isInteger(otherValue) ? 'integer' : 'number';
351
+ }
352
+ else if (typeof otherValue === 'boolean') {
353
+ type = 'boolean';
354
+ }
355
+ break;
356
+ }
357
+ }
358
+ }
359
+ columns.push({
360
+ name: key,
361
+ type: type,
362
+ nullable: rows.some(function (row) { return row[key] === null || row[key] === undefined; })
363
+ });
364
+ };
365
+ for (var _i = 0, _a = Object.entries(firstRow); _i < _a.length; _i++) {
366
+ var _b = _a[_i], key = _b[0], value = _b[1];
367
+ _loop_2(key, value);
368
+ }
369
+ return columns;
370
+ };
371
+ MCPServerGenerator.prototype.generateFilterProperties = function (columns) {
372
+ var properties = {};
373
+ for (var _i = 0, columns_1 = columns; _i < columns_1.length; _i++) {
374
+ var column = columns_1[_i];
375
+ var baseType = column.type === 'integer' ? 'number' : column.type;
376
+ properties["filter_".concat(column.name)] = {
377
+ type: baseType,
378
+ description: "Filter by ".concat(column.name)
379
+ };
380
+ }
381
+ return properties;
382
+ };
383
+ MCPServerGenerator.prototype.generateInputProperties = function (columns, isCreate) {
384
+ var properties = {};
385
+ for (var _i = 0, columns_2 = columns; _i < columns_2.length; _i++) {
386
+ var column = columns_2[_i];
387
+ // Skip ID field for create operations
388
+ if (isCreate && column.name.toLowerCase() === 'id')
389
+ continue;
390
+ var baseType = column.type === 'integer' ? 'number' : column.type;
391
+ properties[column.name] = {
392
+ type: baseType,
393
+ description: "".concat(column.name, " field")
394
+ };
395
+ // For nullable fields, make them not required instead of using union types
396
+ if (column.nullable && !isCreate) {
397
+ // Optional field - will not be added to required array
398
+ }
399
+ }
400
+ return properties;
401
+ };
402
+ MCPServerGenerator.prototype.generateSelectQuery = function (tableName, columns, dbType, withParams) {
403
+ if (withParams === void 0) { withParams = true; }
404
+ var columnList = columns.map(function (col) { return "[".concat(col.name, "]"); }).join(', ');
405
+ var query = "SELECT ".concat(columnList, " FROM [").concat(tableName, "]");
406
+ if (withParams) {
407
+ // Filter out problematic columns for WHERE clause (e.g., ntext columns in SQL Server)
408
+ var filterableColumns = columns.filter(function (col) {
409
+ // For SQL Server, exclude large text columns that can't be compared
410
+ if (dbType === 'mssql') {
411
+ // Skip columns that might be ntext, text, or image types
412
+ // These are typically identified by their string type and large content
413
+ return true; // We'll handle this at parameter level instead
414
+ }
415
+ return true;
416
+ });
417
+ var whereConditions = filterableColumns.map(function (col) {
418
+ return "(@filter_".concat(col.name, " IS NULL OR [").concat(col.name, "] = @filter_").concat(col.name, ")");
419
+ }).join(' AND ');
420
+ query += " WHERE ".concat(whereConditions);
421
+ // Add ORDER BY clause for consistent pagination
422
+ // Find the first suitable column for ordering (prefer id, created_at, or first column)
423
+ var orderColumn = columns.find(function (col) {
424
+ return col.name.toLowerCase() === 'id' ||
425
+ col.name.toLowerCase().includes('created') ||
426
+ col.name.toLowerCase().includes('timestamp');
427
+ }) || columns[0];
428
+ if (orderColumn) {
429
+ query += " ORDER BY [".concat(orderColumn.name, "]");
430
+ }
431
+ if (dbType === 'mssql') {
432
+ // Use OFFSET/FETCH for proper pagination with ORDER BY
433
+ query += ' OFFSET @offset ROWS FETCH NEXT @limit ROWS ONLY';
434
+ }
435
+ else {
436
+ query += ' LIMIT @limit OFFSET @offset';
437
+ }
438
+ }
439
+ return query;
440
+ };
441
+ MCPServerGenerator.prototype.generateInsertQuery = function (tableName, columns, dbType) {
442
+ var insertColumns = columns.filter(function (col) { return col.name.toLowerCase() !== 'id'; });
443
+ var columnNames = insertColumns.map(function (col) { return "[".concat(col.name, "]"); }).join(', ');
444
+ var paramNames = insertColumns.map(function (col) { return "@".concat(col.name); }).join(', ');
445
+ return "INSERT INTO [".concat(tableName, "] (").concat(columnNames, ") VALUES (").concat(paramNames, ")");
446
+ };
447
+ MCPServerGenerator.prototype.generateUpdateQuery = function (tableName, columns, dbType) {
448
+ var updateColumns = columns.filter(function (col) { return col.name.toLowerCase() !== 'id'; });
449
+ var setClause = updateColumns.map(function (col) { return "[".concat(col.name, "] = @").concat(col.name); }).join(', ');
450
+ return "UPDATE [".concat(tableName, "] SET ").concat(setClause, " WHERE [Id] = @id");
451
+ };
452
+ MCPServerGenerator.prototype.generateDeleteQuery = function (tableName, dbType) {
453
+ return "DELETE FROM [".concat(tableName, "] WHERE [Id] = @id");
454
+ };
455
+ MCPServerGenerator.prototype.generateCountQuery = function (tableName, columns, dbType) {
456
+ var query = "SELECT COUNT(*) as total_count FROM [".concat(tableName, "]");
457
+ // Filter out problematic columns for WHERE clause (e.g., ntext columns in SQL Server)
458
+ var filterableColumns = columns.filter(function (col) {
459
+ // For SQL Server, exclude large text columns that can't be compared
460
+ if (dbType === 'mssql') {
461
+ // Skip columns that might be ntext, text, or image types
462
+ // These are typically identified by their string type and large content
463
+ return true; // We'll handle this at parameter level instead
464
+ }
465
+ return true;
466
+ });
467
+ var whereConditions = filterableColumns.map(function (col) {
468
+ return "(@filter_".concat(col.name, " IS NULL OR [").concat(col.name, "] = @filter_").concat(col.name, ")");
469
+ }).join(' AND ');
470
+ query += " WHERE ".concat(whereConditions);
471
+ return query;
472
+ };
473
+ MCPServerGenerator.prototype.generateMinQuery = function (tableName, columnName, columns, dbType) {
474
+ var query = "SELECT MIN([".concat(columnName, "]) as min_value FROM [").concat(tableName, "]");
475
+ var filterableColumns = columns.filter(function (col) {
476
+ if (dbType === 'mssql') {
477
+ return true; // We'll handle this at parameter level instead
478
+ }
479
+ return true;
480
+ });
481
+ var whereConditions = filterableColumns.map(function (col) {
482
+ return "(@filter_".concat(col.name, " IS NULL OR [").concat(col.name, "] = @filter_").concat(col.name, ")");
483
+ }).join(' AND ');
484
+ query += " WHERE ".concat(whereConditions);
485
+ return query;
486
+ };
487
+ MCPServerGenerator.prototype.generateMaxQuery = function (tableName, columnName, columns, dbType) {
488
+ var query = "SELECT MAX([".concat(columnName, "]) as max_value FROM [").concat(tableName, "]");
489
+ var filterableColumns = columns.filter(function (col) {
490
+ if (dbType === 'mssql') {
491
+ return true; // We'll handle this at parameter level instead
492
+ }
493
+ return true;
494
+ });
495
+ var whereConditions = filterableColumns.map(function (col) {
496
+ return "(@filter_".concat(col.name, " IS NULL OR [").concat(col.name, "] = @filter_").concat(col.name, ")");
497
+ }).join(' AND ');
498
+ query += " WHERE ".concat(whereConditions);
499
+ return query;
500
+ };
501
+ MCPServerGenerator.prototype.generateSumQuery = function (tableName, columnName, columns, dbType) {
502
+ var query = "SELECT SUM([".concat(columnName, "]) as sum_value FROM [").concat(tableName, "]");
503
+ var filterableColumns = columns.filter(function (col) {
504
+ if (dbType === 'mssql') {
505
+ return true; // We'll handle this at parameter level instead
506
+ }
507
+ return true;
508
+ });
509
+ var whereConditions = filterableColumns.map(function (col) {
510
+ return "(@filter_".concat(col.name, " IS NULL OR [").concat(col.name, "] = @filter_").concat(col.name, ")");
511
+ }).join(' AND ');
512
+ query += " WHERE ".concat(whereConditions);
513
+ return query;
514
+ };
515
+ MCPServerGenerator.prototype.generateAvgQuery = function (tableName, columnName, columns, dbType) {
516
+ var query = "SELECT AVG(CAST([".concat(columnName, "] AS FLOAT)) as avg_value FROM [").concat(tableName, "]");
517
+ var filterableColumns = columns.filter(function (col) {
518
+ if (dbType === 'mssql') {
519
+ return true; // We'll handle this at parameter level instead
520
+ }
521
+ return true;
522
+ });
523
+ var whereConditions = filterableColumns.map(function (col) {
524
+ return "(@filter_".concat(col.name, " IS NULL OR [").concat(col.name, "] = @filter_").concat(col.name, ")");
525
+ }).join(' AND ');
526
+ query += " WHERE ".concat(whereConditions);
527
+ return query;
528
+ };
529
+ MCPServerGenerator.prototype.sanitizeName = function (name) {
530
+ return name.toLowerCase()
531
+ .replace(/[^a-z0-9]/g, '_')
532
+ .replace(/_{2,}/g, '_')
533
+ .replace(/^_|_$/g, '');
534
+ };
535
+ // Public methods for management
536
+ MCPServerGenerator.prototype.getAllServers = function () {
537
+ return this.sqliteManager.getAllServers();
538
+ };
539
+ MCPServerGenerator.prototype.getServer = function (serverId) {
540
+ return this.sqliteManager.getServer(serverId);
541
+ };
542
+ MCPServerGenerator.prototype.deleteServer = function (serverId) {
543
+ this.sqliteManager.deleteServer(serverId);
544
+ console.log("\uD83D\uDDD1\uFE0F Deleted server from SQLite database: ".concat(serverId));
545
+ };
546
+ MCPServerGenerator.prototype.getAllTools = function () {
547
+ return this.sqliteManager.getAllTools();
548
+ };
549
+ MCPServerGenerator.prototype.getToolsForServer = function (serverId) {
550
+ return this.sqliteManager.getToolsForServer(serverId);
551
+ };
552
+ MCPServerGenerator.prototype.getAllResources = function () {
553
+ return this.sqliteManager.getAllResources();
554
+ };
555
+ MCPServerGenerator.prototype.getResourcesForServer = function (serverId) {
556
+ return this.sqliteManager.getResourcesForServer(serverId);
557
+ };
558
+ MCPServerGenerator.prototype.getStats = function () {
559
+ return this.sqliteManager.getStats();
560
+ };
561
+ MCPServerGenerator.prototype.close = function () {
562
+ this.sqliteManager.close();
563
+ };
564
+ return MCPServerGenerator;
565
+ }());
566
+ exports.MCPServerGenerator = MCPServerGenerator;