@connorbritain/mssql-mcp-server 0.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.
- package/README.md +61 -0
- package/dist/audit/AuditLogger.d.ts +25 -0
- package/dist/audit/AuditLogger.d.ts.map +1 -0
- package/dist/audit/AuditLogger.js +91 -0
- package/dist/audit/AuditLogger.js.map +1 -0
- package/dist/config/EnvironmentManager.d.ts +36 -0
- package/dist/config/EnvironmentManager.d.ts.map +1 -0
- package/dist/config/EnvironmentManager.js +185 -0
- package/dist/config/EnvironmentManager.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +615 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/CreateIndexTool.d.ts +24 -0
- package/dist/tools/CreateIndexTool.d.ts.map +1 -0
- package/dist/tools/CreateIndexTool.js +64 -0
- package/dist/tools/CreateIndexTool.js.map +1 -0
- package/dist/tools/CreateTableTool.d.ts +12 -0
- package/dist/tools/CreateTableTool.d.ts.map +1 -0
- package/dist/tools/CreateTableTool.js +49 -0
- package/dist/tools/CreateTableTool.js.map +1 -0
- package/dist/tools/DeleteDataTool.d.ts +56 -0
- package/dist/tools/DeleteDataTool.d.ts.map +1 -0
- package/dist/tools/DeleteDataTool.js +103 -0
- package/dist/tools/DeleteDataTool.js.map +1 -0
- package/dist/tools/DescribeTableTool.d.ts +20 -0
- package/dist/tools/DescribeTableTool.d.ts.map +1 -0
- package/dist/tools/DescribeTableTool.js +34 -0
- package/dist/tools/DescribeTableTool.js.map +1 -0
- package/dist/tools/DropTableTool.d.ts +12 -0
- package/dist/tools/DropTableTool.d.ts.map +1 -0
- package/dist/tools/DropTableTool.js +37 -0
- package/dist/tools/DropTableTool.js.map +1 -0
- package/dist/tools/ExplainQueryTool.d.ts +24 -0
- package/dist/tools/ExplainQueryTool.d.ts.map +1 -0
- package/dist/tools/ExplainQueryTool.js +98 -0
- package/dist/tools/ExplainQueryTool.js.map +1 -0
- package/dist/tools/InsertDataTool.d.ts +17 -0
- package/dist/tools/InsertDataTool.d.ts.map +1 -0
- package/dist/tools/InsertDataTool.js +144 -0
- package/dist/tools/InsertDataTool.js.map +1 -0
- package/dist/tools/ListTableTool.d.ts +18 -0
- package/dist/tools/ListTableTool.d.ts.map +1 -0
- package/dist/tools/ListTableTool.js +43 -0
- package/dist/tools/ListTableTool.js.map +1 -0
- package/dist/tools/ProfileTableTool.d.ts +78 -0
- package/dist/tools/ProfileTableTool.d.ts.map +1 -0
- package/dist/tools/ProfileTableTool.js +372 -0
- package/dist/tools/ProfileTableTool.js.map +1 -0
- package/dist/tools/ReadDataTool.d.ts +58 -0
- package/dist/tools/ReadDataTool.d.ts.map +1 -0
- package/dist/tools/ReadDataTool.js +265 -0
- package/dist/tools/ReadDataTool.js.map +1 -0
- package/dist/tools/RelationshipInspectorTool.d.ts +46 -0
- package/dist/tools/RelationshipInspectorTool.d.ts.map +1 -0
- package/dist/tools/RelationshipInspectorTool.js +155 -0
- package/dist/tools/RelationshipInspectorTool.js.map +1 -0
- package/dist/tools/SearchSchemaTool.d.ts +88 -0
- package/dist/tools/SearchSchemaTool.d.ts.map +1 -0
- package/dist/tools/SearchSchemaTool.js +236 -0
- package/dist/tools/SearchSchemaTool.js.map +1 -0
- package/dist/tools/TestConnectionTool.d.ts +36 -0
- package/dist/tools/TestConnectionTool.d.ts.map +1 -0
- package/dist/tools/TestConnectionTool.js +155 -0
- package/dist/tools/TestConnectionTool.js.map +1 -0
- package/dist/tools/UpdateDataTool.d.ts +61 -0
- package/dist/tools/UpdateDataTool.d.ts.map +1 -0
- package/dist/tools/UpdateDataTool.js +117 -0
- package/dist/tools/UpdateDataTool.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfileTableTool.js","sourceRoot":"","sources":["../../src/tools/ProfileTableTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare class ReadDataTool implements Tool {
|
|
3
|
+
[key: string]: any;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
private readonly defaultMaxRows;
|
|
7
|
+
inputSchema: any;
|
|
8
|
+
constructor();
|
|
9
|
+
private static readonly DANGEROUS_KEYWORDS;
|
|
10
|
+
private static readonly DANGEROUS_PATTERNS;
|
|
11
|
+
/**
|
|
12
|
+
* Validates the SQL query for security issues
|
|
13
|
+
* @param query The SQL query to validate
|
|
14
|
+
* @returns Validation result with success flag and error message if invalid
|
|
15
|
+
*/
|
|
16
|
+
private validateQuery;
|
|
17
|
+
/**
|
|
18
|
+
* Enforces row limit by injecting TOP n if not already present
|
|
19
|
+
* @param query The validated SQL query
|
|
20
|
+
* @returns Query with TOP clause if needed, plus flag indicating if limit was added
|
|
21
|
+
*/
|
|
22
|
+
private enforceRowLimit;
|
|
23
|
+
/**
|
|
24
|
+
* Resolves the maximum number of rows to return based on the input parameters and environment
|
|
25
|
+
* @param params Input parameters
|
|
26
|
+
* @returns Maximum number of rows to return
|
|
27
|
+
*/
|
|
28
|
+
private resolveMaxRows;
|
|
29
|
+
/**
|
|
30
|
+
* Sanitizes the query result to prevent any potential security issues
|
|
31
|
+
* @param data The query result data
|
|
32
|
+
* @returns Sanitized data
|
|
33
|
+
*/
|
|
34
|
+
private sanitizeResult;
|
|
35
|
+
/**
|
|
36
|
+
* Executes the validated SQL query
|
|
37
|
+
* @param params Query parameters
|
|
38
|
+
* @returns Query execution result
|
|
39
|
+
*/
|
|
40
|
+
run(params: any): Promise<{
|
|
41
|
+
success: boolean;
|
|
42
|
+
message: string;
|
|
43
|
+
error: string;
|
|
44
|
+
data?: undefined;
|
|
45
|
+
recordCount?: undefined;
|
|
46
|
+
totalRecords?: undefined;
|
|
47
|
+
autoLimited?: undefined;
|
|
48
|
+
} | {
|
|
49
|
+
success: boolean;
|
|
50
|
+
message: string;
|
|
51
|
+
data: any[];
|
|
52
|
+
recordCount: number;
|
|
53
|
+
totalRecords: number;
|
|
54
|
+
autoLimited: boolean;
|
|
55
|
+
error?: undefined;
|
|
56
|
+
}>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ReadDataTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadDataTool.d.ts","sourceRoot":"","sources":["../../src/tools/ReadDataTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,qBAAa,YAAa,YAAW,IAAI;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAAe;IACnB,WAAW,SAA8Q;IAEzR,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,WAAW,EAaN,GAAG,CAAC;;IAWT,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAOxC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CA+CxC;IAEF;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAkFrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAqBvB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAQtB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA6BtB;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;CA0DtB"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import sql from "mssql";
|
|
2
|
+
export class ReadDataTool {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.name = "read_data";
|
|
5
|
+
this.description = "Executes a SELECT query on an MSSQL Database table. The query must start with SELECT and cannot contain any destructive SQL operations for security reasons. Automatically limits results to MAX_ROWS_DEFAULT (env var, default 1000) if no TOP/LIMIT clause is present.";
|
|
6
|
+
this.inputSchema = {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
query: {
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "SQL SELECT query to execute (must start with SELECT and cannot contain destructive operations). Example: SELECT * FROM movies WHERE genre = 'comedy'"
|
|
12
|
+
},
|
|
13
|
+
maxRows: {
|
|
14
|
+
type: "number",
|
|
15
|
+
description: "Optional override for maximum rows returned (1-100000).",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
required: ["query"],
|
|
19
|
+
};
|
|
20
|
+
// Read max rows from env var, default to 1000
|
|
21
|
+
const envMaxRows = process.env.MAX_ROWS_DEFAULT;
|
|
22
|
+
this.defaultMaxRows = envMaxRows && !isNaN(parseInt(envMaxRows, 10))
|
|
23
|
+
? Math.min(Math.max(parseInt(envMaxRows, 10), 1), 100000) // Clamp between 1 and 100k
|
|
24
|
+
: 1000;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Validates the SQL query for security issues
|
|
28
|
+
* @param query The SQL query to validate
|
|
29
|
+
* @returns Validation result with success flag and error message if invalid
|
|
30
|
+
*/
|
|
31
|
+
validateQuery(query) {
|
|
32
|
+
if (!query || typeof query !== 'string') {
|
|
33
|
+
return {
|
|
34
|
+
isValid: false,
|
|
35
|
+
error: 'Query must be a non-empty string'
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Remove comments and normalize whitespace for analysis
|
|
39
|
+
const cleanQuery = query
|
|
40
|
+
.replace(/--.*$/gm, '') // Remove line comments
|
|
41
|
+
.replace(/\/\*[\s\S]*?\*\//g, '') // Remove block comments
|
|
42
|
+
.replace(/\s+/g, ' ') // Normalize whitespace
|
|
43
|
+
.trim();
|
|
44
|
+
if (!cleanQuery) {
|
|
45
|
+
return {
|
|
46
|
+
isValid: false,
|
|
47
|
+
error: 'Query cannot be empty after removing comments'
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const upperQuery = cleanQuery.toUpperCase();
|
|
51
|
+
// Must start with SELECT
|
|
52
|
+
if (!upperQuery.startsWith('SELECT')) {
|
|
53
|
+
return {
|
|
54
|
+
isValid: false,
|
|
55
|
+
error: 'Query must start with SELECT for security reasons'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Check for dangerous keywords in the cleaned query using word boundaries
|
|
59
|
+
for (const keyword of ReadDataTool.DANGEROUS_KEYWORDS) {
|
|
60
|
+
// Use word boundary regex to match only complete keywords, not parts of words
|
|
61
|
+
const keywordRegex = new RegExp(`(^|\\s|[^A-Za-z0-9_])${keyword}($|\\s|[^A-Za-z0-9_])`, 'i');
|
|
62
|
+
if (keywordRegex.test(upperQuery)) {
|
|
63
|
+
return {
|
|
64
|
+
isValid: false,
|
|
65
|
+
error: `Dangerous keyword '${keyword}' detected in query. Only SELECT operations are allowed.`
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Check for dangerous patterns using regex
|
|
70
|
+
for (const pattern of ReadDataTool.DANGEROUS_PATTERNS) {
|
|
71
|
+
if (pattern.test(query)) {
|
|
72
|
+
return {
|
|
73
|
+
isValid: false,
|
|
74
|
+
error: 'Potentially malicious SQL pattern detected. Only simple SELECT queries are allowed.'
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Additional validation: Check for multiple statements
|
|
79
|
+
const statements = cleanQuery.split(';').filter(stmt => stmt.trim().length > 0);
|
|
80
|
+
if (statements.length > 1) {
|
|
81
|
+
return {
|
|
82
|
+
isValid: false,
|
|
83
|
+
error: 'Multiple SQL statements are not allowed. Use only a single SELECT statement.'
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Check for suspicious string patterns that might indicate obfuscation
|
|
87
|
+
if (query.includes('CHAR(') || query.includes('NCHAR(') || query.includes('ASCII(')) {
|
|
88
|
+
return {
|
|
89
|
+
isValid: false,
|
|
90
|
+
error: 'Character conversion functions are not allowed as they may be used for obfuscation.'
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Limit query length to prevent potential DoS
|
|
94
|
+
if (query.length > 10000) {
|
|
95
|
+
return {
|
|
96
|
+
isValid: false,
|
|
97
|
+
error: 'Query is too long. Maximum allowed length is 10,000 characters.'
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return { isValid: true };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Enforces row limit by injecting TOP n if not already present
|
|
104
|
+
* @param query The validated SQL query
|
|
105
|
+
* @returns Query with TOP clause if needed, plus flag indicating if limit was added
|
|
106
|
+
*/
|
|
107
|
+
enforceRowLimit(query, maxRows) {
|
|
108
|
+
const upperQuery = query.toUpperCase();
|
|
109
|
+
// Check if query already has TOP or LIMIT
|
|
110
|
+
const hasTop = /\bSELECT\s+TOP\s+\d+\b/i.test(query);
|
|
111
|
+
const hasLimit = /\bLIMIT\s+\d+\b/i.test(query);
|
|
112
|
+
if (hasTop || hasLimit) {
|
|
113
|
+
return { query, limitAdded: false };
|
|
114
|
+
}
|
|
115
|
+
// Inject TOP n after SELECT
|
|
116
|
+
// Handle SELECT DISTINCT separately
|
|
117
|
+
const modifiedQuery = query.replace(/^(\s*SELECT\s+)(DISTINCT\s+)?/i, `$1$2TOP ${maxRows} `);
|
|
118
|
+
return { query: modifiedQuery, limitAdded: true };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolves the maximum number of rows to return based on the input parameters and environment
|
|
122
|
+
* @param params Input parameters
|
|
123
|
+
* @returns Maximum number of rows to return
|
|
124
|
+
*/
|
|
125
|
+
resolveMaxRows(params) {
|
|
126
|
+
const maxRows = params.maxRows;
|
|
127
|
+
if (maxRows && !isNaN(parseInt(maxRows, 10))) {
|
|
128
|
+
return Math.min(Math.max(parseInt(maxRows, 10), 1), 100000); // Clamp between 1 and 100k
|
|
129
|
+
}
|
|
130
|
+
return this.defaultMaxRows;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Sanitizes the query result to prevent any potential security issues
|
|
134
|
+
* @param data The query result data
|
|
135
|
+
* @returns Sanitized data
|
|
136
|
+
*/
|
|
137
|
+
sanitizeResult(data) {
|
|
138
|
+
if (!Array.isArray(data)) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
// Limit the number of returned records to prevent memory issues
|
|
142
|
+
const maxRecords = 10000;
|
|
143
|
+
if (data.length > maxRecords) {
|
|
144
|
+
console.warn(`Query returned ${data.length} records, limiting to ${maxRecords}`);
|
|
145
|
+
return data.slice(0, maxRecords);
|
|
146
|
+
}
|
|
147
|
+
return data.map(record => {
|
|
148
|
+
if (typeof record === 'object' && record !== null) {
|
|
149
|
+
const sanitized = {};
|
|
150
|
+
for (const [key, value] of Object.entries(record)) {
|
|
151
|
+
// Sanitize column names (remove any suspicious characters)
|
|
152
|
+
const sanitizedKey = key.replace(/[^\w\s-_.]/g, '');
|
|
153
|
+
if (sanitizedKey !== key) {
|
|
154
|
+
console.warn(`Column name sanitized: ${key} -> ${sanitizedKey}`);
|
|
155
|
+
}
|
|
156
|
+
sanitized[sanitizedKey] = value;
|
|
157
|
+
}
|
|
158
|
+
return sanitized;
|
|
159
|
+
}
|
|
160
|
+
return record;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Executes the validated SQL query
|
|
165
|
+
* @param params Query parameters
|
|
166
|
+
* @returns Query execution result
|
|
167
|
+
*/
|
|
168
|
+
async run(params) {
|
|
169
|
+
try {
|
|
170
|
+
const { query } = params;
|
|
171
|
+
// Validate the query for security issues
|
|
172
|
+
const validation = this.validateQuery(query);
|
|
173
|
+
if (!validation.isValid) {
|
|
174
|
+
console.warn(`Security validation failed for query: ${query.substring(0, 100)}...`);
|
|
175
|
+
return {
|
|
176
|
+
success: false,
|
|
177
|
+
message: `Security validation failed: ${validation.error}`,
|
|
178
|
+
error: 'SECURITY_VALIDATION_FAILED'
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// Enforce row limit
|
|
182
|
+
const maxRowsToUse = this.resolveMaxRows(params);
|
|
183
|
+
const { query: limitedQuery, limitAdded } = this.enforceRowLimit(query, maxRowsToUse);
|
|
184
|
+
// Log the query for audit purposes (in production, consider more secure logging)
|
|
185
|
+
console.log(`Executing validated SELECT query${limitAdded ? ` (auto-limited to ${maxRowsToUse} rows)` : ''}: ${limitedQuery.substring(0, 200)}${limitedQuery.length > 200 ? '...' : ''}`);
|
|
186
|
+
// Execute the query
|
|
187
|
+
const request = new sql.Request();
|
|
188
|
+
const result = await request.query(limitedQuery);
|
|
189
|
+
// Sanitize the result
|
|
190
|
+
const sanitizedData = this.sanitizeResult(result.recordset);
|
|
191
|
+
return {
|
|
192
|
+
success: true,
|
|
193
|
+
message: `Query executed successfully. Retrieved ${sanitizedData.length} record(s)${result.recordset.length !== sanitizedData.length
|
|
194
|
+
? ` (limited from ${result.recordset.length} total records)`
|
|
195
|
+
: ''}${limitAdded ? ` [auto-limited to ${maxRowsToUse} rows]` : ''}`,
|
|
196
|
+
data: sanitizedData,
|
|
197
|
+
recordCount: sanitizedData.length,
|
|
198
|
+
totalRecords: result.recordset.length,
|
|
199
|
+
autoLimited: limitAdded
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
console.error("Error executing query:", error);
|
|
204
|
+
// Don't expose internal error details to prevent information leakage
|
|
205
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
206
|
+
const safeErrorMessage = errorMessage.includes('Invalid object name')
|
|
207
|
+
? errorMessage
|
|
208
|
+
: 'Database query execution failed';
|
|
209
|
+
return {
|
|
210
|
+
success: false,
|
|
211
|
+
message: `Failed to execute query: ${safeErrorMessage}`,
|
|
212
|
+
error: 'QUERY_EXECUTION_FAILED'
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// List of dangerous SQL keywords that should not be allowed
|
|
218
|
+
ReadDataTool.DANGEROUS_KEYWORDS = [
|
|
219
|
+
'DELETE', 'DROP', 'UPDATE', 'INSERT', 'ALTER', 'CREATE',
|
|
220
|
+
'TRUNCATE', 'EXEC', 'EXECUTE', 'MERGE', 'REPLACE',
|
|
221
|
+
'GRANT', 'REVOKE', 'COMMIT', 'ROLLBACK', 'TRANSACTION',
|
|
222
|
+
'BEGIN', 'DECLARE', 'SET', 'USE', 'BACKUP',
|
|
223
|
+
'RESTORE', 'KILL', 'SHUTDOWN', 'WAITFOR', 'OPENROWSET',
|
|
224
|
+
'OPENDATASOURCE', 'OPENQUERY', 'OPENXML', 'BULK', 'INTO'
|
|
225
|
+
];
|
|
226
|
+
// Regex patterns to detect common SQL injection techniques
|
|
227
|
+
ReadDataTool.DANGEROUS_PATTERNS = [
|
|
228
|
+
// SELECT INTO operations that create new tables
|
|
229
|
+
/SELECT\s+.*?\s+INTO\s+/i,
|
|
230
|
+
// Semicolon followed by dangerous keywords
|
|
231
|
+
/;\s*(DELETE|DROP|UPDATE|INSERT|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE|MERGE|REPLACE|GRANT|REVOKE)/i,
|
|
232
|
+
// UNION injection attempts with dangerous keywords
|
|
233
|
+
/UNION\s+(?:ALL\s+)?SELECT.*?(DELETE|DROP|UPDATE|INSERT|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE)/i,
|
|
234
|
+
// Comment-based injection attempts
|
|
235
|
+
/--.*?(DELETE|DROP|UPDATE|INSERT|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE)/i,
|
|
236
|
+
/\/\*.*?(DELETE|DROP|UPDATE|INSERT|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE).*?\*\//i,
|
|
237
|
+
// Stored procedure execution patterns
|
|
238
|
+
/EXEC\s*\(/i,
|
|
239
|
+
/EXECUTE\s*\(/i,
|
|
240
|
+
/sp_/i,
|
|
241
|
+
/xp_/i,
|
|
242
|
+
// Dynamic SQL construction
|
|
243
|
+
/EXEC\s*\(/i,
|
|
244
|
+
/EXECUTE\s*\(/i,
|
|
245
|
+
// Bulk operations
|
|
246
|
+
/BULK\s+INSERT/i,
|
|
247
|
+
/OPENROWSET/i,
|
|
248
|
+
/OPENDATASOURCE/i,
|
|
249
|
+
// System functions that could be dangerous
|
|
250
|
+
/@@/,
|
|
251
|
+
/SYSTEM_USER/i,
|
|
252
|
+
/USER_NAME/i,
|
|
253
|
+
/DB_NAME/i,
|
|
254
|
+
/HOST_NAME/i,
|
|
255
|
+
// Time delay attacks
|
|
256
|
+
/WAITFOR\s+DELAY/i,
|
|
257
|
+
/WAITFOR\s+TIME/i,
|
|
258
|
+
// Multiple statements (semicolon not at end)
|
|
259
|
+
/;\s*\w/,
|
|
260
|
+
// String concatenation that might hide malicious code
|
|
261
|
+
/\+\s*CHAR\s*\(/i,
|
|
262
|
+
/\+\s*NCHAR\s*\(/i,
|
|
263
|
+
/\+\s*ASCII\s*\(/i,
|
|
264
|
+
];
|
|
265
|
+
//# sourceMappingURL=ReadDataTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadDataTool.js","sourceRoot":"","sources":["../../src/tools/ReadDataTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
type RelationshipParams = {
|
|
3
|
+
tableName: string;
|
|
4
|
+
schemaName?: string;
|
|
5
|
+
includeOutbound?: boolean;
|
|
6
|
+
includeInbound?: boolean;
|
|
7
|
+
};
|
|
8
|
+
type ColumnMapping = {
|
|
9
|
+
fromColumn: string;
|
|
10
|
+
toColumn: string;
|
|
11
|
+
};
|
|
12
|
+
type Relationship = {
|
|
13
|
+
constraintName: string;
|
|
14
|
+
from: {
|
|
15
|
+
schemaName: string;
|
|
16
|
+
tableName: string;
|
|
17
|
+
};
|
|
18
|
+
to: {
|
|
19
|
+
schemaName: string;
|
|
20
|
+
tableName: string;
|
|
21
|
+
};
|
|
22
|
+
columnMapping: ColumnMapping[];
|
|
23
|
+
updateRule: string;
|
|
24
|
+
deleteRule: string;
|
|
25
|
+
};
|
|
26
|
+
type RelationshipResult = {
|
|
27
|
+
success: boolean;
|
|
28
|
+
message?: string;
|
|
29
|
+
tableName?: string;
|
|
30
|
+
schemaName?: string;
|
|
31
|
+
outbound?: Relationship[];
|
|
32
|
+
inbound?: Relationship[];
|
|
33
|
+
};
|
|
34
|
+
export declare class RelationshipInspectorTool implements Tool {
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
inputSchema: any;
|
|
39
|
+
private normalizeBool;
|
|
40
|
+
private ensureTableExists;
|
|
41
|
+
private mapRelationships;
|
|
42
|
+
private fetchRelationships;
|
|
43
|
+
run(params: RelationshipParams): Promise<RelationshipResult>;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=RelationshipInspectorTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationshipInspectorTool.d.ts","sourceRoot":"","sources":["../../src/tools/RelationshipInspectorTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,KAAK,kBAAkB,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B,CAAC;AAeF,qBAAa,yBAA0B,YAAW,IAAI;IACpD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAA2B;IAC/B,WAAW,SAAoI;IAE/I,WAAW,EAqBN,GAAG,CAAC;IAET,OAAO,CAAC,aAAa;YAIP,iBAAiB;IAY/B,OAAO,CAAC,gBAAgB;YAuBV,kBAAkB;IA6C1B,GAAG,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsDnE"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import sql from "mssql";
|
|
2
|
+
export class RelationshipInspectorTool {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.name = "inspect_relationships";
|
|
5
|
+
this.description = "Describes inbound and outbound foreign-key relationships for a given table, including column mappings and referential actions.";
|
|
6
|
+
this.inputSchema = {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
tableName: {
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "Target table name (without schema).",
|
|
12
|
+
},
|
|
13
|
+
schemaName: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description: "Schema name (defaults to 'dbo').",
|
|
16
|
+
},
|
|
17
|
+
includeOutbound: {
|
|
18
|
+
type: "boolean",
|
|
19
|
+
description: "Include relationships where the table references other tables (default true).",
|
|
20
|
+
},
|
|
21
|
+
includeInbound: {
|
|
22
|
+
type: "boolean",
|
|
23
|
+
description: "Include relationships where other tables reference this table (default true).",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
required: ["tableName"],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
normalizeBool(value, fallback) {
|
|
30
|
+
return typeof value === "boolean" ? value : fallback;
|
|
31
|
+
}
|
|
32
|
+
async ensureTableExists(schemaName, tableName) {
|
|
33
|
+
const request = new sql.Request();
|
|
34
|
+
request.input("schemaName", sql.NVarChar, schemaName);
|
|
35
|
+
request.input("tableName", sql.NVarChar, tableName);
|
|
36
|
+
const result = await request.query(`
|
|
37
|
+
SELECT 1
|
|
38
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
39
|
+
WHERE TABLE_SCHEMA = @schemaName AND TABLE_NAME = @tableName
|
|
40
|
+
`);
|
|
41
|
+
return result.recordset.length > 0;
|
|
42
|
+
}
|
|
43
|
+
mapRelationships(rows) {
|
|
44
|
+
const grouped = new Map();
|
|
45
|
+
for (const row of rows) {
|
|
46
|
+
if (!grouped.has(row.constraintName)) {
|
|
47
|
+
grouped.set(row.constraintName, {
|
|
48
|
+
constraintName: row.constraintName,
|
|
49
|
+
from: { schemaName: row.fromSchema, tableName: row.fromTable },
|
|
50
|
+
to: { schemaName: row.toSchema, tableName: row.toTable },
|
|
51
|
+
columnMapping: [],
|
|
52
|
+
updateRule: row.updateRule,
|
|
53
|
+
deleteRule: row.deleteRule,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const relationship = grouped.get(row.constraintName);
|
|
57
|
+
relationship.columnMapping.push({ fromColumn: row.fromColumn, toColumn: row.toColumn });
|
|
58
|
+
}
|
|
59
|
+
return Array.from(grouped.values()).map((rel) => ({
|
|
60
|
+
...rel,
|
|
61
|
+
columnMapping: rel.columnMapping.sort((a, b) => a.fromColumn.localeCompare(b.fromColumn)),
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
async fetchRelationships(schemaName, tableName, direction) {
|
|
65
|
+
const request = new sql.Request();
|
|
66
|
+
request.input("schemaName", sql.NVarChar, schemaName);
|
|
67
|
+
request.input("tableName", sql.NVarChar, tableName);
|
|
68
|
+
const baseQuery = `
|
|
69
|
+
SELECT
|
|
70
|
+
fk.CONSTRAINT_NAME AS constraintName,
|
|
71
|
+
fk.UPDATE_RULE AS updateRule,
|
|
72
|
+
fk.DELETE_RULE AS deleteRule,
|
|
73
|
+
child.TABLE_SCHEMA AS fromSchema,
|
|
74
|
+
child.TABLE_NAME AS fromTable,
|
|
75
|
+
parent.TABLE_SCHEMA AS toSchema,
|
|
76
|
+
parent.TABLE_NAME AS toTable,
|
|
77
|
+
childCol.COLUMN_NAME AS fromColumn,
|
|
78
|
+
parentCol.COLUMN_NAME AS toColumn,
|
|
79
|
+
childCol.ORDINAL_POSITION AS ordinal
|
|
80
|
+
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS fk
|
|
81
|
+
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS child
|
|
82
|
+
ON child.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
|
|
83
|
+
AND child.CONSTRAINT_TYPE = 'FOREIGN KEY'
|
|
84
|
+
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS parent
|
|
85
|
+
ON parent.CONSTRAINT_NAME = fk.UNIQUE_CONSTRAINT_NAME
|
|
86
|
+
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE childCol
|
|
87
|
+
ON childCol.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
|
|
88
|
+
AND childCol.TABLE_SCHEMA = child.TABLE_SCHEMA
|
|
89
|
+
AND childCol.TABLE_NAME = child.TABLE_NAME
|
|
90
|
+
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE parentCol
|
|
91
|
+
ON parentCol.CONSTRAINT_NAME = fk.UNIQUE_CONSTRAINT_NAME
|
|
92
|
+
AND parentCol.TABLE_SCHEMA = parent.TABLE_SCHEMA
|
|
93
|
+
AND parentCol.TABLE_NAME = parent.TABLE_NAME
|
|
94
|
+
AND childCol.ORDINAL_POSITION = parentCol.ORDINAL_POSITION
|
|
95
|
+
WHERE {{FILTER}}
|
|
96
|
+
ORDER BY fk.CONSTRAINT_NAME, childCol.ORDINAL_POSITION
|
|
97
|
+
`;
|
|
98
|
+
const filter = direction === "outbound"
|
|
99
|
+
? "child.TABLE_SCHEMA = @schemaName AND child.TABLE_NAME = @tableName"
|
|
100
|
+
: "parent.TABLE_SCHEMA = @schemaName AND parent.TABLE_NAME = @tableName";
|
|
101
|
+
const query = baseQuery.replace("{{FILTER}}", filter);
|
|
102
|
+
const result = await request.query(query);
|
|
103
|
+
return this.mapRelationships(result.recordset ?? []);
|
|
104
|
+
}
|
|
105
|
+
async run(params) {
|
|
106
|
+
try {
|
|
107
|
+
const tableName = params.tableName?.trim();
|
|
108
|
+
if (!tableName) {
|
|
109
|
+
return { success: false, message: "tableName is required." };
|
|
110
|
+
}
|
|
111
|
+
const schemaName = params.schemaName?.trim() || "dbo";
|
|
112
|
+
const includeOutbound = this.normalizeBool(params.includeOutbound, true);
|
|
113
|
+
const includeInbound = this.normalizeBool(params.includeInbound, true);
|
|
114
|
+
if (!includeOutbound && !includeInbound) {
|
|
115
|
+
return {
|
|
116
|
+
success: false,
|
|
117
|
+
message: "At least one of includeOutbound or includeInbound must be true.",
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const tableExists = await this.ensureTableExists(schemaName, tableName);
|
|
121
|
+
if (!tableExists) {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
message: `Table [${schemaName}].[${tableName}] was not found.`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const [outbound, inbound] = await Promise.all([
|
|
128
|
+
includeOutbound ? this.fetchRelationships(schemaName, tableName, "outbound") : Promise.resolve([]),
|
|
129
|
+
includeInbound ? this.fetchRelationships(schemaName, tableName, "inbound") : Promise.resolve([]),
|
|
130
|
+
]);
|
|
131
|
+
if ((!outbound || outbound.length === 0) && (!inbound || inbound.length === 0)) {
|
|
132
|
+
return {
|
|
133
|
+
success: true,
|
|
134
|
+
tableName,
|
|
135
|
+
schemaName,
|
|
136
|
+
message: "No foreign key relationships found for the specified table.",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
success: true,
|
|
141
|
+
tableName,
|
|
142
|
+
schemaName,
|
|
143
|
+
outbound: outbound.length ? outbound : undefined,
|
|
144
|
+
inbound: inbound.length ? inbound : undefined,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
return {
|
|
149
|
+
success: false,
|
|
150
|
+
message: `Failed to inspect relationships: ${error}`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=RelationshipInspectorTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationshipInspectorTool.js","sourceRoot":"","sources":["../../src/tools/RelationshipInspectorTool.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AA8CxB,MAAM,OAAO,yBAAyB;IAAtC;QAEE,SAAI,GAAG,uBAAuB,CAAC;QAC/B,gBAAW,GAAG,gIAAgI,CAAC;QAE/I,gBAAW,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kCAAkC;iBAChD;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,+EAA+E;iBAC7F;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,+EAA+E;iBAC7F;aACF;YACD,QAAQ,EAAE,CAAC,WAAW,CAAC;SACjB,CAAC;IA4IX,CAAC;IA1IS,aAAa,CAAC,KAA0B,EAAE,QAAiB;QACjE,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvD,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,UAAkB,EAAE,SAAiB;QACnE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;;;;KAIlC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,CAAC;IAEO,gBAAgB,CAAC,IAAuB;QAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE;oBAC9B,cAAc,EAAE,GAAG,CAAC,cAAc;oBAClC,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;oBAC9D,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE;oBACxD,aAAa,EAAE,EAAE;oBACjB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;iBAC3B,CAAC,CAAC;YACL,CAAC;YACD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC;YACtD,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChD,GAAG,GAAG;YACN,aAAa,EAAE,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;SAC1F,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,SAAiB,EAAE,SAAiC;QACvG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6BjB,CAAC;QAEF,MAAM,MAAM,GAAG,SAAS,KAAK,UAAU;YACrC,CAAC,CAAC,oEAAoE;YACtE,CAAC,CAAC,sEAAsE,CAAC;QAE3E,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAkB,KAAK,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAA0B;QAClC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;YAC/D,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC;YACtD,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YACzE,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAEvE,IAAI,CAAC,eAAe,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,iEAAiE;iBAC3E,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACxE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,UAAU,UAAU,MAAM,SAAS,kBAAkB;iBAC/D,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC5C,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aACjG,CAAC,CAAC;YAEH,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC/E,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,SAAS;oBACT,UAAU;oBACV,OAAO,EAAE,6DAA6D;iBACvE,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS;gBACT,UAAU;gBACV,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;gBAChD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAC9C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,oCAAoC,KAAK,EAAE;aACrD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|