@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,56 @@
1
+ import sql from "mssql";
2
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
3
+ export declare class DeleteDataTool implements Tool {
4
+ [key: string]: any;
5
+ name: string;
6
+ description: string;
7
+ inputSchema: any;
8
+ private static readonly MAX_ROWS_DEFAULT;
9
+ run(params: any): Promise<{
10
+ success: boolean;
11
+ message: string;
12
+ error: string;
13
+ affectedRows?: undefined;
14
+ maxAllowed?: undefined;
15
+ needsConfirmation?: undefined;
16
+ preview?: undefined;
17
+ rowsDeleted?: undefined;
18
+ } | {
19
+ success: boolean;
20
+ message: string;
21
+ error: string;
22
+ affectedRows: number;
23
+ maxAllowed?: undefined;
24
+ needsConfirmation?: undefined;
25
+ preview?: undefined;
26
+ rowsDeleted?: undefined;
27
+ } | {
28
+ success: boolean;
29
+ message: string;
30
+ error: string;
31
+ affectedRows: any;
32
+ maxAllowed: any;
33
+ needsConfirmation?: undefined;
34
+ preview?: undefined;
35
+ rowsDeleted?: undefined;
36
+ } | {
37
+ success: boolean;
38
+ needsConfirmation: boolean;
39
+ message: string;
40
+ affectedRows: any;
41
+ preview: sql.IRecordSet<any>;
42
+ error: string;
43
+ maxAllowed?: undefined;
44
+ rowsDeleted?: undefined;
45
+ } | {
46
+ success: boolean;
47
+ message: string;
48
+ rowsDeleted: number;
49
+ error?: undefined;
50
+ affectedRows?: undefined;
51
+ maxAllowed?: undefined;
52
+ needsConfirmation?: undefined;
53
+ preview?: undefined;
54
+ }>;
55
+ }
56
+ //# sourceMappingURL=DeleteDataTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteDataTool.d.ts","sourceRoot":"","sources":["../../src/tools/DeleteDataTool.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,qBAAa,cAAe,YAAW,IAAI;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAAiB;IACrB,WAAW,SAAuG;IAElH,WAAW,EAyBN,GAAG,CAAC;IAET,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IAE1C,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4EtB"}
@@ -0,0 +1,103 @@
1
+ import sql from "mssql";
2
+ export class DeleteDataTool {
3
+ constructor() {
4
+ this.name = "delete_data";
5
+ this.description = "Deletes rows from an MSSQL table with preview and confirmation. Requires WHERE clause for safety.";
6
+ this.inputSchema = {
7
+ type: "object",
8
+ properties: {
9
+ tableName: {
10
+ type: "string",
11
+ description: "Name of the table to delete from"
12
+ },
13
+ whereClause: {
14
+ type: "string",
15
+ description: "WHERE clause to identify which rows to delete. Example: \"status = 'archived' AND created_date < '2023-01-01'\""
16
+ },
17
+ confirmDelete: {
18
+ type: "boolean",
19
+ description: "Set to true to confirm and execute the delete after preview. First call without this to see preview.",
20
+ },
21
+ maxRows: {
22
+ type: "number",
23
+ description: "Maximum number of rows allowed to delete. Defaults to 1000 for safety.",
24
+ },
25
+ environment: {
26
+ type: "string",
27
+ description: "Optional environment name to target",
28
+ },
29
+ },
30
+ required: ["tableName", "whereClause"],
31
+ };
32
+ }
33
+ async run(params) {
34
+ let query;
35
+ try {
36
+ const { tableName, whereClause, confirmDelete, maxRows, environment } = params;
37
+ // Basic validation: ensure whereClause is not empty
38
+ if (!whereClause || whereClause.trim() === '') {
39
+ return {
40
+ success: false,
41
+ message: "WHERE clause is required for safety. Deleting all rows requires explicit WHERE clause like 'WHERE 1=1'.",
42
+ error: "MISSING_WHERE_CLAUSE",
43
+ };
44
+ }
45
+ const maxAllowed = maxRows || DeleteDataTool.MAX_ROWS_DEFAULT;
46
+ // Step 1: Get count of affected rows
47
+ const countQuery = `SELECT COUNT(*) as affectedRows FROM ${tableName} WHERE ${whereClause}`;
48
+ const countRequest = new sql.Request(params.pool);
49
+ const countResult = await countRequest.query(countQuery);
50
+ const affectedRows = countResult.recordset[0].affectedRows;
51
+ if (affectedRows === 0) {
52
+ return {
53
+ success: false,
54
+ message: "No rows match the WHERE clause. No deletion will be performed.",
55
+ error: "NO_ROWS_MATCHED",
56
+ affectedRows: 0,
57
+ };
58
+ }
59
+ if (affectedRows > maxAllowed) {
60
+ return {
61
+ success: false,
62
+ message: `Delete would affect ${affectedRows} rows, which exceeds the maximum of ${maxAllowed}. Refine your WHERE clause or increase maxRows parameter.`,
63
+ error: "TOO_MANY_ROWS",
64
+ affectedRows,
65
+ maxAllowed,
66
+ };
67
+ }
68
+ // Step 2: Show preview if not confirmed
69
+ if (!confirmDelete) {
70
+ const previewQuery = `SELECT TOP 10 * FROM ${tableName} WHERE ${whereClause}`;
71
+ const previewRequest = new sql.Request(params.pool);
72
+ const previewResult = await previewRequest.query(previewQuery);
73
+ return {
74
+ success: false,
75
+ needsConfirmation: true,
76
+ message: `⚠️ WARNING: ${affectedRows} row(s) will be permanently deleted. Review the preview below and re-run with confirmDelete: true to proceed.`,
77
+ affectedRows,
78
+ preview: previewResult.recordset,
79
+ error: "CONFIRMATION_REQUIRED",
80
+ };
81
+ }
82
+ // Step 3: Execute the delete
83
+ query = `DELETE FROM ${tableName} WHERE ${whereClause}`;
84
+ const request = new sql.Request(params.pool);
85
+ const result = await request.query(query);
86
+ return {
87
+ success: true,
88
+ message: `Successfully deleted ${result.rowsAffected[0]} row(s) from table '${tableName}'`,
89
+ rowsDeleted: result.rowsAffected[0],
90
+ };
91
+ }
92
+ catch (error) {
93
+ console.error("Error deleting data:", error);
94
+ return {
95
+ success: false,
96
+ message: `Failed to delete data${query ? ` with '${query}'` : ''}: ${error}`,
97
+ error: "DELETE_FAILED",
98
+ };
99
+ }
100
+ }
101
+ }
102
+ DeleteDataTool.MAX_ROWS_DEFAULT = 1000;
103
+ //# sourceMappingURL=DeleteDataTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteDataTool.js","sourceRoot":"","sources":["../../src/tools/DeleteDataTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import sql from "mssql";
2
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
3
+ export declare class DescribeTableTool implements Tool {
4
+ [key: string]: any;
5
+ name: string;
6
+ description: string;
7
+ inputSchema: any;
8
+ run(params: {
9
+ tableName: string;
10
+ database?: string;
11
+ environment?: string;
12
+ }): Promise<{
13
+ success: boolean;
14
+ message: string;
15
+ error: string;
16
+ database?: undefined;
17
+ schema?: undefined;
18
+ tableName?: undefined;
19
+ columnCount?: undefined;
20
+ columns?: undefined;
21
+ } | {
22
+ success: boolean;
23
+ message: string;
24
+ database: string | undefined;
25
+ schema: string;
26
+ tableName: string;
27
+ columnCount: number;
28
+ columns: sql.IRecordSet<any>;
29
+ error?: undefined;
30
+ }>;
31
+ }
32
+ //# sourceMappingURL=DescribeTableTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DescribeTableTool.d.ts","sourceRoot":"","sources":["../../src/tools/DescribeTableTool.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG1D,qBAAa,iBAAkB,YAAW,IAAI;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAAoB;IACxB,WAAW,SAEqE;IAChF,WAAW,EAaN,GAAG,CAAC;IAEH,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;CAkGjF"}
@@ -0,0 +1,116 @@
1
+ import sql from "mssql";
2
+ import { getEnvironmentManager } from "../config/EnvironmentManager.js";
3
+ export class DescribeTableTool {
4
+ constructor() {
5
+ this.name = "describe_table";
6
+ this.description = "Describes the schema (columns and types) of a specified MSSQL Database table. " +
7
+ "For server-level access environments, you can specify a database to target.";
8
+ this.inputSchema = {
9
+ type: "object",
10
+ properties: {
11
+ tableName: {
12
+ type: "string",
13
+ description: "Name of the table to describe (can include schema: 'dbo.TableName')",
14
+ },
15
+ database: {
16
+ type: "string",
17
+ description: "Optional: Target database name for server-level access environments.",
18
+ },
19
+ },
20
+ required: ["tableName"],
21
+ };
22
+ }
23
+ async run(params) {
24
+ try {
25
+ const { tableName, database, environment } = params;
26
+ // Validate tableName
27
+ if (!tableName || typeof tableName !== "string") {
28
+ return {
29
+ success: false,
30
+ message: "Missing or invalid 'tableName' argument.",
31
+ error: "INVALID_ARGUMENT",
32
+ };
33
+ }
34
+ // Validate database access if specified
35
+ if (database) {
36
+ const envManager = getEnvironmentManager();
37
+ const dbCheck = envManager.isDatabaseAllowed(environment, database);
38
+ if (!dbCheck.allowed) {
39
+ return {
40
+ success: false,
41
+ message: dbCheck.reason || `Access to database '${database}' is not allowed.`,
42
+ error: "DATABASE_ACCESS_DENIED",
43
+ };
44
+ }
45
+ }
46
+ // Parse schema and table name
47
+ let schemaName = "dbo";
48
+ let actualTableName = tableName;
49
+ if (tableName.includes(".")) {
50
+ const parts = tableName.split(".");
51
+ schemaName = parts[0];
52
+ actualTableName = parts[1];
53
+ }
54
+ const request = new sql.Request(params.pool);
55
+ // Build query with optional database context
56
+ let query;
57
+ if (database) {
58
+ const safeDbName = database.replace(/]/g, "]]");
59
+ query = `
60
+ USE [${safeDbName}];
61
+ SELECT
62
+ COLUMN_NAME as name,
63
+ DATA_TYPE as type,
64
+ CHARACTER_MAXIMUM_LENGTH as max_length,
65
+ IS_NULLABLE as nullable,
66
+ COLUMN_DEFAULT as default_value,
67
+ ORDINAL_POSITION as position
68
+ FROM INFORMATION_SCHEMA.COLUMNS
69
+ WHERE TABLE_NAME = @tableName AND TABLE_SCHEMA = @schemaName
70
+ ORDER BY ORDINAL_POSITION
71
+ `;
72
+ }
73
+ else {
74
+ query = `
75
+ SELECT
76
+ COLUMN_NAME as name,
77
+ DATA_TYPE as type,
78
+ CHARACTER_MAXIMUM_LENGTH as max_length,
79
+ IS_NULLABLE as nullable,
80
+ COLUMN_DEFAULT as default_value,
81
+ ORDINAL_POSITION as position
82
+ FROM INFORMATION_SCHEMA.COLUMNS
83
+ WHERE TABLE_NAME = @tableName AND TABLE_SCHEMA = @schemaName
84
+ ORDER BY ORDINAL_POSITION
85
+ `;
86
+ }
87
+ request.input("tableName", sql.NVarChar, actualTableName);
88
+ request.input("schemaName", sql.NVarChar, schemaName);
89
+ const result = await request.query(query);
90
+ if (result.recordset.length === 0) {
91
+ return {
92
+ success: false,
93
+ message: `Table '${schemaName}.${actualTableName}' not found${database ? ` in database [${database}]` : ""}.`,
94
+ error: "TABLE_NOT_FOUND",
95
+ };
96
+ }
97
+ return {
98
+ success: true,
99
+ message: `Described table '${schemaName}.${actualTableName}'${database ? ` in [${database}]` : ""}`,
100
+ database: database || undefined,
101
+ schema: schemaName,
102
+ tableName: actualTableName,
103
+ columnCount: result.recordset.length,
104
+ columns: result.recordset,
105
+ };
106
+ }
107
+ catch (error) {
108
+ return {
109
+ success: false,
110
+ message: `Failed to describe table: ${error}`,
111
+ error: "QUERY_FAILED",
112
+ };
113
+ }
114
+ }
115
+ }
116
+ //# sourceMappingURL=DescribeTableTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DescribeTableTool.js","sourceRoot":"","sources":["../../src/tools/DescribeTableTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare class DropTableTool implements Tool {
3
+ [key: string]: any;
4
+ name: string;
5
+ description: string;
6
+ inputSchema: any;
7
+ run(params: any): Promise<{
8
+ success: boolean;
9
+ message: string;
10
+ }>;
11
+ }
12
+ //# sourceMappingURL=DropTableTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropTableTool.d.ts","sourceRoot":"","sources":["../../src/tools/DropTableTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,qBAAa,aAAc,YAAW,IAAI;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAAgB;IACpB,WAAW,SAA4C;IACvD,WAAW,EAMN,GAAG,CAAC;IAEH,GAAG,CAAC,MAAM,EAAE,GAAG;;;;CAqBtB"}
@@ -0,0 +1,37 @@
1
+ import sql from "mssql";
2
+ export class DropTableTool {
3
+ constructor() {
4
+ this.name = "drop_table";
5
+ this.description = "Drops a table from the MSSQL Database.";
6
+ this.inputSchema = {
7
+ type: "object",
8
+ properties: {
9
+ tableName: { type: "string", description: "Name of the table to drop" }
10
+ },
11
+ required: ["tableName"],
12
+ };
13
+ }
14
+ async run(params) {
15
+ try {
16
+ const { tableName } = params;
17
+ // Basic validation to prevent SQL injection
18
+ if (!/^[\w\d_]+$/.test(tableName)) {
19
+ throw new Error("Invalid table name.");
20
+ }
21
+ const query = `DROP TABLE [${tableName}]`;
22
+ await new sql.Request(params.pool).query(query);
23
+ return {
24
+ success: true,
25
+ message: `Table '${tableName}' dropped successfully.`
26
+ };
27
+ }
28
+ catch (error) {
29
+ console.error("Error dropping table:", error);
30
+ return {
31
+ success: false,
32
+ message: `Failed to drop table: ${error}`
33
+ };
34
+ }
35
+ }
36
+ }
37
+ //# sourceMappingURL=DropTableTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropTableTool.js","sourceRoot":"","sources":["../../src/tools/DropTableTool.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAGxB,MAAM,OAAO,aAAa;IAA1B;QAEE,SAAI,GAAG,YAAY,CAAC;QACpB,gBAAW,GAAG,wCAAwC,CAAC;QACvD,gBAAW,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;aACxE;YACD,QAAQ,EAAE,CAAC,WAAW,CAAC;SACjB,CAAC;IAuBX,CAAC;IArBC,KAAK,CAAC,GAAG,CAAC,MAAW;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;YAC7B,4CAA4C;YAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,KAAK,GAAG,eAAe,SAAS,GAAG,CAAC;YAC1C,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,UAAU,SAAS,yBAAyB;aACtD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,yBAAyB,KAAK,EAAE;aAC1C,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare class ExplainQueryTool implements Tool {
3
+ [key: string]: any;
4
+ name: string;
5
+ description: string;
6
+ inputSchema: any;
7
+ run(params: any): Promise<{
8
+ success: boolean;
9
+ message: string;
10
+ hasPlanXml: boolean;
11
+ } | {
12
+ success: boolean;
13
+ message: string;
14
+ error: string;
15
+ } | {
16
+ planXml: string;
17
+ success: boolean;
18
+ message: string;
19
+ hasPlanXml: boolean;
20
+ error?: undefined;
21
+ }>;
22
+ private extractPlanXml;
23
+ }
24
+ //# sourceMappingURL=ExplainQueryTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplainQueryTool.d.ts","sourceRoot":"","sources":["../../src/tools/ExplainQueryTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG1D,qBAAa,gBAAiB,YAAW,IAAI;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAAmB;IACvB,WAAW,SAAgG;IAE3G,WAAW,EAiBN,GAAG,CAAC;IAEH,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;IA4DrB,OAAO,CAAC,cAAc;CAuBvB"}
@@ -0,0 +1,98 @@
1
+ import sql from "mssql";
2
+ import { getEnvironmentManager } from "../config/EnvironmentManager.js";
3
+ export class ExplainQueryTool {
4
+ constructor() {
5
+ this.name = "explain_query";
6
+ this.description = "Generates an estimated execution plan (SHOWPLAN_XML) for a SQL query without executing it.";
7
+ this.inputSchema = {
8
+ type: "object",
9
+ properties: {
10
+ query: {
11
+ type: "string",
12
+ description: "SQL statement to analyze (typically SELECT/UPDATE/INSERT/DELETE).",
13
+ },
14
+ environment: {
15
+ type: "string",
16
+ description: "Optional environment name to target (prod, staging, etc).",
17
+ },
18
+ includePlanXml: {
19
+ type: "boolean",
20
+ description: "If true (default), returns the raw SHOWPLAN XML. Set false for summary only.",
21
+ },
22
+ },
23
+ required: ["query"],
24
+ };
25
+ }
26
+ async run(params) {
27
+ const { query, includePlanXml = true, environment } = params ?? {};
28
+ if (typeof query !== "string" || !query.trim()) {
29
+ return {
30
+ success: false,
31
+ message: "explain_query requires a non-empty SQL string.",
32
+ error: "INVALID_QUERY",
33
+ };
34
+ }
35
+ const sanitizedQuery = query.trim();
36
+ const envManager = getEnvironmentManager();
37
+ const pool = await envManager.getConnection(environment);
38
+ let showplanEnabled = false;
39
+ try {
40
+ const planRequest = new sql.Request(pool);
41
+ await planRequest.batch("SET SHOWPLAN_XML ON;");
42
+ showplanEnabled = true;
43
+ const explainRequest = new sql.Request(pool);
44
+ const result = await explainRequest.query(sanitizedQuery);
45
+ const planOutput = result.recordset?.[0];
46
+ const planXml = this.extractPlanXml(planOutput);
47
+ const summary = {
48
+ success: true,
49
+ message: "Generated estimated execution plan.",
50
+ hasPlanXml: Boolean(planXml),
51
+ };
52
+ if (includePlanXml && planXml) {
53
+ return {
54
+ ...summary,
55
+ planXml,
56
+ };
57
+ }
58
+ return summary;
59
+ }
60
+ catch (error) {
61
+ const errorMessage = error instanceof Error ? error.message : String(error);
62
+ return {
63
+ success: false,
64
+ message: `Failed to generate plan: ${errorMessage}`,
65
+ error: "SHOWPLAN_FAILED",
66
+ };
67
+ }
68
+ finally {
69
+ if (showplanEnabled) {
70
+ try {
71
+ const resetRequest = new sql.Request(pool);
72
+ await resetRequest.batch("SET SHOWPLAN_XML OFF;");
73
+ }
74
+ catch {
75
+ // ignore
76
+ }
77
+ }
78
+ }
79
+ }
80
+ extractPlanXml(row) {
81
+ if (!row) {
82
+ return null;
83
+ }
84
+ const knownColumns = [
85
+ "ShowPlanXML",
86
+ "Microsoft SQL Server 2005 XML Showplan",
87
+ "Plan",
88
+ ];
89
+ for (const column of knownColumns) {
90
+ if (row[column]) {
91
+ return row[column];
92
+ }
93
+ }
94
+ const firstXml = Object.values(row).find((value) => typeof value === "string" && value.trim().startsWith("<?xml"));
95
+ return firstXml ?? null;
96
+ }
97
+ }
98
+ //# sourceMappingURL=ExplainQueryTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplainQueryTool.js","sourceRoot":"","sources":["../../src/tools/ExplainQueryTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare class InsertDataTool implements Tool {
3
+ [key: string]: any;
4
+ name: string;
5
+ description: string;
6
+ inputSchema: any;
7
+ run(params: any): Promise<{
8
+ success: boolean;
9
+ message: string;
10
+ recordsInserted?: undefined;
11
+ } | {
12
+ success: boolean;
13
+ message: string;
14
+ recordsInserted: number;
15
+ }>;
16
+ }
17
+ //# sourceMappingURL=InsertDataTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InsertDataTool.d.ts","sourceRoot":"","sources":["../../src/tools/InsertDataTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,qBAAa,cAAe,YAAW,IAAI;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAAiB;IACrB,WAAW,SAA0J;IACrK,WAAW,EAsBN,GAAG,CAAC;IACH,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;CAqEtB"}
@@ -0,0 +1,102 @@
1
+ import sql from "mssql";
2
+ export class InsertDataTool {
3
+ constructor() {
4
+ this.name = "insert_data";
5
+ this.description = "Inserts one or more records into an MSSQL table. Pass data as an object (single) or array of objects (batch). Uses parameterized queries for safety.";
6
+ this.inputSchema = {
7
+ type: "object",
8
+ properties: {
9
+ tableName: {
10
+ type: "string",
11
+ description: "Name of the table to insert data into"
12
+ },
13
+ data: {
14
+ oneOf: [
15
+ {
16
+ type: "object",
17
+ description: "Single record data object with column names as keys and values as the data to insert. Example: {\"name\": \"John\", \"age\": 30}"
18
+ },
19
+ {
20
+ type: "array",
21
+ items: { type: "object" },
22
+ description: "Array of data objects for multiple record insertion. Each object must have identical column structure. Example: [{\"name\": \"John\", \"age\": 30}, {\"name\": \"Jane\", \"age\": 25}]"
23
+ }
24
+ ]
25
+ },
26
+ },
27
+ required: ["tableName", "data"],
28
+ };
29
+ }
30
+ async run(params) {
31
+ try {
32
+ const { tableName, data } = params;
33
+ // Check if data is an array (multiple records) or single object
34
+ const isMultipleRecords = Array.isArray(data);
35
+ const records = isMultipleRecords ? data : [data];
36
+ if (records.length === 0) {
37
+ return {
38
+ success: false,
39
+ message: "No data provided for insertion",
40
+ };
41
+ }
42
+ // Validate that all records have the same columns
43
+ const firstRecordColumns = Object.keys(records[0]).sort();
44
+ for (let i = 1; i < records.length; i++) {
45
+ const currentColumns = Object.keys(records[i]).sort();
46
+ if (JSON.stringify(firstRecordColumns) !== JSON.stringify(currentColumns)) {
47
+ return {
48
+ success: false,
49
+ message: `Column mismatch: Record ${i + 1} has different columns than the first record. Expected columns: [${firstRecordColumns.join(', ')}], but got: [${currentColumns.join(', ')}]`,
50
+ };
51
+ }
52
+ }
53
+ const columns = firstRecordColumns.join(", ");
54
+ const request = new sql.Request(params.pool);
55
+ if (isMultipleRecords) {
56
+ // Multiple records insert using VALUES clause - works for 1 or more records
57
+ const valueClauses = [];
58
+ records.forEach((record, recordIndex) => {
59
+ const valueParams = firstRecordColumns
60
+ .map((column, columnIndex) => `@value${recordIndex}_${columnIndex}`)
61
+ .join(", ");
62
+ valueClauses.push(`(${valueParams})`);
63
+ // Add parameters for this record
64
+ firstRecordColumns.forEach((column, columnIndex) => {
65
+ request.input(`value${recordIndex}_${columnIndex}`, record[column]);
66
+ });
67
+ });
68
+ const query = `INSERT INTO ${tableName} (${columns}) VALUES ${valueClauses.join(", ")}`;
69
+ await request.query(query);
70
+ return {
71
+ success: true,
72
+ message: `Successfully inserted ${records.length} record${records.length > 1 ? 's' : ''} into ${tableName}`,
73
+ recordsInserted: records.length,
74
+ };
75
+ }
76
+ else {
77
+ // Single record insert (when data is passed as single object)
78
+ const values = firstRecordColumns
79
+ .map((column, index) => `@value${index}`)
80
+ .join(", ");
81
+ firstRecordColumns.forEach((column, index) => {
82
+ request.input(`value${index}`, records[0][column]);
83
+ });
84
+ const query = `INSERT INTO ${tableName} (${columns}) VALUES (${values})`;
85
+ await request.query(query);
86
+ return {
87
+ success: true,
88
+ message: `Successfully inserted 1 record into ${tableName}`,
89
+ recordsInserted: 1,
90
+ };
91
+ }
92
+ }
93
+ catch (error) {
94
+ console.error("Error inserting data:", error);
95
+ return {
96
+ success: false,
97
+ message: `Failed to insert data: ${error}`,
98
+ };
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=InsertDataTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InsertDataTool.js","sourceRoot":"","sources":["../../src/tools/InsertDataTool.ts"],"names":[],"mappings":"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"}