@connorbritain/mssql-mcp-core 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.
Files changed (129) hide show
  1. package/dist/audit/AuditLogger.d.ts +37 -0
  2. package/dist/audit/AuditLogger.d.ts.map +1 -0
  3. package/dist/audit/AuditLogger.js +145 -0
  4. package/dist/audit/AuditLogger.js.map +1 -0
  5. package/dist/config/EnvironmentManager.d.ts +75 -0
  6. package/dist/config/EnvironmentManager.d.ts.map +1 -0
  7. package/dist/config/EnvironmentManager.js +305 -0
  8. package/dist/config/EnvironmentManager.js.map +1 -0
  9. package/dist/config/ScriptManager.d.ts +69 -0
  10. package/dist/config/ScriptManager.d.ts.map +1 -0
  11. package/dist/config/ScriptManager.js +166 -0
  12. package/dist/config/ScriptManager.js.map +1 -0
  13. package/dist/config/SecretResolver.d.ts +66 -0
  14. package/dist/config/SecretResolver.d.ts.map +1 -0
  15. package/dist/config/SecretResolver.js +230 -0
  16. package/dist/config/SecretResolver.js.map +1 -0
  17. package/dist/index.d.ts +14 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +17 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/routing/IntentRouter.d.ts +17 -0
  22. package/dist/routing/IntentRouter.d.ts.map +1 -0
  23. package/dist/routing/IntentRouter.js +243 -0
  24. package/dist/routing/IntentRouter.js.map +1 -0
  25. package/dist/server/createMcpServer.d.ts +7 -0
  26. package/dist/server/createMcpServer.d.ts.map +1 -0
  27. package/dist/server/createMcpServer.js +100 -0
  28. package/dist/server/createMcpServer.js.map +1 -0
  29. package/dist/server/toolsets.d.ts +42 -0
  30. package/dist/server/toolsets.d.ts.map +1 -0
  31. package/dist/server/toolsets.js +303 -0
  32. package/dist/server/toolsets.js.map +1 -0
  33. package/dist/server/wrapToolRun.d.ts +13 -0
  34. package/dist/server/wrapToolRun.d.ts.map +1 -0
  35. package/dist/server/wrapToolRun.js +102 -0
  36. package/dist/server/wrapToolRun.js.map +1 -0
  37. package/dist/shims.d.ts +2 -0
  38. package/dist/shims.d.ts.map +1 -0
  39. package/dist/shims.js +15 -0
  40. package/dist/shims.js.map +1 -0
  41. package/dist/tools/CreateIndexTool.d.ts +24 -0
  42. package/dist/tools/CreateIndexTool.d.ts.map +1 -0
  43. package/dist/tools/CreateIndexTool.js +64 -0
  44. package/dist/tools/CreateIndexTool.js.map +1 -0
  45. package/dist/tools/CreateTableTool.d.ts +12 -0
  46. package/dist/tools/CreateTableTool.d.ts.map +1 -0
  47. package/dist/tools/CreateTableTool.js +49 -0
  48. package/dist/tools/CreateTableTool.js.map +1 -0
  49. package/dist/tools/DeleteDataTool.d.ts +56 -0
  50. package/dist/tools/DeleteDataTool.d.ts.map +1 -0
  51. package/dist/tools/DeleteDataTool.js +103 -0
  52. package/dist/tools/DeleteDataTool.js.map +1 -0
  53. package/dist/tools/DescribeTableTool.d.ts +32 -0
  54. package/dist/tools/DescribeTableTool.d.ts.map +1 -0
  55. package/dist/tools/DescribeTableTool.js +116 -0
  56. package/dist/tools/DescribeTableTool.js.map +1 -0
  57. package/dist/tools/DropTableTool.d.ts +12 -0
  58. package/dist/tools/DropTableTool.d.ts.map +1 -0
  59. package/dist/tools/DropTableTool.js +37 -0
  60. package/dist/tools/DropTableTool.js.map +1 -0
  61. package/dist/tools/ExplainQueryTool.d.ts +24 -0
  62. package/dist/tools/ExplainQueryTool.d.ts.map +1 -0
  63. package/dist/tools/ExplainQueryTool.js +98 -0
  64. package/dist/tools/ExplainQueryTool.js.map +1 -0
  65. package/dist/tools/InsertDataTool.d.ts +17 -0
  66. package/dist/tools/InsertDataTool.d.ts.map +1 -0
  67. package/dist/tools/InsertDataTool.js +102 -0
  68. package/dist/tools/InsertDataTool.js.map +1 -0
  69. package/dist/tools/InspectDependenciesTool.d.ts +46 -0
  70. package/dist/tools/InspectDependenciesTool.d.ts.map +1 -0
  71. package/dist/tools/InspectDependenciesTool.js +215 -0
  72. package/dist/tools/InspectDependenciesTool.js.map +1 -0
  73. package/dist/tools/ListDatabasesTool.d.ts +27 -0
  74. package/dist/tools/ListDatabasesTool.d.ts.map +1 -0
  75. package/dist/tools/ListDatabasesTool.js +107 -0
  76. package/dist/tools/ListDatabasesTool.js.map +1 -0
  77. package/dist/tools/ListEnvironmentsTool.d.ts +49 -0
  78. package/dist/tools/ListEnvironmentsTool.d.ts.map +1 -0
  79. package/dist/tools/ListEnvironmentsTool.js +73 -0
  80. package/dist/tools/ListEnvironmentsTool.js.map +1 -0
  81. package/dist/tools/ListScriptsTool.d.ts +41 -0
  82. package/dist/tools/ListScriptsTool.d.ts.map +1 -0
  83. package/dist/tools/ListScriptsTool.js +86 -0
  84. package/dist/tools/ListScriptsTool.js.map +1 -0
  85. package/dist/tools/ListTableTool.d.ts +24 -0
  86. package/dist/tools/ListTableTool.d.ts.map +1 -0
  87. package/dist/tools/ListTableTool.js +85 -0
  88. package/dist/tools/ListTableTool.js.map +1 -0
  89. package/dist/tools/ProfileTableTool.d.ts +78 -0
  90. package/dist/tools/ProfileTableTool.d.ts.map +1 -0
  91. package/dist/tools/ProfileTableTool.js +373 -0
  92. package/dist/tools/ProfileTableTool.js.map +1 -0
  93. package/dist/tools/ReadDataTool.d.ts +61 -0
  94. package/dist/tools/ReadDataTool.d.ts.map +1 -0
  95. package/dist/tools/ReadDataTool.js +299 -0
  96. package/dist/tools/ReadDataTool.js.map +1 -0
  97. package/dist/tools/RelationshipInspectorTool.d.ts +46 -0
  98. package/dist/tools/RelationshipInspectorTool.d.ts.map +1 -0
  99. package/dist/tools/RelationshipInspectorTool.js +156 -0
  100. package/dist/tools/RelationshipInspectorTool.js.map +1 -0
  101. package/dist/tools/RunScriptTool.d.ts +214 -0
  102. package/dist/tools/RunScriptTool.d.ts.map +1 -0
  103. package/dist/tools/RunScriptTool.js +186 -0
  104. package/dist/tools/RunScriptTool.js.map +1 -0
  105. package/dist/tools/SearchSchemaTool.d.ts +88 -0
  106. package/dist/tools/SearchSchemaTool.d.ts.map +1 -0
  107. package/dist/tools/SearchSchemaTool.js +237 -0
  108. package/dist/tools/SearchSchemaTool.js.map +1 -0
  109. package/dist/tools/TestConnectionTool.d.ts +38 -0
  110. package/dist/tools/TestConnectionTool.d.ts.map +1 -0
  111. package/dist/tools/TestConnectionTool.js +156 -0
  112. package/dist/tools/TestConnectionTool.js.map +1 -0
  113. package/dist/tools/UpdateDataTool.d.ts +61 -0
  114. package/dist/tools/UpdateDataTool.d.ts.map +1 -0
  115. package/dist/tools/UpdateDataTool.js +117 -0
  116. package/dist/tools/UpdateDataTool.js.map +1 -0
  117. package/dist/tools/ValidateEnvironmentConfigTool.d.ts +51 -0
  118. package/dist/tools/ValidateEnvironmentConfigTool.d.ts.map +1 -0
  119. package/dist/tools/ValidateEnvironmentConfigTool.js +320 -0
  120. package/dist/tools/ValidateEnvironmentConfigTool.js.map +1 -0
  121. package/dist/tools/index.d.ts +21 -0
  122. package/dist/tools/index.d.ts.map +1 -0
  123. package/dist/tools/index.js +22 -0
  124. package/dist/tools/index.js.map +1 -0
  125. package/dist/types.d.ts +60 -0
  126. package/dist/types.d.ts.map +1 -0
  127. package/dist/types.js +2 -0
  128. package/dist/types.js.map +1 -0
  129. package/package.json +53 -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,61 @@
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 policy.
25
+ * Priority: environment policy maxRowsDefault (enforced cap) > user-specified maxRows > tool default
26
+ * @param params Input parameters including environmentPolicy
27
+ * @returns Maximum number of rows to return
28
+ */
29
+ private resolveMaxRows;
30
+ /**
31
+ * Sanitizes the query result to prevent any potential security issues
32
+ * @param data The query result data
33
+ * @returns Sanitized data
34
+ */
35
+ private sanitizeResult;
36
+ /**
37
+ * Executes the validated SQL query
38
+ * @param params Query parameters
39
+ * @returns Query execution result
40
+ */
41
+ run(params: any): Promise<{
42
+ success: boolean;
43
+ message: string;
44
+ error: string;
45
+ database?: undefined;
46
+ data?: undefined;
47
+ recordCount?: undefined;
48
+ totalRecords?: undefined;
49
+ autoLimited?: undefined;
50
+ } | {
51
+ success: boolean;
52
+ message: string;
53
+ database: any;
54
+ data: any[];
55
+ recordCount: number;
56
+ totalRecords: number;
57
+ autoLimited: boolean;
58
+ error?: undefined;
59
+ }>;
60
+ }
61
+ //# 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;AAG1D,qBAAa,YAAa,YAAW,IAAI;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAAe;IACnB,WAAW,SAAqH;IAEhI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,WAAW,EAiBN,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;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA6BtB;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;;CAiFtB"}
@@ -0,0 +1,299 @@
1
+ import sql from "mssql";
2
+ import { getEnvironmentManager } from "../config/EnvironmentManager.js";
3
+ export class ReadDataTool {
4
+ constructor() {
5
+ this.name = "read_data";
6
+ this.description = "Executes a read-only SELECT query. Auto-limits results if no TOP clause present. Blocks destructive operations.";
7
+ this.inputSchema = {
8
+ type: "object",
9
+ properties: {
10
+ query: {
11
+ type: "string",
12
+ description: "SQL SELECT query to execute (must start with SELECT and cannot contain destructive operations). Example: SELECT * FROM movies WHERE genre = 'comedy'"
13
+ },
14
+ database: {
15
+ type: "string",
16
+ description: "Optional: Target database name for server-level access environments. If specified, queries will use three-part naming (database.schema.table). Requires server-level access.",
17
+ },
18
+ maxRows: {
19
+ type: "number",
20
+ description: "Optional override for maximum rows returned (1-100000).",
21
+ },
22
+ },
23
+ required: ["query"],
24
+ };
25
+ // Read max rows from env var, default to 1000
26
+ const envMaxRows = process.env.MAX_ROWS_DEFAULT;
27
+ this.defaultMaxRows = envMaxRows && !isNaN(parseInt(envMaxRows, 10))
28
+ ? Math.min(Math.max(parseInt(envMaxRows, 10), 1), 100000) // Clamp between 1 and 100k
29
+ : 1000;
30
+ }
31
+ /**
32
+ * Validates the SQL query for security issues
33
+ * @param query The SQL query to validate
34
+ * @returns Validation result with success flag and error message if invalid
35
+ */
36
+ validateQuery(query) {
37
+ if (!query || typeof query !== 'string') {
38
+ return {
39
+ isValid: false,
40
+ error: 'Query must be a non-empty string'
41
+ };
42
+ }
43
+ // Remove comments and normalize whitespace for analysis
44
+ const cleanQuery = query
45
+ .replace(/--.*$/gm, '') // Remove line comments
46
+ .replace(/\/\*[\s\S]*?\*\//g, '') // Remove block comments
47
+ .replace(/\s+/g, ' ') // Normalize whitespace
48
+ .trim();
49
+ if (!cleanQuery) {
50
+ return {
51
+ isValid: false,
52
+ error: 'Query cannot be empty after removing comments'
53
+ };
54
+ }
55
+ const upperQuery = cleanQuery.toUpperCase();
56
+ // Must start with SELECT
57
+ if (!upperQuery.startsWith('SELECT')) {
58
+ return {
59
+ isValid: false,
60
+ error: 'Query must start with SELECT for security reasons'
61
+ };
62
+ }
63
+ // Check for dangerous keywords in the cleaned query using word boundaries
64
+ for (const keyword of ReadDataTool.DANGEROUS_KEYWORDS) {
65
+ // Use word boundary regex to match only complete keywords, not parts of words
66
+ const keywordRegex = new RegExp(`(^|\\s|[^A-Za-z0-9_])${keyword}($|\\s|[^A-Za-z0-9_])`, 'i');
67
+ if (keywordRegex.test(upperQuery)) {
68
+ return {
69
+ isValid: false,
70
+ error: `Dangerous keyword '${keyword}' detected in query. Only SELECT operations are allowed.`
71
+ };
72
+ }
73
+ }
74
+ // Check for dangerous patterns using regex
75
+ for (const pattern of ReadDataTool.DANGEROUS_PATTERNS) {
76
+ if (pattern.test(query)) {
77
+ return {
78
+ isValid: false,
79
+ error: 'Potentially malicious SQL pattern detected. Only simple SELECT queries are allowed.'
80
+ };
81
+ }
82
+ }
83
+ // Additional validation: Check for multiple statements
84
+ const statements = cleanQuery.split(';').filter(stmt => stmt.trim().length > 0);
85
+ if (statements.length > 1) {
86
+ return {
87
+ isValid: false,
88
+ error: 'Multiple SQL statements are not allowed. Use only a single SELECT statement.'
89
+ };
90
+ }
91
+ // Check for suspicious string patterns that might indicate obfuscation
92
+ if (query.includes('CHAR(') || query.includes('NCHAR(') || query.includes('ASCII(')) {
93
+ return {
94
+ isValid: false,
95
+ error: 'Character conversion functions are not allowed as they may be used for obfuscation.'
96
+ };
97
+ }
98
+ // Limit query length to prevent potential DoS
99
+ if (query.length > 10000) {
100
+ return {
101
+ isValid: false,
102
+ error: 'Query is too long. Maximum allowed length is 10,000 characters.'
103
+ };
104
+ }
105
+ return { isValid: true };
106
+ }
107
+ /**
108
+ * Enforces row limit by injecting TOP n if not already present
109
+ * @param query The validated SQL query
110
+ * @returns Query with TOP clause if needed, plus flag indicating if limit was added
111
+ */
112
+ enforceRowLimit(query, maxRows) {
113
+ const upperQuery = query.toUpperCase();
114
+ // Check if query already has TOP or LIMIT
115
+ const hasTop = /\bSELECT\s+TOP\s+\d+\b/i.test(query);
116
+ const hasLimit = /\bLIMIT\s+\d+\b/i.test(query);
117
+ if (hasTop || hasLimit) {
118
+ return { query, limitAdded: false };
119
+ }
120
+ // Inject TOP n after SELECT
121
+ // Handle SELECT DISTINCT separately
122
+ const modifiedQuery = query.replace(/^(\s*SELECT\s+)(DISTINCT\s+)?/i, `$1$2TOP ${maxRows} `);
123
+ return { query: modifiedQuery, limitAdded: true };
124
+ }
125
+ /**
126
+ * Resolves the maximum number of rows to return based on the input parameters and environment policy.
127
+ * Priority: environment policy maxRowsDefault (enforced cap) > user-specified maxRows > tool default
128
+ * @param params Input parameters including environmentPolicy
129
+ * @returns Maximum number of rows to return
130
+ */
131
+ resolveMaxRows(params) {
132
+ const envPolicyMax = params.environmentPolicy?.maxRowsDefault;
133
+ const userMaxRows = params.maxRows;
134
+ // Start with tool default
135
+ let effectiveMax = this.defaultMaxRows;
136
+ // User can override up to tool default
137
+ if (userMaxRows && !isNaN(parseInt(userMaxRows, 10))) {
138
+ effectiveMax = Math.min(Math.max(parseInt(userMaxRows, 10), 1), 100000);
139
+ }
140
+ // Environment policy cap takes precedence (cannot exceed)
141
+ if (envPolicyMax && !isNaN(envPolicyMax)) {
142
+ effectiveMax = Math.min(effectiveMax, envPolicyMax);
143
+ }
144
+ return effectiveMax;
145
+ }
146
+ /**
147
+ * Sanitizes the query result to prevent any potential security issues
148
+ * @param data The query result data
149
+ * @returns Sanitized data
150
+ */
151
+ sanitizeResult(data) {
152
+ if (!Array.isArray(data)) {
153
+ return [];
154
+ }
155
+ // Limit the number of returned records to prevent memory issues
156
+ const maxRecords = 10000;
157
+ if (data.length > maxRecords) {
158
+ console.warn(`Query returned ${data.length} records, limiting to ${maxRecords}`);
159
+ return data.slice(0, maxRecords);
160
+ }
161
+ return data.map(record => {
162
+ if (typeof record === 'object' && record !== null) {
163
+ const sanitized = {};
164
+ for (const [key, value] of Object.entries(record)) {
165
+ // Sanitize column names (remove any suspicious characters)
166
+ const sanitizedKey = key.replace(/[^\w\s-_.]/g, '');
167
+ if (sanitizedKey !== key) {
168
+ console.warn(`Column name sanitized: ${key} -> ${sanitizedKey}`);
169
+ }
170
+ sanitized[sanitizedKey] = value;
171
+ }
172
+ return sanitized;
173
+ }
174
+ return record;
175
+ });
176
+ }
177
+ /**
178
+ * Executes the validated SQL query
179
+ * @param params Query parameters
180
+ * @returns Query execution result
181
+ */
182
+ async run(params) {
183
+ try {
184
+ const { query, database, environment } = params;
185
+ // Validate database access if a specific database is requested
186
+ if (database) {
187
+ const envManager = getEnvironmentManager();
188
+ const dbCheck = envManager.isDatabaseAllowed(environment, database);
189
+ if (!dbCheck.allowed) {
190
+ return {
191
+ success: false,
192
+ message: dbCheck.reason || `Access to database '${database}' is not allowed.`,
193
+ error: "DATABASE_ACCESS_DENIED",
194
+ };
195
+ }
196
+ }
197
+ // Validate the query for security issues
198
+ const validation = this.validateQuery(query);
199
+ if (!validation.isValid) {
200
+ console.warn(`Security validation failed for query: ${query.substring(0, 100)}...`);
201
+ return {
202
+ success: false,
203
+ message: `Security validation failed: ${validation.error}`,
204
+ error: "SECURITY_VALIDATION_FAILED",
205
+ };
206
+ }
207
+ // Enforce row limit
208
+ const maxRowsToUse = this.resolveMaxRows(params);
209
+ const { query: limitedQuery, limitAdded } = this.enforceRowLimit(query, maxRowsToUse);
210
+ // Build the final query - prepend USE [database] if specified
211
+ let finalQuery = limitedQuery;
212
+ if (database) {
213
+ // Escape database name to prevent injection
214
+ const safeDbName = database.replace(/]/g, "]]");
215
+ finalQuery = `USE [${safeDbName}]; ${limitedQuery}`;
216
+ }
217
+ // Log the query for audit purposes (in production, consider more secure logging)
218
+ console.log(`Executing validated SELECT query${database ? ` on [${database}]` : ""}${limitAdded ? ` (auto-limited to ${maxRowsToUse} rows)` : ""}: ${limitedQuery.substring(0, 200)}${limitedQuery.length > 200 ? "..." : ""}`);
219
+ // Execute the query
220
+ const request = new sql.Request(params.pool);
221
+ const result = await request.query(finalQuery);
222
+ // Sanitize the result
223
+ const sanitizedData = this.sanitizeResult(result.recordset);
224
+ return {
225
+ success: true,
226
+ message: `Query executed successfully${database ? ` on [${database}]` : ""}. Retrieved ${sanitizedData.length} record(s)${result.recordset.length !== sanitizedData.length
227
+ ? ` (limited from ${result.recordset.length} total records)`
228
+ : ""}${limitAdded ? ` [auto-limited to ${maxRowsToUse} rows]` : ""}`,
229
+ database: database || undefined,
230
+ data: sanitizedData,
231
+ recordCount: sanitizedData.length,
232
+ totalRecords: result.recordset.length,
233
+ autoLimited: limitAdded,
234
+ };
235
+ }
236
+ catch (error) {
237
+ console.error("Error executing query:", error);
238
+ // Don't expose internal error details to prevent information leakage
239
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
240
+ const safeErrorMessage = errorMessage.includes("Invalid object name")
241
+ ? errorMessage
242
+ : "Database query execution failed";
243
+ return {
244
+ success: false,
245
+ message: `Failed to execute query: ${safeErrorMessage}`,
246
+ error: "QUERY_EXECUTION_FAILED",
247
+ };
248
+ }
249
+ }
250
+ }
251
+ // List of dangerous SQL keywords that should not be allowed
252
+ ReadDataTool.DANGEROUS_KEYWORDS = [
253
+ 'DELETE', 'DROP', 'UPDATE', 'INSERT', 'ALTER', 'CREATE',
254
+ 'TRUNCATE', 'EXEC', 'EXECUTE', 'MERGE', 'REPLACE',
255
+ 'GRANT', 'REVOKE', 'COMMIT', 'ROLLBACK', 'TRANSACTION',
256
+ 'BEGIN', 'DECLARE', 'SET', 'USE', 'BACKUP',
257
+ 'RESTORE', 'KILL', 'SHUTDOWN', 'WAITFOR', 'OPENROWSET',
258
+ 'OPENDATASOURCE', 'OPENQUERY', 'OPENXML', 'BULK', 'INTO'
259
+ ];
260
+ // Regex patterns to detect common SQL injection techniques
261
+ ReadDataTool.DANGEROUS_PATTERNS = [
262
+ // SELECT INTO operations that create new tables
263
+ /SELECT\s+.*?\s+INTO\s+/i,
264
+ // Semicolon followed by dangerous keywords
265
+ /;\s*(DELETE|DROP|UPDATE|INSERT|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE|MERGE|REPLACE|GRANT|REVOKE)/i,
266
+ // UNION injection attempts with dangerous keywords
267
+ /UNION\s+(?:ALL\s+)?SELECT.*?(DELETE|DROP|UPDATE|INSERT|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE)/i,
268
+ // Comment-based injection attempts
269
+ /--.*?(DELETE|DROP|UPDATE|INSERT|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE)/i,
270
+ /\/\*.*?(DELETE|DROP|UPDATE|INSERT|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE).*?\*\//i,
271
+ // Stored procedure execution patterns
272
+ /EXEC\s*\(/i,
273
+ /EXECUTE\s*\(/i,
274
+ /sp_/i,
275
+ /xp_/i,
276
+ // Dynamic SQL construction
277
+ /EXEC\s*\(/i,
278
+ /EXECUTE\s*\(/i,
279
+ // Bulk operations
280
+ /BULK\s+INSERT/i,
281
+ /OPENROWSET/i,
282
+ /OPENDATASOURCE/i,
283
+ // System functions that could be dangerous
284
+ /@@/,
285
+ /SYSTEM_USER/i,
286
+ /USER_NAME/i,
287
+ /DB_NAME/i,
288
+ /HOST_NAME/i,
289
+ // Time delay attacks
290
+ /WAITFOR\s+DELAY/i,
291
+ /WAITFOR\s+TIME/i,
292
+ // Multiple statements (semicolon not at end)
293
+ /;\s*\w/,
294
+ // String concatenation that might hide malicious code
295
+ /\+\s*CHAR\s*\(/i,
296
+ /\+\s*NCHAR\s*\(/i,
297
+ /\+\s*ASCII\s*\(/i,
298
+ ];
299
+ //# 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;CAuDnE"}
@@ -0,0 +1,156 @@
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, pool) {
33
+ const request = new sql.Request(pool);
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, pool) {
65
+ const request = new sql.Request(pool);
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 pool = params.pool;
121
+ const tableExists = await this.ensureTableExists(schemaName, tableName, pool);
122
+ if (!tableExists) {
123
+ return {
124
+ success: false,
125
+ message: `Table [${schemaName}].[${tableName}] was not found.`,
126
+ };
127
+ }
128
+ const [outbound, inbound] = await Promise.all([
129
+ includeOutbound ? this.fetchRelationships(schemaName, tableName, "outbound", pool) : Promise.resolve([]),
130
+ includeInbound ? this.fetchRelationships(schemaName, tableName, "inbound", pool) : Promise.resolve([]),
131
+ ]);
132
+ if ((!outbound || outbound.length === 0) && (!inbound || inbound.length === 0)) {
133
+ return {
134
+ success: true,
135
+ tableName,
136
+ schemaName,
137
+ message: "No foreign key relationships found for the specified table.",
138
+ };
139
+ }
140
+ return {
141
+ success: true,
142
+ tableName,
143
+ schemaName,
144
+ outbound: outbound.length ? outbound : undefined,
145
+ inbound: inbound.length ? inbound : undefined,
146
+ };
147
+ }
148
+ catch (error) {
149
+ return {
150
+ success: false,
151
+ message: `Failed to inspect relationships: ${error}`,
152
+ };
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=RelationshipInspectorTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationshipInspectorTool.js","sourceRoot":"","sources":["../../src/tools/RelationshipInspectorTool.ts"],"names":[],"mappings":"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"}