@mcp-consultant-tools/azure-sql 27.0.0 → 28.0.0-beta.13

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 (71) hide show
  1. package/build/cli/commands/connection-commands.d.ts +7 -0
  2. package/build/cli/commands/connection-commands.d.ts.map +1 -0
  3. package/build/cli/commands/connection-commands.js +64 -0
  4. package/build/cli/commands/connection-commands.js.map +1 -0
  5. package/build/cli/commands/index.d.ts +9 -0
  6. package/build/cli/commands/index.d.ts.map +1 -0
  7. package/build/cli/commands/index.js +12 -0
  8. package/build/cli/commands/index.js.map +1 -0
  9. package/build/cli/commands/query-commands.d.ts +7 -0
  10. package/build/cli/commands/query-commands.d.ts.map +1 -0
  11. package/build/cli/commands/query-commands.js +149 -0
  12. package/build/cli/commands/query-commands.js.map +1 -0
  13. package/build/cli/output.d.ts +11 -0
  14. package/build/cli/output.d.ts.map +1 -0
  15. package/build/cli/output.js +10 -0
  16. package/build/cli/output.js.map +1 -0
  17. package/build/cli.d.ts +9 -0
  18. package/build/cli.d.ts.map +1 -0
  19. package/build/cli.js +27 -0
  20. package/build/cli.js.map +1 -0
  21. package/build/context-factory.d.ts +10 -0
  22. package/build/context-factory.d.ts.map +1 -0
  23. package/build/context-factory.js +61 -0
  24. package/build/context-factory.js.map +1 -0
  25. package/build/index.d.ts +15 -2
  26. package/build/index.d.ts.map +1 -1
  27. package/build/index.js +40 -491
  28. package/build/index.js.map +1 -1
  29. package/build/prompts/index.d.ts +4 -0
  30. package/build/prompts/index.d.ts.map +1 -0
  31. package/build/prompts/index.js +6 -0
  32. package/build/prompts/index.js.map +1 -0
  33. package/build/prompts/templates.d.ts +3 -0
  34. package/build/prompts/templates.d.ts.map +1 -0
  35. package/build/prompts/templates.js +81 -0
  36. package/build/prompts/templates.js.map +1 -0
  37. package/build/services/connection-service.d.ts +132 -0
  38. package/build/services/connection-service.d.ts.map +1 -0
  39. package/build/services/connection-service.js +350 -0
  40. package/build/services/connection-service.js.map +1 -0
  41. package/build/services/index.d.ts +5 -0
  42. package/build/services/index.d.ts.map +1 -0
  43. package/build/services/index.js +3 -0
  44. package/build/services/index.js.map +1 -0
  45. package/build/services/query-service.d.ts +119 -0
  46. package/build/services/query-service.d.ts.map +1 -0
  47. package/build/services/query-service.js +355 -0
  48. package/build/services/query-service.js.map +1 -0
  49. package/build/tool-examples.d.ts +22 -0
  50. package/build/tool-examples.d.ts.map +1 -0
  51. package/build/tool-examples.js +27 -0
  52. package/build/tool-examples.js.map +1 -0
  53. package/build/tools/connection-tools.d.ts +3 -0
  54. package/build/tools/connection-tools.d.ts.map +1 -0
  55. package/build/tools/connection-tools.js +132 -0
  56. package/build/tools/connection-tools.js.map +1 -0
  57. package/build/tools/index.d.ts +5 -0
  58. package/build/tools/index.d.ts.map +1 -0
  59. package/build/tools/index.js +9 -0
  60. package/build/tools/index.js.map +1 -0
  61. package/build/tools/query-tools.d.ts +3 -0
  62. package/build/tools/query-tools.d.ts.map +1 -0
  63. package/build/tools/query-tools.js +272 -0
  64. package/build/tools/query-tools.js.map +1 -0
  65. package/build/types.d.ts +11 -0
  66. package/build/types.d.ts.map +1 -0
  67. package/build/types.js +2 -0
  68. package/build/types.js.map +1 -0
  69. package/build/utils/sql-formatters.d.ts +2 -1
  70. package/build/utils/sql-formatters.d.ts.map +1 -1
  71. package/package.json +5 -3
@@ -0,0 +1,119 @@
1
+ import type { ConnectionService } from './connection-service.js';
2
+ import type { SqlApiCollectionResponse } from './connection-service.js';
3
+ export interface TableInfo {
4
+ schemaName: string;
5
+ tableName: string;
6
+ rowCount: number;
7
+ sizeMB: number;
8
+ }
9
+ export interface ViewInfo {
10
+ schemaName: string;
11
+ viewName: string;
12
+ definition: string;
13
+ }
14
+ export interface StoredProcedureInfo {
15
+ schemaName: string;
16
+ procedureName: string;
17
+ createdDate: Date;
18
+ modifiedDate: Date;
19
+ }
20
+ export interface TriggerInfo {
21
+ schemaName: string;
22
+ triggerName: string;
23
+ objectName: string;
24
+ triggerEvent: string;
25
+ isDisabled: boolean;
26
+ createdDate: Date;
27
+ modifiedDate: Date;
28
+ }
29
+ export interface FunctionInfo {
30
+ schemaName: string;
31
+ functionName: string;
32
+ returnType: string;
33
+ createdDate: Date;
34
+ modifiedDate: Date;
35
+ }
36
+ export interface ColumnInfo {
37
+ columnName: string;
38
+ dataType: string;
39
+ maxLength: number | null;
40
+ isNullable: string;
41
+ defaultValue: string | null;
42
+ isIdentity: number;
43
+ }
44
+ export interface IndexInfo {
45
+ indexName: string;
46
+ indexType: string;
47
+ isUnique: boolean;
48
+ isPrimaryKey: boolean;
49
+ columns: string;
50
+ }
51
+ export interface ForeignKeyInfo {
52
+ foreignKeyName: string;
53
+ schemaName: string;
54
+ tableName: string;
55
+ columnName: string;
56
+ referencedSchema: string;
57
+ referencedTable: string;
58
+ referencedColumn: string;
59
+ }
60
+ export interface TableSchema {
61
+ schemaName: string;
62
+ tableName: string;
63
+ columns: ColumnInfo[];
64
+ indexes: IndexInfo[];
65
+ foreignKeys: ForeignKeyInfo[];
66
+ }
67
+ export interface ObjectDefinition {
68
+ objectName: string;
69
+ schemaName: string;
70
+ objectType: string;
71
+ createdDate: Date;
72
+ modifiedDate: Date;
73
+ definition: string;
74
+ }
75
+ /**
76
+ * QueryService handles all SQL query execution against Azure SQL databases.
77
+ * Depends on ConnectionService for connection pooling.
78
+ */
79
+ export declare class QueryService {
80
+ private readonly connectionService;
81
+ constructor(connectionService: ConnectionService);
82
+ /**
83
+ * Execute a query with safety limits and size protection
84
+ */
85
+ executeQuery<T = any>(serverId: string, database: string, query: string, parameters?: Record<string, any>): Promise<SqlApiCollectionResponse<T>>;
86
+ /**
87
+ * List all user tables in the database
88
+ */
89
+ listTables(serverId: string, database: string): Promise<TableInfo[]>;
90
+ /**
91
+ * List all views in the database
92
+ */
93
+ listViews(serverId: string, database: string): Promise<ViewInfo[]>;
94
+ /**
95
+ * List all stored procedures
96
+ */
97
+ listStoredProcedures(serverId: string, database: string): Promise<StoredProcedureInfo[]>;
98
+ /**
99
+ * List all database triggers
100
+ */
101
+ listTriggers(serverId: string, database: string): Promise<TriggerInfo[]>;
102
+ /**
103
+ * List all user-defined functions
104
+ */
105
+ listFunctions(serverId: string, database: string): Promise<FunctionInfo[]>;
106
+ /**
107
+ * Get detailed schema information for a table
108
+ */
109
+ getTableSchema(serverId: string, database: string, schemaName: string, tableName: string): Promise<TableSchema>;
110
+ /**
111
+ * Get the SQL definition for views, stored procedures, functions, or triggers
112
+ */
113
+ getObjectDefinition(serverId: string, database: string, schemaName: string, objectName: string, objectType: 'VIEW' | 'PROCEDURE' | 'FUNCTION' | 'TRIGGER'): Promise<ObjectDefinition>;
114
+ /**
115
+ * Execute a user-provided SELECT query with enhanced safety validation
116
+ */
117
+ executeSelectQuery(serverId: string, database: string, query: string): Promise<SqlApiCollectionResponse<any>>;
118
+ }
119
+ //# sourceMappingURL=query-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-service.d.ts","sourceRoot":"","sources":["../../src/services/query-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,355 @@
1
+ import { auditLogger } from '@mcp-consultant-tools/core';
2
+ import { MAX_RESPONSE_SIZE_BYTES } from './connection-service.js';
3
+ /**
4
+ * QueryService handles all SQL query execution against Azure SQL databases.
5
+ * Depends on ConnectionService for connection pooling.
6
+ */
7
+ export class QueryService {
8
+ connectionService;
9
+ constructor(connectionService) {
10
+ this.connectionService = connectionService;
11
+ }
12
+ /**
13
+ * Execute a query with safety limits and size protection
14
+ */
15
+ async executeQuery(serverId, database, query, parameters) {
16
+ const config = this.connectionService.config;
17
+ try {
18
+ const pool = await this.connectionService.getPool(serverId, database);
19
+ const request = pool.request();
20
+ if (parameters) {
21
+ for (const [key, value] of Object.entries(parameters)) {
22
+ request.input(key, value);
23
+ }
24
+ }
25
+ const result = await request.query(query);
26
+ const rows = result.recordset || [];
27
+ const columns = result.recordset?.columns
28
+ ? Object.keys(result.recordset.columns)
29
+ : [];
30
+ const jsonSize = JSON.stringify(rows).length;
31
+ if (jsonSize > MAX_RESPONSE_SIZE_BYTES) {
32
+ throw new Error(`Query results too large (${(jsonSize / 1024 / 1024).toFixed(2)} MB). ` +
33
+ `Maximum allowed: ${MAX_RESPONSE_SIZE_BYTES / 1024 / 1024} MB. ` +
34
+ `Add WHERE clause or SELECT specific columns to reduce result size.`);
35
+ }
36
+ const truncated = rows.length > config.maxResultRows;
37
+ const limitedRows = rows.slice(0, config.maxResultRows);
38
+ return {
39
+ columns,
40
+ rows: limitedRows,
41
+ rowCount: limitedRows.length,
42
+ truncated,
43
+ };
44
+ }
45
+ catch (error) {
46
+ console.error(`SQL query execution failed (${serverId}/${database}):`, {
47
+ error: this.connectionService.sanitizeErrorMessage(error.message),
48
+ query: query.substring(0, 200),
49
+ });
50
+ if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {
51
+ throw new Error(`Query timeout exceeded (${config.queryTimeout}ms). ` +
52
+ `Try simplifying your query or adding WHERE clause filters.`);
53
+ }
54
+ if (error.message.includes('permission denied') || error.message.includes('denied')) {
55
+ throw new Error('Permission denied. Ensure the database user has SELECT permissions ' +
56
+ 'on the requested objects.');
57
+ }
58
+ throw new Error(`Query execution failed: ${this.connectionService.sanitizeErrorMessage(error.message)}`);
59
+ }
60
+ }
61
+ /**
62
+ * List all user tables in the database
63
+ */
64
+ async listTables(serverId, database) {
65
+ const query = `
66
+ SELECT
67
+ t.TABLE_SCHEMA as schemaName,
68
+ t.TABLE_NAME as tableName,
69
+ p.rows as rowCount,
70
+ CAST(SUM(a.total_pages) * 8 / 1024.0 AS DECIMAL(10,2)) as sizeMB
71
+ FROM INFORMATION_SCHEMA.TABLES t
72
+ LEFT JOIN sys.tables st ON t.TABLE_NAME = st.name
73
+ LEFT JOIN sys.partitions p ON st.object_id = p.object_id AND p.index_id IN (0,1)
74
+ LEFT JOIN sys.allocation_units a ON p.partition_id = a.container_id
75
+ WHERE t.TABLE_TYPE = 'BASE TABLE'
76
+ AND t.TABLE_SCHEMA != 'sys'
77
+ GROUP BY t.TABLE_SCHEMA, t.TABLE_NAME, p.rows
78
+ ORDER BY t.TABLE_SCHEMA, t.TABLE_NAME
79
+ `;
80
+ const result = await this.executeQuery(serverId, database, query);
81
+ return result.rows;
82
+ }
83
+ /**
84
+ * List all views in the database
85
+ */
86
+ async listViews(serverId, database) {
87
+ const query = `
88
+ SELECT
89
+ TABLE_SCHEMA as schemaName,
90
+ TABLE_NAME as viewName,
91
+ VIEW_DEFINITION as definition
92
+ FROM INFORMATION_SCHEMA.VIEWS
93
+ WHERE TABLE_SCHEMA != 'sys'
94
+ ORDER BY TABLE_SCHEMA, TABLE_NAME
95
+ `;
96
+ const result = await this.executeQuery(serverId, database, query);
97
+ return result.rows;
98
+ }
99
+ /**
100
+ * List all stored procedures
101
+ */
102
+ async listStoredProcedures(serverId, database) {
103
+ const query = `
104
+ SELECT
105
+ ROUTINE_SCHEMA as schemaName,
106
+ ROUTINE_NAME as procedureName,
107
+ CREATED as createdDate,
108
+ LAST_ALTERED as modifiedDate
109
+ FROM INFORMATION_SCHEMA.ROUTINES
110
+ WHERE ROUTINE_TYPE = 'PROCEDURE'
111
+ AND ROUTINE_SCHEMA != 'sys'
112
+ ORDER BY ROUTINE_SCHEMA, ROUTINE_NAME
113
+ `;
114
+ const result = await this.executeQuery(serverId, database, query);
115
+ return result.rows;
116
+ }
117
+ /**
118
+ * List all database triggers
119
+ */
120
+ async listTriggers(serverId, database) {
121
+ const query = `
122
+ SELECT
123
+ s.name as schemaName,
124
+ t.name as triggerName,
125
+ OBJECT_NAME(t.parent_id) as objectName,
126
+ CASE
127
+ WHEN OBJECTPROPERTY(t.object_id, 'ExecIsInsertTrigger') = 1 THEN 'INSERT'
128
+ WHEN OBJECTPROPERTY(t.object_id, 'ExecIsUpdateTrigger') = 1 THEN 'UPDATE'
129
+ WHEN OBJECTPROPERTY(t.object_id, 'ExecIsDeleteTrigger') = 1 THEN 'DELETE'
130
+ ELSE 'UNKNOWN'
131
+ END as triggerEvent,
132
+ t.is_disabled as isDisabled,
133
+ t.create_date as createdDate,
134
+ t.modify_date as modifiedDate
135
+ FROM sys.triggers t
136
+ INNER JOIN sys.objects o ON t.parent_id = o.object_id
137
+ INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
138
+ WHERE t.parent_class = 1
139
+ ORDER BY s.name, t.name
140
+ `;
141
+ const result = await this.executeQuery(serverId, database, query);
142
+ return result.rows;
143
+ }
144
+ /**
145
+ * List all user-defined functions
146
+ */
147
+ async listFunctions(serverId, database) {
148
+ const query = `
149
+ SELECT
150
+ ROUTINE_SCHEMA as schemaName,
151
+ ROUTINE_NAME as functionName,
152
+ DATA_TYPE as returnType,
153
+ CREATED as createdDate,
154
+ LAST_ALTERED as modifiedDate
155
+ FROM INFORMATION_SCHEMA.ROUTINES
156
+ WHERE ROUTINE_TYPE = 'FUNCTION'
157
+ AND ROUTINE_SCHEMA != 'sys'
158
+ ORDER BY ROUTINE_SCHEMA, ROUTINE_NAME
159
+ `;
160
+ const result = await this.executeQuery(serverId, database, query);
161
+ return result.rows;
162
+ }
163
+ /**
164
+ * Get detailed schema information for a table
165
+ */
166
+ async getTableSchema(serverId, database, schemaName, tableName) {
167
+ const existsQuery = `
168
+ SELECT 1 FROM INFORMATION_SCHEMA.TABLES
169
+ WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = @table
170
+ `;
171
+ const existsResult = await this.executeQuery(serverId, database, existsQuery, { schema: schemaName, table: tableName });
172
+ if (existsResult.rows.length === 0) {
173
+ throw new Error(`Table '${schemaName}.${tableName}' not found. ` +
174
+ `Use sql-list-tables to see available tables.`);
175
+ }
176
+ const columnsQuery = `
177
+ SELECT
178
+ COLUMN_NAME as columnName,
179
+ DATA_TYPE as dataType,
180
+ CHARACTER_MAXIMUM_LENGTH as maxLength,
181
+ IS_NULLABLE as isNullable,
182
+ COLUMN_DEFAULT as defaultValue,
183
+ COLUMNPROPERTY(OBJECT_ID(@schema + '.' + @table), COLUMN_NAME, 'IsIdentity') as isIdentity
184
+ FROM INFORMATION_SCHEMA.COLUMNS
185
+ WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = @table
186
+ ORDER BY ORDINAL_POSITION
187
+ `;
188
+ const indexesQuery = `
189
+ SELECT
190
+ i.name as indexName,
191
+ i.type_desc as indexType,
192
+ i.is_unique as isUnique,
193
+ i.is_primary_key as isPrimaryKey,
194
+ STRING_AGG(c.name, ', ') WITHIN GROUP (ORDER BY ic.key_ordinal) as columns
195
+ FROM sys.indexes i
196
+ INNER JOIN sys.tables t ON i.object_id = t.object_id
197
+ INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
198
+ INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
199
+ INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
200
+ WHERE s.name = @schema AND t.name = @table
201
+ GROUP BY i.name, i.type_desc, i.is_unique, i.is_primary_key
202
+ ORDER BY i.is_primary_key DESC, i.name
203
+ `;
204
+ const foreignKeysQuery = `
205
+ SELECT
206
+ fk.name as foreignKeyName,
207
+ OBJECT_SCHEMA_NAME(fk.parent_object_id) as schemaName,
208
+ OBJECT_NAME(fk.parent_object_id) as tableName,
209
+ COL_NAME(fkc.parent_object_id, fkc.parent_column_id) as columnName,
210
+ OBJECT_SCHEMA_NAME(fk.referenced_object_id) as referencedSchema,
211
+ OBJECT_NAME(fk.referenced_object_id) as referencedTable,
212
+ COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) as referencedColumn
213
+ FROM sys.foreign_keys fk
214
+ INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
215
+ WHERE OBJECT_SCHEMA_NAME(fk.parent_object_id) = @schema
216
+ AND OBJECT_NAME(fk.parent_object_id) = @table
217
+ ORDER BY fk.name
218
+ `;
219
+ try {
220
+ const [columnsResult, indexesResult, foreignKeysResult] = await Promise.all([
221
+ this.executeQuery(serverId, database, columnsQuery, { schema: schemaName, table: tableName }),
222
+ this.executeQuery(serverId, database, indexesQuery, { schema: schemaName, table: tableName })
223
+ .catch(() => ({ rows: [], rowCount: 0, columns: [] })),
224
+ this.executeQuery(serverId, database, foreignKeysQuery, { schema: schemaName, table: tableName })
225
+ .catch(() => ({ rows: [], rowCount: 0, columns: [] })),
226
+ ]);
227
+ return {
228
+ schemaName,
229
+ tableName,
230
+ columns: columnsResult.rows,
231
+ indexes: indexesResult.rows,
232
+ foreignKeys: foreignKeysResult.rows,
233
+ };
234
+ }
235
+ catch (error) {
236
+ throw new Error(`Failed to retrieve schema for '${schemaName}.${tableName}': ${this.connectionService.sanitizeErrorMessage(error.message)}`);
237
+ }
238
+ }
239
+ /**
240
+ * Get the SQL definition for views, stored procedures, functions, or triggers
241
+ */
242
+ async getObjectDefinition(serverId, database, schemaName, objectName, objectType) {
243
+ const query = `
244
+ SELECT
245
+ o.name as objectName,
246
+ s.name as schemaName,
247
+ o.type_desc as objectType,
248
+ o.create_date as createdDate,
249
+ o.modify_date as modifiedDate,
250
+ OBJECT_DEFINITION(o.object_id) as definition
251
+ FROM sys.objects o
252
+ INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
253
+ WHERE s.name = @schema
254
+ AND o.name = @object
255
+ AND o.type_desc LIKE '%' + @type + '%'
256
+ `;
257
+ const result = await this.executeQuery(serverId, database, query, {
258
+ schema: schemaName,
259
+ object: objectName,
260
+ type: objectType,
261
+ });
262
+ if (result.rows.length === 0) {
263
+ throw new Error(`${objectType} '${schemaName}.${objectName}' not found. ` +
264
+ `Check the schema name, object name, and object type.`);
265
+ }
266
+ return result.rows[0];
267
+ }
268
+ /**
269
+ * Execute a user-provided SELECT query with enhanced safety validation
270
+ */
271
+ async executeSelectQuery(serverId, database, query) {
272
+ const config = this.connectionService.config;
273
+ const timer = auditLogger.startTimer();
274
+ let cleanQuery = query
275
+ .replace(/--.*$/gm, '')
276
+ .replace(/\/\*[\s\S]*?\*\//g, '')
277
+ .replace(/\s+/g, ' ')
278
+ .trim()
279
+ .toLowerCase();
280
+ if (!cleanQuery.startsWith('select')) {
281
+ const error = 'Only SELECT queries are allowed. Write operations (INSERT, UPDATE, DELETE, etc.) are not permitted.';
282
+ auditLogger.log({
283
+ operation: 'execute-select-query',
284
+ operationType: 'READ',
285
+ componentType: 'Query',
286
+ componentName: `${serverId}/${database}`,
287
+ success: false,
288
+ error,
289
+ parameters: { query: query.substring(0, 500) },
290
+ executionTimeMs: timer()
291
+ });
292
+ throw new Error(error);
293
+ }
294
+ const dangerousPatterns = [
295
+ { pattern: /\b(insert|update|delete|merge)\b/i, name: 'write operations' },
296
+ { pattern: /\b(drop|create|alter|truncate)\b/i, name: 'schema modifications' },
297
+ { pattern: /\b(exec|execute|sp_executesql)\b/i, name: 'command execution' },
298
+ { pattern: /\b(xp_|sp_)\w+/i, name: 'system stored procedures' },
299
+ { pattern: /\b(grant|revoke|deny)\b/i, name: 'permission changes' },
300
+ { pattern: /\binto\b/i, name: 'SELECT INTO' },
301
+ { pattern: /\b(openquery|openrowset|opendatasource)\b/i, name: 'linked server queries' },
302
+ ];
303
+ for (const { pattern, name } of dangerousPatterns) {
304
+ if (pattern.test(cleanQuery)) {
305
+ const error = `Query contains forbidden keyword or pattern (${name}). Only SELECT queries are allowed for investigation purposes.`;
306
+ auditLogger.log({
307
+ operation: 'execute-select-query',
308
+ operationType: 'READ',
309
+ componentType: 'Query',
310
+ componentName: `${serverId}/${database}`,
311
+ success: false,
312
+ error,
313
+ parameters: { query: query.substring(0, 500) },
314
+ executionTimeMs: timer()
315
+ });
316
+ throw new Error(error);
317
+ }
318
+ }
319
+ try {
320
+ const result = await this.executeQuery(serverId, database, query);
321
+ auditLogger.log({
322
+ operation: 'execute-select-query',
323
+ operationType: 'READ',
324
+ componentType: 'Query',
325
+ componentName: `${serverId}/${database}`,
326
+ parameters: {
327
+ query: query.substring(0, 500),
328
+ rowCount: result.rowCount,
329
+ truncated: result.truncated
330
+ },
331
+ success: true,
332
+ executionTimeMs: timer()
333
+ });
334
+ if (result.truncated) {
335
+ console.error(`Query results truncated. Returned ${result.rowCount} of potentially more rows. ` +
336
+ `Maximum: ${config.maxResultRows}. Add WHERE clause to filter results.`);
337
+ }
338
+ return result;
339
+ }
340
+ catch (error) {
341
+ auditLogger.log({
342
+ operation: 'execute-select-query',
343
+ operationType: 'READ',
344
+ componentType: 'Query',
345
+ componentName: `${serverId}/${database}`,
346
+ success: false,
347
+ error: error instanceof Error ? error.message : String(error),
348
+ parameters: { query: query.substring(0, 500) },
349
+ executionTimeMs: timer()
350
+ });
351
+ throw error;
352
+ }
353
+ }
354
+ }
355
+ //# sourceMappingURL=query-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-service.js","sourceRoot":"","sources":["../../src/services/query-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export { descWithExamples } from '@mcp-consultant-tools/core';
2
+ export declare const SQL_QUERY_EXAMPLES: {
3
+ label: string;
4
+ value: string;
5
+ }[];
6
+ export declare const TABLE_NAME_EXAMPLES: {
7
+ label: string;
8
+ value: string;
9
+ }[];
10
+ export declare const SERVER_ID_EXAMPLES: {
11
+ label: string;
12
+ value: string;
13
+ }[];
14
+ export declare const SCHEMA_NAME_EXAMPLES: {
15
+ label: string;
16
+ value: string;
17
+ }[];
18
+ export declare const OBJECT_TYPE_EXAMPLES: {
19
+ label: string;
20
+ value: string;
21
+ }[];
22
+ //# sourceMappingURL=tool-examples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-examples.d.ts","sourceRoot":"","sources":["../src/tool-examples.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,eAAO,MAAM,kBAAkB;;;GAI9B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;GAI/B,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;GAI9B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;GAGhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;GAKhC,CAAC"}
@@ -0,0 +1,27 @@
1
+ export { descWithExamples } from '@mcp-consultant-tools/core';
2
+ export const SQL_QUERY_EXAMPLES = [
3
+ { label: 'Active users', value: "SELECT TOP 100 * FROM Users WHERE IsActive = 1" },
4
+ { label: 'Join with aggregation', value: "SELECT t.Name, COUNT(*) as OrderCount FROM Orders o JOIN Customers t ON o.CustomerId = t.Id GROUP BY t.Name" },
5
+ { label: 'List all tables', value: "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'" },
6
+ ];
7
+ export const TABLE_NAME_EXAMPLES = [
8
+ { label: 'Users table', value: 'dbo.Users' },
9
+ { label: 'Orders table', value: 'dbo.Orders' },
10
+ { label: 'Audit log', value: 'dbo.AuditLog' },
11
+ ];
12
+ export const SERVER_ID_EXAMPLES = [
13
+ { label: 'Default (single server)', value: 'default' },
14
+ { label: 'Production', value: 'prod' },
15
+ { label: 'Staging', value: 'staging' },
16
+ ];
17
+ export const SCHEMA_NAME_EXAMPLES = [
18
+ { label: 'Default schema', value: 'dbo' },
19
+ { label: 'Custom schema', value: 'sales' },
20
+ ];
21
+ export const OBJECT_TYPE_EXAMPLES = [
22
+ { label: 'View definition', value: 'VIEW' },
23
+ { label: 'Stored procedure', value: 'PROCEDURE' },
24
+ { label: 'User function', value: 'FUNCTION' },
25
+ { label: 'Table trigger', value: 'TRIGGER' },
26
+ ];
27
+ //# sourceMappingURL=tool-examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-examples.js","sourceRoot":"","sources":["../src/tool-examples.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,gDAAgD,EAAE;IAClF,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,6GAA6G,EAAE;IACxJ,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,kFAAkF,EAAE;CACxH,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE;IAC5C,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE;IAC9C,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE;CAC9C,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,SAAS,EAAE;IACtD,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE;IACtC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;CACvC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE;IACzC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE;IAC3C,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;IACjD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE;IAC7C,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;CAC7C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ServiceContext } from '../types.js';
2
+ export declare function registerConnectionTools(server: any, ctx: ServiceContext): void;
3
+ //# sourceMappingURL=connection-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-tools.d.ts","sourceRoot":"","sources":["../../src/tools/connection-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuBlD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAwI9E"}