@iflow-mcp/xexr_mcp-libsql 1.1.0

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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +509 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +327 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/base-tool.d.ts +29 -0
  8. package/dist/lib/base-tool.d.ts.map +1 -0
  9. package/dist/lib/base-tool.js +175 -0
  10. package/dist/lib/base-tool.js.map +1 -0
  11. package/dist/lib/constants.d.ts +26 -0
  12. package/dist/lib/constants.d.ts.map +1 -0
  13. package/dist/lib/constants.js +47 -0
  14. package/dist/lib/constants.js.map +1 -0
  15. package/dist/lib/database.d.ts +39 -0
  16. package/dist/lib/database.d.ts.map +1 -0
  17. package/dist/lib/database.js +284 -0
  18. package/dist/lib/database.js.map +1 -0
  19. package/dist/lib/logger.d.ts +23 -0
  20. package/dist/lib/logger.d.ts.map +1 -0
  21. package/dist/lib/logger.js +124 -0
  22. package/dist/lib/logger.js.map +1 -0
  23. package/dist/lib/server-manager.d.ts +31 -0
  24. package/dist/lib/server-manager.d.ts.map +1 -0
  25. package/dist/lib/server-manager.js +283 -0
  26. package/dist/lib/server-manager.js.map +1 -0
  27. package/dist/schemas/alter-table.d.ts +23 -0
  28. package/dist/schemas/alter-table.d.ts.map +1 -0
  29. package/dist/schemas/alter-table.js +85 -0
  30. package/dist/schemas/alter-table.js.map +1 -0
  31. package/dist/schemas/create-table.d.ts +23 -0
  32. package/dist/schemas/create-table.d.ts.map +1 -0
  33. package/dist/schemas/create-table.js +81 -0
  34. package/dist/schemas/create-table.js.map +1 -0
  35. package/dist/schemas/describe-table.d.ts +26 -0
  36. package/dist/schemas/describe-table.d.ts.map +1 -0
  37. package/dist/schemas/describe-table.js +47 -0
  38. package/dist/schemas/describe-table.js.map +1 -0
  39. package/dist/schemas/list-tables.d.ts +29 -0
  40. package/dist/schemas/list-tables.d.ts.map +1 -0
  41. package/dist/schemas/list-tables.js +37 -0
  42. package/dist/schemas/list-tables.js.map +1 -0
  43. package/dist/schemas/read-query.d.ts +17 -0
  44. package/dist/schemas/read-query.d.ts.map +1 -0
  45. package/dist/schemas/read-query.js +66 -0
  46. package/dist/schemas/read-query.js.map +1 -0
  47. package/dist/schemas/write-query.d.ts +20 -0
  48. package/dist/schemas/write-query.d.ts.map +1 -0
  49. package/dist/schemas/write-query.js +58 -0
  50. package/dist/schemas/write-query.js.map +1 -0
  51. package/dist/tools/alter-table.d.ts +31 -0
  52. package/dist/tools/alter-table.d.ts.map +1 -0
  53. package/dist/tools/alter-table.js +139 -0
  54. package/dist/tools/alter-table.js.map +1 -0
  55. package/dist/tools/create-table.d.ts +31 -0
  56. package/dist/tools/create-table.d.ts.map +1 -0
  57. package/dist/tools/create-table.js +121 -0
  58. package/dist/tools/create-table.js.map +1 -0
  59. package/dist/tools/describe-table.d.ts +30 -0
  60. package/dist/tools/describe-table.d.ts.map +1 -0
  61. package/dist/tools/describe-table.js +165 -0
  62. package/dist/tools/describe-table.js.map +1 -0
  63. package/dist/tools/list-tables.d.ts +32 -0
  64. package/dist/tools/list-tables.d.ts.map +1 -0
  65. package/dist/tools/list-tables.js +210 -0
  66. package/dist/tools/list-tables.js.map +1 -0
  67. package/dist/tools/read-query.d.ts +17 -0
  68. package/dist/tools/read-query.d.ts.map +1 -0
  69. package/dist/tools/read-query.js +112 -0
  70. package/dist/tools/read-query.js.map +1 -0
  71. package/dist/tools/write-query.d.ts +20 -0
  72. package/dist/tools/write-query.d.ts.map +1 -0
  73. package/dist/tools/write-query.js +63 -0
  74. package/dist/tools/write-query.js.map +1 -0
  75. package/dist/types/index.d.ts +50 -0
  76. package/dist/types/index.d.ts.map +1 -0
  77. package/dist/types/index.js +2 -0
  78. package/dist/types/index.js.map +1 -0
  79. package/dist/utils/error-handler.d.ts +22 -0
  80. package/dist/utils/error-handler.d.ts.map +1 -0
  81. package/dist/utils/error-handler.js +85 -0
  82. package/dist/utils/error-handler.js.map +1 -0
  83. package/dist/utils/performance.d.ts +16 -0
  84. package/dist/utils/performance.d.ts.map +1 -0
  85. package/dist/utils/performance.js +40 -0
  86. package/dist/utils/performance.js.map +1 -0
  87. package/package.json +1 -0
package/dist/index.js ADDED
@@ -0,0 +1,327 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from 'node:util';
3
+ import { Logger } from './lib/logger.js';
4
+ import { ServerManager } from './lib/server-manager.js';
5
+ let logger = new Logger();
6
+ function showHelp() {
7
+ // eslint-disable-next-line no-console
8
+ console.log(`
9
+ MCP libSQL Server by xexr
10
+
11
+ Usage: mcp-libsql --url <DATABASE_URL> [options]
12
+
13
+ Options:
14
+ --url <URL> libSQL database URL (required)
15
+ --auth-token <token> Authentication token for Turso databases (optional)
16
+ Can also be set via LIBSQL_AUTH_TOKEN environment variable
17
+ --min-connections <number> Minimum connections in pool (default: 1)
18
+ --max-connections <number> Maximum connections in pool (default: 10)
19
+ --connection-timeout <number> Connection timeout in ms (default: 30000)
20
+ --query-timeout <number> Query timeout in ms (default: 30000)
21
+ --log-mode <mode> Logging mode: file, console, both, none (default: file)
22
+ --dev Enable development mode with enhanced logging
23
+ --help Show this help message
24
+ --version Show version information
25
+
26
+ Examples:
27
+ mcp-libsql --url "file:local.db"
28
+ mcp-libsql --url "libsql://your-db.turso.io" --auth-token "your-token" --max-connections 20
29
+ LIBSQL_AUTH_TOKEN="your-token" mcp-libsql --url "libsql://your-db.turso.io"
30
+ mcp-libsql --url "http://localhost:8080" --min-connections 2 --dev
31
+ mcp-libsql --url "file:local.db" --log-mode console
32
+
33
+ Development:
34
+ Use --dev flag for enhanced logging and development features
35
+ Use 'pnpm dev --url "file:test.db"' for hot reloading during development
36
+ For Turso development, set LIBSQL_AUTH_TOKEN env var to avoid exposing tokens in command history
37
+ `);
38
+ }
39
+ async function showVersion() {
40
+ try {
41
+ // Use fs to read package.json for better compatibility
42
+ const { readFile } = await import('fs/promises');
43
+ const { join } = await import('path');
44
+ const { fileURLToPath } = await import('url');
45
+ const { dirname } = await import('path');
46
+ const __filename = fileURLToPath(import.meta.url);
47
+ const __dirname = dirname(__filename);
48
+ const packagePath = join(__dirname, '..', 'package.json');
49
+ const packageContent = await readFile(packagePath, 'utf-8');
50
+ const packageJson = JSON.parse(packageContent);
51
+ // eslint-disable-next-line no-console
52
+ console.log(`@xexr/mcp-libsql v${packageJson.version}`);
53
+ }
54
+ catch (error) {
55
+ // Fallback if reading package.json fails
56
+ // eslint-disable-next-line no-console
57
+ console.error(error);
58
+ // eslint-disable-next-line no-console
59
+ console.log('@xexr/mcp-libsql v1.0.0');
60
+ }
61
+ }
62
+ function parseCliArgs() {
63
+ try {
64
+ const { values } = parseArgs({
65
+ args: process.argv.slice(2),
66
+ options: {
67
+ url: { type: 'string' },
68
+ 'auth-token': { type: 'string' },
69
+ 'min-connections': { type: 'string' },
70
+ 'max-connections': { type: 'string' },
71
+ 'connection-timeout': { type: 'string' },
72
+ 'query-timeout': { type: 'string' },
73
+ 'log-mode': { type: 'string' },
74
+ dev: { type: 'boolean', short: 'd' },
75
+ help: { type: 'boolean', short: 'h' },
76
+ version: { type: 'boolean', short: 'v' }
77
+ },
78
+ strict: true
79
+ });
80
+ return {
81
+ url: values.url || '',
82
+ authToken: values['auth-token'] || process.env['LIBSQL_AUTH_TOKEN'],
83
+ minConnections: values['min-connections']
84
+ ? parseInt(values['min-connections'], 10)
85
+ : undefined,
86
+ maxConnections: values['max-connections']
87
+ ? parseInt(values['max-connections'], 10)
88
+ : undefined,
89
+ connectionTimeout: values['connection-timeout']
90
+ ? parseInt(values['connection-timeout'], 10)
91
+ : undefined,
92
+ queryTimeout: values['query-timeout'] ? parseInt(values['query-timeout'], 10) : undefined,
93
+ logMode: values['log-mode'],
94
+ dev: values.dev,
95
+ help: values.help,
96
+ version: values.version
97
+ };
98
+ }
99
+ catch (error) {
100
+ logger.error('Failed to parse CLI arguments', {
101
+ error: error instanceof Error ? error.message : String(error)
102
+ });
103
+ showHelp();
104
+ process.exit(1);
105
+ }
106
+ }
107
+ async function validateOptions(options) {
108
+ if (options.help) {
109
+ showHelp();
110
+ process.exit(0);
111
+ }
112
+ if (options.version) {
113
+ await showVersion();
114
+ process.exit(0);
115
+ }
116
+ if (!options.url) {
117
+ logger.error('Database URL is required');
118
+ showHelp();
119
+ process.exit(1);
120
+ }
121
+ // Validate numeric options
122
+ if (options.minConnections !== undefined &&
123
+ (options.minConnections < 1 || !Number.isInteger(options.minConnections))) {
124
+ logger.error('min-connections must be a positive integer');
125
+ process.exit(1);
126
+ }
127
+ if (options.maxConnections !== undefined &&
128
+ (options.maxConnections < 1 || !Number.isInteger(options.maxConnections))) {
129
+ logger.error('max-connections must be a positive integer');
130
+ process.exit(1);
131
+ }
132
+ if (options.minConnections !== undefined &&
133
+ options.maxConnections !== undefined &&
134
+ options.minConnections > options.maxConnections) {
135
+ logger.error('min-connections cannot be greater than max-connections');
136
+ process.exit(1);
137
+ }
138
+ if (options.connectionTimeout !== undefined &&
139
+ (options.connectionTimeout < 1000 || !Number.isInteger(options.connectionTimeout))) {
140
+ logger.error('connection-timeout must be an integer >= 1000ms');
141
+ process.exit(1);
142
+ }
143
+ if (options.queryTimeout !== undefined &&
144
+ (options.queryTimeout < 1000 || !Number.isInteger(options.queryTimeout))) {
145
+ logger.error('query-timeout must be an integer >= 1000ms');
146
+ process.exit(1);
147
+ }
148
+ // Validate log-mode
149
+ if (options.logMode !== undefined &&
150
+ !['file', 'console', 'both', 'none'].includes(options.logMode)) {
151
+ logger.error('log-mode must be one of: file, console, both, none');
152
+ process.exit(1);
153
+ }
154
+ // Validate auth-token
155
+ if (options.authToken !== undefined) {
156
+ if (typeof options.authToken !== 'string' || options.authToken.trim().length === 0) {
157
+ logger.error('auth-token must be a non-empty string');
158
+ process.exit(1);
159
+ }
160
+ // Validate auth token format for Turso tokens (basic validation)
161
+ // Turso tokens are typically JWT-like base64 encoded strings
162
+ if (options.authToken.includes(' ') || options.authToken.includes('\n')) {
163
+ logger.error('auth-token contains invalid characters (spaces or newlines)');
164
+ process.exit(1);
165
+ }
166
+ // Warn if auth token looks suspicious (too short)
167
+ if (options.authToken.length < 10) {
168
+ logger.warn('auth-token appears to be very short, please ensure it is correct');
169
+ }
170
+ // Validate that auth token is used with appropriate URLs
171
+ if (!options.url.startsWith('libsql://') && !options.url.startsWith('https://')) {
172
+ logger.warn('auth-token provided but URL does not appear to be a remote database (libsql:// or https://)');
173
+ logger.warn('Auth tokens are typically used with Turso or other remote libSQL databases');
174
+ }
175
+ }
176
+ const config = {
177
+ url: options.url,
178
+ ...(options.authToken !== undefined && { authToken: options.authToken }),
179
+ ...(options.minConnections !== undefined && { minConnections: options.minConnections }),
180
+ ...(options.maxConnections !== undefined && { maxConnections: options.maxConnections }),
181
+ ...(options.connectionTimeout !== undefined && {
182
+ connectionTimeout: options.connectionTimeout
183
+ }),
184
+ ...(options.queryTimeout !== undefined && { queryTimeout: options.queryTimeout })
185
+ };
186
+ return config;
187
+ }
188
+ async function main() {
189
+ let serverManager = null;
190
+ try {
191
+ const options = parseCliArgs();
192
+ const config = await validateOptions(options);
193
+ // Create logger with specified log mode (default to 'file')
194
+ const logMode = options.logMode || 'file';
195
+ logger = new Logger(undefined, 'INFO', logMode);
196
+ logger.info('Starting MCP libSQL Server');
197
+ logger.info(`Node.js version: ${process.version}`);
198
+ logger.info(`Platform: ${process.platform} ${process.arch}`);
199
+ logger.info(`Log mode: ${logMode}`);
200
+ // Log where we're writing logs for easy access (only if file logging is enabled)
201
+ if (logMode === 'file' || logMode === 'both') {
202
+ // eslint-disable-next-line no-console
203
+ console.error(`Log file location: ${logger.getLogFilePath()}`);
204
+ }
205
+ const isDevelopment = options.dev || process.env['NODE_ENV'] === 'development';
206
+ // Determine auth token source for logging
207
+ let authTokenSource = 'none';
208
+ if (config.authToken) {
209
+ const cliToken = parseArgs({
210
+ args: process.argv.slice(2),
211
+ options: { 'auth-token': { type: 'string' } },
212
+ strict: false
213
+ }).values['auth-token'];
214
+ if (cliToken) {
215
+ authTokenSource = 'CLI parameter';
216
+ }
217
+ else if (process.env['LIBSQL_AUTH_TOKEN']) {
218
+ authTokenSource = 'environment variable';
219
+ }
220
+ }
221
+ logger.info('Configuration validated', {
222
+ url: config.url,
223
+ authTokenProvided: !!config.authToken,
224
+ authTokenSource,
225
+ minConnections: config.minConnections,
226
+ maxConnections: config.maxConnections,
227
+ connectionTimeout: config.connectionTimeout,
228
+ queryTimeout: config.queryTimeout,
229
+ developmentMode: isDevelopment
230
+ });
231
+ // Create and start server manager
232
+ serverManager = new ServerManager({
233
+ config,
234
+ developmentMode: isDevelopment,
235
+ enableHotReload: isDevelopment
236
+ });
237
+ await serverManager.start();
238
+ logger.info('MCP libSQL Server started successfully');
239
+ // Log server status
240
+ const status = serverManager.getStatus();
241
+ logger.info('Server status', status);
242
+ // Set up graceful shutdown
243
+ const gracefulShutdown = async (signal) => {
244
+ logger.info(`Received ${signal}, shutting down gracefully`);
245
+ if (serverManager && serverManager.isServerRunning()) {
246
+ try {
247
+ await serverManager.stop();
248
+ logger.info('Server manager stopped successfully');
249
+ }
250
+ catch (error) {
251
+ logger.error('Error stopping server manager', {
252
+ error: error instanceof Error ? error.message : String(error)
253
+ });
254
+ }
255
+ }
256
+ process.exit(0);
257
+ };
258
+ // Set up signal handlers
259
+ process.on('SIGINT', () => gracefulShutdown('SIGINT'));
260
+ process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
261
+ // Optional: Set up SIGUSR1 for reload (development feature)
262
+ process.on('SIGUSR1', async () => {
263
+ logger.info('Received SIGUSR1, reloading server');
264
+ if (serverManager) {
265
+ try {
266
+ await serverManager.reload();
267
+ logger.info('Server reloaded successfully');
268
+ }
269
+ catch (error) {
270
+ logger.error('Error reloading server', {
271
+ error: error instanceof Error ? error.message : String(error)
272
+ });
273
+ }
274
+ }
275
+ });
276
+ // Keep the process alive to handle MCP communication
277
+ // The server is now running and will handle requests via stdio
278
+ // We need to prevent the main function from exiting
279
+ process.stdin.resume();
280
+ }
281
+ catch (error) {
282
+ logger.error('Failed to start MCP libSQL Server', {
283
+ error: error instanceof Error ? error.message : String(error)
284
+ });
285
+ // Clean up on startup failure
286
+ if (serverManager) {
287
+ try {
288
+ await serverManager.stop();
289
+ }
290
+ catch (cleanupError) {
291
+ logger.error('Error during cleanup', {
292
+ error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError)
293
+ });
294
+ }
295
+ }
296
+ process.exit(1);
297
+ }
298
+ }
299
+ // Start the server
300
+ // Check if this file is being run directly (handles symlinks from npm bin)
301
+ import { fileURLToPath } from 'url';
302
+ import { realpathSync } from 'fs';
303
+ function isMainModule() {
304
+ // Handle npm bin symlinks by resolving the real path
305
+ try {
306
+ if (!process.argv[1])
307
+ return false;
308
+ const realArgvPath = realpathSync(process.argv[1]);
309
+ const currentModulePath = fileURLToPath(import.meta.url);
310
+ return realArgvPath === currentModulePath;
311
+ }
312
+ catch {
313
+ // Fallback for cases where realpathSync might fail
314
+ return import.meta.url === `file://${process.argv[1]}` ||
315
+ (process.argv[1]?.endsWith('/dist/index.js') ?? false) ||
316
+ (process.argv[1]?.endsWith('\\dist\\index.js') ?? false);
317
+ }
318
+ }
319
+ if (isMainModule()) {
320
+ main().catch(error => {
321
+ logger.error('Unhandled error in main', {
322
+ error: error instanceof Error ? error.message : String(error)
323
+ });
324
+ process.exit(1);
325
+ });
326
+ }
327
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import type { CallToolResult, Tool } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { DatabaseConnection } from '../types/index.js';
4
+ export interface ToolExecutionContext {
5
+ connection: DatabaseConnection;
6
+ arguments: Record<string, unknown>;
7
+ }
8
+ export interface ToolExecutionResult extends CallToolResult {
9
+ isError?: boolean;
10
+ }
11
+ export declare abstract class BaseTool {
12
+ abstract readonly name: string;
13
+ abstract readonly description: string;
14
+ abstract readonly inputSchema: z.ZodSchema;
15
+ protected abstract executeImpl(context: ToolExecutionContext): Promise<ToolExecutionResult>;
16
+ getToolDefinition(): Tool;
17
+ execute(context: ToolExecutionContext): Promise<CallToolResult>;
18
+ private zodSchemaToJsonSchema;
19
+ private zodTypeToJsonSchema;
20
+ }
21
+ export declare class ToolRegistry {
22
+ private tools;
23
+ register(tool: BaseTool): void;
24
+ get(name: string): BaseTool | undefined;
25
+ getAll(): BaseTool[];
26
+ getToolDefinitions(): Tool[];
27
+ execute(name: string, context: ToolExecutionContext): Promise<CallToolResult>;
28
+ }
29
+ //# sourceMappingURL=base-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-tool.d.ts","sourceRoot":"","sources":["../../src/lib/base-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAK5D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,8BAAsB,QAAQ;IAC5B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC;IAE3C,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAE3F,iBAAiB,IAAI,IAAI;IAWnB,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAgErE,OAAO,CAAC,qBAAqB;IA6B7B,OAAO,CAAC,mBAAmB;CAuD5B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA+B;IAE5C,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAS9B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIvC,MAAM,IAAI,QAAQ,EAAE;IAIpB,kBAAkB,IAAI,IAAI,EAAE;IAItB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;CAmBpF"}
@@ -0,0 +1,175 @@
1
+ import { z } from 'zod';
2
+ import { Logger } from './logger.js';
3
+ const logger = new Logger();
4
+ export class BaseTool {
5
+ getToolDefinition() {
6
+ return {
7
+ name: this.name,
8
+ description: this.description,
9
+ inputSchema: {
10
+ type: 'object',
11
+ ...this.zodSchemaToJsonSchema(this.inputSchema)
12
+ }
13
+ };
14
+ }
15
+ async execute(context) {
16
+ const startTime = Date.now();
17
+ try {
18
+ // Validate input arguments
19
+ const validationResult = this.inputSchema.safeParse(context.arguments);
20
+ if (!validationResult.success) {
21
+ const errorMessage = `Invalid arguments for tool ${this.name}: ${validationResult.error.message}`;
22
+ logger.error('Tool validation failed', {
23
+ tool: this.name,
24
+ error: errorMessage,
25
+ arguments: context.arguments
26
+ });
27
+ return {
28
+ content: [
29
+ {
30
+ type: 'text',
31
+ text: `Error: ${errorMessage}`
32
+ }
33
+ ],
34
+ isError: true
35
+ };
36
+ }
37
+ // Update context with validated arguments
38
+ const validatedContext = {
39
+ ...context,
40
+ arguments: validationResult.data
41
+ };
42
+ logger.info(`Executing tool: ${this.name}`, { arguments: validatedContext.arguments });
43
+ // Execute the tool
44
+ const result = await this.executeImpl(validatedContext);
45
+ const executionTime = Date.now() - startTime;
46
+ logger.info(`Tool executed successfully: ${this.name}`, {
47
+ executionTime,
48
+ hasError: result.isError || false
49
+ });
50
+ return result;
51
+ }
52
+ catch (error) {
53
+ const executionTime = Date.now() - startTime;
54
+ const errorMessage = error instanceof Error ? error.message : String(error);
55
+ logger.error(`Tool execution failed: ${this.name}`, {
56
+ error: errorMessage,
57
+ executionTime
58
+ });
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: `Error executing ${this.name}: ${errorMessage}`
64
+ }
65
+ ],
66
+ isError: true
67
+ };
68
+ }
69
+ }
70
+ zodSchemaToJsonSchema(schema) {
71
+ // Basic conversion from Zod to JSON Schema
72
+ // This is a simplified implementation - in production you might want to use zod-to-json-schema
73
+ if (schema instanceof z.ZodObject) {
74
+ const shape = schema.shape;
75
+ const properties = {};
76
+ const required = [];
77
+ for (const [key, value] of Object.entries(shape)) {
78
+ properties[key] = this.zodTypeToJsonSchema(value);
79
+ // Check if field is required (not optional and not default)
80
+ const zodField = value;
81
+ if (!zodField.isOptional() && !(zodField instanceof z.ZodDefault)) {
82
+ required.push(key);
83
+ }
84
+ }
85
+ return {
86
+ type: 'object',
87
+ properties,
88
+ required: required.length > 0 ? required : []
89
+ };
90
+ }
91
+ return this.zodTypeToJsonSchema(schema);
92
+ }
93
+ zodTypeToJsonSchema(zodType) {
94
+ if (zodType instanceof z.ZodString) {
95
+ return { type: 'string' };
96
+ }
97
+ if (zodType instanceof z.ZodNumber) {
98
+ return { type: 'number' };
99
+ }
100
+ if (zodType instanceof z.ZodBoolean) {
101
+ return { type: 'boolean' };
102
+ }
103
+ if (zodType instanceof z.ZodArray) {
104
+ return {
105
+ type: 'array',
106
+ items: this.zodTypeToJsonSchema(zodType.element)
107
+ };
108
+ }
109
+ if (zodType instanceof z.ZodOptional) {
110
+ return this.zodTypeToJsonSchema(zodType.unwrap());
111
+ }
112
+ if (zodType instanceof z.ZodDefault) {
113
+ return this.zodTypeToJsonSchema(zodType._def.innerType);
114
+ }
115
+ if (zodType instanceof z.ZodEnum) {
116
+ return {
117
+ type: 'string',
118
+ enum: zodType.options
119
+ };
120
+ }
121
+ // Handle ZodUnion - convert to anyOf
122
+ if (zodType instanceof z.ZodUnion) {
123
+ return {
124
+ anyOf: zodType.options.map((option) => this.zodTypeToJsonSchema(option))
125
+ };
126
+ }
127
+ // Handle ZodEffects (refined schemas) - use inner type
128
+ if (zodType instanceof z.ZodEffects) {
129
+ return this.zodTypeToJsonSchema(zodType._def.schema);
130
+ }
131
+ // Handle ZodNull
132
+ if (zodType instanceof z.ZodNull) {
133
+ return { type: 'null' };
134
+ }
135
+ // Default fallback
136
+ return { type: 'string' };
137
+ }
138
+ }
139
+ export class ToolRegistry {
140
+ tools = new Map();
141
+ register(tool) {
142
+ if (this.tools.has(tool.name)) {
143
+ throw new Error(`Tool ${tool.name} is already registered`);
144
+ }
145
+ this.tools.set(tool.name, tool);
146
+ logger.info(`Tool registered: ${tool.name}`);
147
+ }
148
+ get(name) {
149
+ return this.tools.get(name);
150
+ }
151
+ getAll() {
152
+ return Array.from(this.tools.values());
153
+ }
154
+ getToolDefinitions() {
155
+ return this.getAll().map(tool => tool.getToolDefinition());
156
+ }
157
+ async execute(name, context) {
158
+ const tool = this.get(name);
159
+ if (!tool) {
160
+ const errorMessage = `Unknown tool: ${name}`;
161
+ logger.error('Tool not found', { tool: name });
162
+ return {
163
+ content: [
164
+ {
165
+ type: 'text',
166
+ text: `Error: ${errorMessage}`
167
+ }
168
+ ],
169
+ isError: true
170
+ };
171
+ }
172
+ return tool.execute(context);
173
+ }
174
+ }
175
+ //# sourceMappingURL=base-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-tool.js","sourceRoot":"","sources":["../../src/lib/base-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare const DEFAULT_CONFIG: {
2
+ readonly minConnections: 1;
3
+ readonly maxConnections: 10;
4
+ readonly connectionTimeout: 30000;
5
+ readonly retryInterval: 5000;
6
+ readonly queryTimeout: 30000;
7
+ readonly maxResultSize: 10000;
8
+ };
9
+ export declare const RESTRICTED_OPERATIONS: readonly ["DROP DATABASE", "DROP TABLE", "DROP INDEX", "DROP TRIGGER", "DROP VIEW", "TRUNCATE", "DELETE FROM sqlite_master", "DELETE FROM sqlite_sequence", "UPDATE sqlite_master", "UPDATE sqlite_sequence", "INSERT INTO sqlite_master", "INSERT INTO sqlite_sequence", "PRAGMA case_sensitive_like", "PRAGMA foreign_keys", "PRAGMA journal_mode", "PRAGMA synchronous", "PRAGMA temp_store", "PRAGMA wal_autocheckpoint", "ATTACH DATABASE", "DETACH DATABASE"];
10
+ export declare const LOG_LEVELS: {
11
+ readonly ERROR: "error";
12
+ readonly WARN: "warn";
13
+ readonly INFO: "info";
14
+ readonly DEBUG: "debug";
15
+ };
16
+ export declare const QUERY_TYPES: {
17
+ readonly SELECT: "SELECT";
18
+ readonly INSERT: "INSERT";
19
+ readonly UPDATE: "UPDATE";
20
+ readonly DELETE: "DELETE";
21
+ readonly CREATE_TABLE: "CREATE TABLE";
22
+ readonly ALTER_TABLE: "ALTER TABLE";
23
+ readonly DROP: "DROP";
24
+ readonly PRAGMA: "PRAGMA";
25
+ };
26
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;CAOjB,CAAC;AAEX,eAAO,MAAM,qBAAqB,qcAqBxB,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC"}
@@ -0,0 +1,47 @@
1
+ export const DEFAULT_CONFIG = {
2
+ minConnections: 1,
3
+ maxConnections: 10,
4
+ connectionTimeout: 30000, // 30 seconds
5
+ retryInterval: 5000, // 5 seconds
6
+ queryTimeout: 30000, // 30 seconds
7
+ maxResultSize: 10000 // 10,000 rows
8
+ };
9
+ export const RESTRICTED_OPERATIONS = [
10
+ 'DROP DATABASE',
11
+ 'DROP TABLE',
12
+ 'DROP INDEX',
13
+ 'DROP TRIGGER',
14
+ 'DROP VIEW',
15
+ 'TRUNCATE',
16
+ 'DELETE FROM sqlite_master',
17
+ 'DELETE FROM sqlite_sequence',
18
+ 'UPDATE sqlite_master',
19
+ 'UPDATE sqlite_sequence',
20
+ 'INSERT INTO sqlite_master',
21
+ 'INSERT INTO sqlite_sequence',
22
+ 'PRAGMA case_sensitive_like',
23
+ 'PRAGMA foreign_keys',
24
+ 'PRAGMA journal_mode',
25
+ 'PRAGMA synchronous',
26
+ 'PRAGMA temp_store',
27
+ 'PRAGMA wal_autocheckpoint',
28
+ 'ATTACH DATABASE',
29
+ 'DETACH DATABASE'
30
+ ];
31
+ export const LOG_LEVELS = {
32
+ ERROR: 'error',
33
+ WARN: 'warn',
34
+ INFO: 'info',
35
+ DEBUG: 'debug'
36
+ };
37
+ export const QUERY_TYPES = {
38
+ SELECT: 'SELECT',
39
+ INSERT: 'INSERT',
40
+ UPDATE: 'UPDATE',
41
+ DELETE: 'DELETE',
42
+ CREATE_TABLE: 'CREATE TABLE',
43
+ ALTER_TABLE: 'ALTER TABLE',
44
+ DROP: 'DROP',
45
+ PRAGMA: 'PRAGMA'
46
+ };
47
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,CAAC;IACjB,cAAc,EAAE,EAAE;IAClB,iBAAiB,EAAE,KAAK,EAAE,aAAa;IACvC,aAAa,EAAE,IAAI,EAAE,YAAY;IACjC,YAAY,EAAE,KAAK,EAAE,aAAa;IAClC,aAAa,EAAE,KAAK,CAAC,cAAc;CAC3B,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,WAAW;IACX,UAAU;IACV,2BAA2B;IAC3B,6BAA6B;IAC7B,sBAAsB;IACtB,wBAAwB;IACxB,2BAA2B;IAC3B,6BAA6B;IAC7B,4BAA4B;IAC5B,qBAAqB;IACrB,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,2BAA2B;IAC3B,iBAAiB;IACjB,iBAAiB;CACT,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,aAAa;IAC1B,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACR,CAAC"}