@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.
- package/build/cli/commands/connection-commands.d.ts +7 -0
- package/build/cli/commands/connection-commands.d.ts.map +1 -0
- package/build/cli/commands/connection-commands.js +64 -0
- package/build/cli/commands/connection-commands.js.map +1 -0
- package/build/cli/commands/index.d.ts +9 -0
- package/build/cli/commands/index.d.ts.map +1 -0
- package/build/cli/commands/index.js +12 -0
- package/build/cli/commands/index.js.map +1 -0
- package/build/cli/commands/query-commands.d.ts +7 -0
- package/build/cli/commands/query-commands.d.ts.map +1 -0
- package/build/cli/commands/query-commands.js +149 -0
- package/build/cli/commands/query-commands.js.map +1 -0
- package/build/cli/output.d.ts +11 -0
- package/build/cli/output.d.ts.map +1 -0
- package/build/cli/output.js +10 -0
- package/build/cli/output.js.map +1 -0
- package/build/cli.d.ts +9 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +27 -0
- package/build/cli.js.map +1 -0
- package/build/context-factory.d.ts +10 -0
- package/build/context-factory.d.ts.map +1 -0
- package/build/context-factory.js +61 -0
- package/build/context-factory.js.map +1 -0
- package/build/index.d.ts +15 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +40 -491
- package/build/index.js.map +1 -1
- package/build/prompts/index.d.ts +4 -0
- package/build/prompts/index.d.ts.map +1 -0
- package/build/prompts/index.js +6 -0
- package/build/prompts/index.js.map +1 -0
- package/build/prompts/templates.d.ts +3 -0
- package/build/prompts/templates.d.ts.map +1 -0
- package/build/prompts/templates.js +81 -0
- package/build/prompts/templates.js.map +1 -0
- package/build/services/connection-service.d.ts +132 -0
- package/build/services/connection-service.d.ts.map +1 -0
- package/build/services/connection-service.js +350 -0
- package/build/services/connection-service.js.map +1 -0
- package/build/services/index.d.ts +5 -0
- package/build/services/index.d.ts.map +1 -0
- package/build/services/index.js +3 -0
- package/build/services/index.js.map +1 -0
- package/build/services/query-service.d.ts +119 -0
- package/build/services/query-service.d.ts.map +1 -0
- package/build/services/query-service.js +355 -0
- package/build/services/query-service.js.map +1 -0
- package/build/tool-examples.d.ts +22 -0
- package/build/tool-examples.d.ts.map +1 -0
- package/build/tool-examples.js +27 -0
- package/build/tool-examples.js.map +1 -0
- package/build/tools/connection-tools.d.ts +3 -0
- package/build/tools/connection-tools.d.ts.map +1 -0
- package/build/tools/connection-tools.js +132 -0
- package/build/tools/connection-tools.js.map +1 -0
- package/build/tools/index.d.ts +5 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +9 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/query-tools.d.ts +3 -0
- package/build/tools/query-tools.d.ts.map +1 -0
- package/build/tools/query-tools.js +272 -0
- package/build/tools/query-tools.js.map +1 -0
- package/build/types.d.ts +11 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/build/utils/sql-formatters.d.ts +2 -1
- package/build/utils/sql-formatters.d.ts.map +1 -1
- 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 @@
|
|
|
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"}
|