@eamonboyle/mssql-mcp 1.1.0 → 1.3.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 (144) hide show
  1. package/README.md +169 -22
  2. package/dist/config.d.ts +13 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +74 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/db.d.ts +29 -24
  7. package/dist/db.d.ts.map +1 -1
  8. package/dist/db.js +144 -112
  9. package/dist/db.js.map +1 -1
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.js +382 -122
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcpResults.d.ts +49 -0
  14. package/dist/mcpResults.d.ts.map +1 -0
  15. package/dist/mcpResults.js +246 -0
  16. package/dist/mcpResults.js.map +1 -0
  17. package/dist/promptRegistry.d.ts +16 -0
  18. package/dist/promptRegistry.d.ts.map +1 -0
  19. package/dist/promptRegistry.js +112 -0
  20. package/dist/promptRegistry.js.map +1 -0
  21. package/dist/resourceRegistry.d.ts +14 -0
  22. package/dist/resourceRegistry.d.ts.map +1 -0
  23. package/dist/resourceRegistry.js +311 -0
  24. package/dist/resourceRegistry.js.map +1 -0
  25. package/dist/schema.d.ts +57 -0
  26. package/dist/schema.d.ts.map +1 -0
  27. package/dist/schema.js +390 -0
  28. package/dist/schema.js.map +1 -0
  29. package/dist/serverState.d.ts +28 -0
  30. package/dist/serverState.d.ts.map +1 -0
  31. package/dist/serverState.js +99 -0
  32. package/dist/serverState.js.map +1 -0
  33. package/dist/sql.d.ts +7 -0
  34. package/dist/sql.d.ts.map +1 -0
  35. package/dist/sql.js +73 -0
  36. package/dist/sql.js.map +1 -0
  37. package/dist/toolRegistry.d.ts +20 -0
  38. package/dist/toolRegistry.d.ts.map +1 -0
  39. package/dist/toolRegistry.js +547 -0
  40. package/dist/toolRegistry.js.map +1 -0
  41. package/dist/tools/AnalyzeTableTool.d.ts +37 -0
  42. package/dist/tools/AnalyzeTableTool.d.ts.map +1 -0
  43. package/dist/tools/AnalyzeTableTool.js +81 -0
  44. package/dist/tools/AnalyzeTableTool.js.map +1 -0
  45. package/dist/tools/CreateIndexTool.d.ts +30 -23
  46. package/dist/tools/CreateIndexTool.d.ts.map +1 -1
  47. package/dist/tools/CreateIndexTool.js +47 -77
  48. package/dist/tools/CreateIndexTool.js.map +1 -1
  49. package/dist/tools/CreateTableTool.d.ts +18 -11
  50. package/dist/tools/CreateTableTool.d.ts.map +1 -1
  51. package/dist/tools/CreateTableTool.js +37 -61
  52. package/dist/tools/CreateTableTool.js.map +1 -1
  53. package/dist/tools/DeleteDataTool.d.ts +22 -0
  54. package/dist/tools/DeleteDataTool.d.ts.map +1 -0
  55. package/dist/tools/DeleteDataTool.js +38 -0
  56. package/dist/tools/DeleteDataTool.js.map +1 -0
  57. package/dist/tools/DescribeObjectTool.d.ts +21 -0
  58. package/dist/tools/DescribeObjectTool.d.ts.map +1 -0
  59. package/dist/tools/DescribeObjectTool.js +31 -0
  60. package/dist/tools/DescribeObjectTool.js.map +1 -0
  61. package/dist/tools/DescribeRelationshipsTool.d.ts +20 -0
  62. package/dist/tools/DescribeRelationshipsTool.d.ts.map +1 -0
  63. package/dist/tools/DescribeRelationshipsTool.js +24 -0
  64. package/dist/tools/DescribeRelationshipsTool.js.map +1 -0
  65. package/dist/tools/DescribeTableTool.d.ts +19 -20
  66. package/dist/tools/DescribeTableTool.d.ts.map +1 -1
  67. package/dist/tools/DescribeTableTool.js +23 -44
  68. package/dist/tools/DescribeTableTool.js.map +1 -1
  69. package/dist/tools/DropTableTool.d.ts +13 -11
  70. package/dist/tools/DropTableTool.d.ts.map +1 -1
  71. package/dist/tools/DropTableTool.js +30 -44
  72. package/dist/tools/DropTableTool.js.map +1 -1
  73. package/dist/tools/ExplainQueryTool.d.ts +32 -0
  74. package/dist/tools/ExplainQueryTool.d.ts.map +1 -0
  75. package/dist/tools/ExplainQueryTool.js +102 -0
  76. package/dist/tools/ExplainQueryTool.js.map +1 -0
  77. package/dist/tools/InsertDataTool.d.ts +20 -16
  78. package/dist/tools/InsertDataTool.d.ts.map +1 -1
  79. package/dist/tools/InsertDataTool.js +91 -108
  80. package/dist/tools/InsertDataTool.js.map +1 -1
  81. package/dist/tools/ListDatabasesTool.d.ts +16 -0
  82. package/dist/tools/ListDatabasesTool.d.ts.map +1 -0
  83. package/dist/tools/ListDatabasesTool.js +26 -0
  84. package/dist/tools/ListDatabasesTool.js.map +1 -0
  85. package/dist/tools/ListForeignKeysTool.d.ts +19 -0
  86. package/dist/tools/ListForeignKeysTool.d.ts.map +1 -0
  87. package/dist/tools/ListForeignKeysTool.js +24 -0
  88. package/dist/tools/ListForeignKeysTool.js.map +1 -0
  89. package/dist/tools/ListObjectsTool.d.ts +20 -0
  90. package/dist/tools/ListObjectsTool.d.ts.map +1 -0
  91. package/dist/tools/ListObjectsTool.js +26 -0
  92. package/dist/tools/ListObjectsTool.js.map +1 -0
  93. package/dist/tools/ListTableTool.d.ts +20 -16
  94. package/dist/tools/ListTableTool.d.ts.map +1 -1
  95. package/dist/tools/ListTableTool.js +32 -51
  96. package/dist/tools/ListTableTool.js.map +1 -1
  97. package/dist/tools/PreviewDeleteTool.d.ts +28 -0
  98. package/dist/tools/PreviewDeleteTool.d.ts.map +1 -0
  99. package/dist/tools/PreviewDeleteTool.js +31 -0
  100. package/dist/tools/PreviewDeleteTool.js.map +1 -0
  101. package/dist/tools/PreviewUpdateTool.d.ts +30 -0
  102. package/dist/tools/PreviewUpdateTool.d.ts.map +1 -0
  103. package/dist/tools/PreviewUpdateTool.js +34 -0
  104. package/dist/tools/PreviewUpdateTool.js.map +1 -0
  105. package/dist/tools/ReadDataTool.d.ts +35 -33
  106. package/dist/tools/ReadDataTool.d.ts.map +1 -1
  107. package/dist/tools/ReadDataTool.js +92 -105
  108. package/dist/tools/ReadDataTool.js.map +1 -1
  109. package/dist/tools/SearchDataTool.d.ts +27 -0
  110. package/dist/tools/SearchDataTool.d.ts.map +1 -0
  111. package/dist/tools/SearchDataTool.js +61 -0
  112. package/dist/tools/SearchDataTool.js.map +1 -0
  113. package/dist/tools/UpdateDataTool.d.ts +22 -16
  114. package/dist/tools/UpdateDataTool.d.ts.map +1 -1
  115. package/dist/tools/UpdateDataTool.js +48 -65
  116. package/dist/tools/UpdateDataTool.js.map +1 -1
  117. package/dist/validation.d.ts +13 -13
  118. package/dist/validation.js +133 -133
  119. package/dist/validation.js.map +1 -1
  120. package/dist/writePreview.d.ts +20 -0
  121. package/dist/writePreview.d.ts.map +1 -0
  122. package/dist/writePreview.js +27 -0
  123. package/dist/writePreview.js.map +1 -0
  124. package/dist/writePreviewGrant.d.ts +18 -0
  125. package/dist/writePreviewGrant.d.ts.map +1 -0
  126. package/dist/writePreviewGrant.js +71 -0
  127. package/dist/writePreviewGrant.js.map +1 -0
  128. package/dist/writePreviewGrantStore.d.ts +10 -0
  129. package/dist/writePreviewGrantStore.d.ts.map +1 -0
  130. package/dist/writePreviewGrantStore.js +47 -0
  131. package/dist/writePreviewGrantStore.js.map +1 -0
  132. package/dist/writeSafety.d.ts +21 -0
  133. package/dist/writeSafety.d.ts.map +1 -0
  134. package/dist/writeSafety.js +169 -0
  135. package/dist/writeSafety.js.map +1 -0
  136. package/package.json +6 -5
  137. package/dist/__tests__/db.test.d.ts +0 -2
  138. package/dist/__tests__/db.test.d.ts.map +0 -1
  139. package/dist/__tests__/db.test.js +0 -204
  140. package/dist/__tests__/db.test.js.map +0 -1
  141. package/dist/__tests__/validation.test.d.ts +0 -2
  142. package/dist/__tests__/validation.test.d.ts.map +0 -1
  143. package/dist/__tests__/validation.test.js +0 -111
  144. package/dist/__tests__/validation.test.js.map +0 -1
@@ -1,21 +1,20 @@
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
- databaseName?: string;
11
- }): Promise<{
12
- success: boolean;
13
- message: string;
14
- columns?: undefined;
15
- } | {
16
- success: boolean;
17
- columns: sql.IRecordSet<any>;
18
- message?: undefined;
19
- }>;
20
- }
1
+ interface DescribeTableParams {
2
+ tableName: string;
3
+ schemaName?: string;
4
+ databaseName?: string;
5
+ }
6
+ export declare class DescribeTableTool {
7
+ name: string;
8
+ description: string;
9
+ run(params: DescribeTableParams): Promise<{
10
+ success: boolean;
11
+ columns: import("mssql").IRecordSet<any>;
12
+ message?: undefined;
13
+ } | {
14
+ success: boolean;
15
+ message: string;
16
+ columns?: undefined;
17
+ }>;
18
+ }
19
+ export {};
21
20
  //# sourceMappingURL=DescribeTableTool.d.ts.map
@@ -1 +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,SACuE;IAClF,WAAW,MAcF;IAEH,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;CAsB/D"}
1
+ {"version":3,"file":"DescribeTableTool.d.ts","sourceRoot":"","sources":["../../src/tools/DescribeTableTool.ts"],"names":[],"mappings":"AAEA,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAC5B,IAAI,SAAoB;IACxB,WAAW,SACuE;IAE5E,GAAG,CAAC,MAAM,EAAE,mBAAmB;;;;;;;;;CAgBtC"}
@@ -1,45 +1,24 @@
1
- import sql from "mssql";
2
- import { getSqlRequest } from "../db.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
- this.inputSchema = {
8
- type: "object",
9
- properties: {
10
- tableName: {
11
- type: "string",
12
- description: "Name of the table to describe",
13
- },
14
- databaseName: {
15
- type: "string",
16
- description: "Name of the database to use (optional). Omit to use the default configured database.",
17
- },
18
- },
19
- required: ["tableName"],
20
- };
21
- }
22
- async run(params) {
23
- try {
24
- const { tableName, databaseName } = params;
25
- const { request, error } = await getSqlRequest(databaseName);
26
- if (error) {
27
- return { success: false, message: error };
28
- }
29
- const query = `SELECT COLUMN_NAME as name, DATA_TYPE as type FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName`;
30
- request.input("tableName", sql.NVarChar, tableName);
31
- const result = await request.query(query);
32
- return {
33
- success: true,
34
- columns: result.recordset,
35
- };
36
- }
37
- catch (error) {
38
- return {
39
- success: false,
40
- message: `Failed to describe table: ${error}`,
41
- };
42
- }
43
- }
44
- }
1
+ import { describeTableSchema } from "../schema.js";
2
+ export class DescribeTableTool {
3
+ constructor() {
4
+ this.name = "describe_table";
5
+ this.description = "Describes the schema (columns and types) of a specified MSSQL Database table.";
6
+ }
7
+ async run(params) {
8
+ try {
9
+ const { tableName, schemaName, databaseName } = params;
10
+ const columns = await describeTableSchema(tableName, databaseName, schemaName);
11
+ return {
12
+ success: true,
13
+ columns,
14
+ };
15
+ }
16
+ catch (error) {
17
+ return {
18
+ success: false,
19
+ message: `Failed to describe table: ${error}`,
20
+ };
21
+ }
22
+ }
23
+ }
45
24
  //# sourceMappingURL=DescribeTableTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DescribeTableTool.js","sourceRoot":"","sources":["../../src/tools/DescribeTableTool.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,OAAO,iBAAiB;IAA9B;QAEE,SAAI,GAAG,gBAAgB,CAAC;QACxB,gBAAW,GACT,+EAA+E,CAAC;QAClF,gBAAW,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,sFAAsF;iBACzF;aACF;YACD,QAAQ,EAAE,CAAC,WAAW,CAAC;SACjB,CAAC;IAwBX,CAAC;IAtBC,KAAK,CAAC,GAAG,CAAC,MAAoD;QAC5D,IAAI;YACF,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;YAE3C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAI,KAAK,EAAE;gBACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;aAC3C;YACD,MAAM,KAAK,GAAG,6GAA6G,CAAC;YAC5H,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,MAAM,CAAC,SAAS;aAC1B,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,6BAA6B,KAAK,EAAE;aAC9C,CAAC;SACH;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"DescribeTableTool.js","sourceRoot":"","sources":["../../src/tools/DescribeTableTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAQnD,MAAM,OAAO,iBAAiB;IAA9B;QACE,SAAI,GAAG,gBAAgB,CAAC;QACxB,gBAAW,GACT,+EAA+E,CAAC;IAkBpF,CAAC;IAhBC,KAAK,CAAC,GAAG,CAAC,MAA2B;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YAE/E,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO;aACR,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,6BAA6B,KAAK,EAAE;aAC9C,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -1,12 +1,14 @@
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
- }
1
+ interface DropTableParams {
2
+ tableName: string;
3
+ databaseName?: string;
4
+ }
5
+ export declare class DropTableTool {
6
+ name: string;
7
+ description: string;
8
+ run(params: DropTableParams): Promise<{
9
+ success: boolean;
10
+ message: string;
11
+ }>;
12
+ }
13
+ export {};
12
14
  //# sourceMappingURL=DropTableTool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropTableTool.d.ts","sourceRoot":"","sources":["../../src/tools/DropTableTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG1D,qBAAa,aAAc,YAAW,IAAI;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,SAAgB;IACpB,WAAW,SAA4C;IACvD,WAAW,MAWF;IAEH,GAAG,CAAC,MAAM,EAAE,GAAG;;;;CA2BtB"}
1
+ {"version":3,"file":"DropTableTool.d.ts","sourceRoot":"","sources":["../../src/tools/DropTableTool.ts"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,IAAI,SAAgB;IACpB,WAAW,SAA4C;IAEjD,GAAG,CAAC,MAAM,EAAE,eAAe;;;;CAuBlC"}
@@ -1,45 +1,31 @@
1
- import { getSqlRequest } from "../db.js";
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
- databaseName: {
11
- type: "string",
12
- description: "Name of the database to use (optional). Omit to use the default configured database.",
13
- },
14
- },
15
- required: ["tableName"],
16
- };
17
- }
18
- async run(params) {
19
- try {
20
- const { tableName, databaseName } = params;
21
- const { request, error } = await getSqlRequest(databaseName);
22
- if (error) {
23
- return { success: false, message: error };
24
- }
25
- // Basic validation to prevent SQL injection
26
- if (!/^[\w\d_]+$/.test(tableName)) {
27
- throw new Error("Invalid table name.");
28
- }
29
- const query = `DROP TABLE [${tableName}]`;
30
- await request.query(query);
31
- return {
32
- success: true,
33
- message: `Table '${tableName}' dropped successfully.`,
34
- };
35
- }
36
- catch (error) {
37
- console.error("Error dropping table:", error);
38
- return {
39
- success: false,
40
- message: `Failed to drop table: ${error}`,
41
- };
42
- }
43
- }
44
- }
1
+ import { getSqlRequest } from "../db.js";
2
+ import { buildQualifiedName } from "../sql.js";
3
+ export class DropTableTool {
4
+ constructor() {
5
+ this.name = "drop_table";
6
+ this.description = "Drops a table from the MSSQL Database.";
7
+ }
8
+ async run(params) {
9
+ try {
10
+ const { tableName, databaseName } = params;
11
+ const { request, error } = await getSqlRequest(databaseName);
12
+ if (error) {
13
+ return { success: false, message: error };
14
+ }
15
+ const query = `DROP TABLE ${buildQualifiedName(tableName)}`;
16
+ await request.query(query);
17
+ return {
18
+ success: true,
19
+ message: `Table '${tableName}' dropped successfully.`,
20
+ };
21
+ }
22
+ catch (error) {
23
+ console.error("Error dropping table:", error);
24
+ return {
25
+ success: false,
26
+ message: `Failed to drop table: ${error}`,
27
+ };
28
+ }
29
+ }
30
+ }
45
31
  //# sourceMappingURL=DropTableTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropTableTool.js","sourceRoot":"","sources":["../../src/tools/DropTableTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,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;gBACvE,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,sFAAsF;iBACzF;aACF;YACD,QAAQ,EAAE,CAAC,WAAW,CAAC;SACjB,CAAC;IA6BX,CAAC;IA3BC,KAAK,CAAC,GAAG,CAAC,MAAW;QACnB,IAAI;YACF,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;YAE3C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAI,KAAK,EAAE;gBACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;aAC3C;YAED,4CAA4C;YAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBACjC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;aACxC;YACD,MAAM,KAAK,GAAG,eAAe,SAAS,GAAG,CAAC;YAC1C,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,UAAU,SAAS,yBAAyB;aACtD,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,yBAAyB,KAAK,EAAE;aAC1C,CAAC;SACH;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"DropTableTool.js","sourceRoot":"","sources":["../../src/tools/DropTableTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAO/C,MAAM,OAAO,aAAa;IAA1B;QACE,SAAI,GAAG,YAAY,CAAC;QACpB,gBAAW,GAAG,wCAAwC,CAAC;IAyBzD,CAAC;IAvBC,KAAK,CAAC,GAAG,CAAC,MAAuB;QAC/B,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;YAE3C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YAC7D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC5C,CAAC;YAED,MAAM,KAAK,GAAG,cAAc,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,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,32 @@
1
+ import sql from "mssql";
2
+ interface ExplainQueryParams {
3
+ query: string;
4
+ databaseName?: string;
5
+ }
6
+ export declare class ExplainQueryTool {
7
+ name: string;
8
+ description: string;
9
+ run(params: ExplainQueryParams): Promise<{
10
+ success: boolean;
11
+ message: string;
12
+ error: string;
13
+ planXml?: undefined;
14
+ recordsets?: undefined;
15
+ } | {
16
+ success: boolean;
17
+ message: string;
18
+ error?: undefined;
19
+ planXml?: undefined;
20
+ recordsets?: undefined;
21
+ } | {
22
+ success: boolean;
23
+ message: string;
24
+ planXml: string | null;
25
+ recordsets: {
26
+ [x: string]: sql.IRecordSet<any>;
27
+ } | sql.IRecordSet<any>[] | undefined;
28
+ error?: undefined;
29
+ }>;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=ExplainQueryTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplainQueryTool.d.ts","sourceRoot":"","sources":["../../src/tools/ExplainQueryTool.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAIxB,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyCD,qBAAa,gBAAgB;IAC3B,IAAI,SAAmB;IACvB,WAAW,SAC6F;IAElG,GAAG,CAAC,MAAM,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;CA+DrC"}
@@ -0,0 +1,102 @@
1
+ import { getDedicatedSqlPool } from "../db.js";
2
+ import { validateReadQuery } from "../validation.js";
3
+ function cellLooksLikeShowPlanXml(value) {
4
+ if (typeof value === "string" && value.trimStart().startsWith("<")) {
5
+ return value;
6
+ }
7
+ if (Buffer.isBuffer(value)) {
8
+ const s = value.toString("utf16le").trimStart();
9
+ if (s.startsWith("<")) {
10
+ return s;
11
+ }
12
+ }
13
+ return null;
14
+ }
15
+ function extractPlanXml(recordsets) {
16
+ if (!Array.isArray(recordsets)) {
17
+ return null;
18
+ }
19
+ for (const recordset of recordsets) {
20
+ if (!Array.isArray(recordset)) {
21
+ continue;
22
+ }
23
+ const firstRow = recordset[0];
24
+ if (!firstRow || typeof firstRow !== "object") {
25
+ continue;
26
+ }
27
+ for (const value of Object.values(firstRow)) {
28
+ const xml = cellLooksLikeShowPlanXml(value);
29
+ if (xml) {
30
+ return xml;
31
+ }
32
+ }
33
+ }
34
+ return null;
35
+ }
36
+ export class ExplainQueryTool {
37
+ constructor() {
38
+ this.name = "explain_query";
39
+ this.description = "Returns an estimated SQL Server execution plan for a validated SELECT query without modifying data.";
40
+ }
41
+ async run(params) {
42
+ let pool;
43
+ let showplanEnabled = false;
44
+ try {
45
+ const { query, databaseName } = params;
46
+ const validation = validateReadQuery(query);
47
+ if (!validation.isValid) {
48
+ return {
49
+ success: false,
50
+ message: `Security validation failed: ${validation.error}`,
51
+ error: "SECURITY_VALIDATION_FAILED",
52
+ };
53
+ }
54
+ const { pool: dedicatedPool, error } = await getDedicatedSqlPool(databaseName);
55
+ if (error) {
56
+ return { success: false, message: error };
57
+ }
58
+ pool = dedicatedPool;
59
+ // Same pattern as SSMS: separate batches on one session, no explicit transaction.
60
+ // BEGIN TRANSACTION can prevent SHOWPLAN_XML from affecting the following SELECT.
61
+ // Use batch() so batches go through execSqlBatch (closer to SSMS client batch boundaries).
62
+ await pool.request().batch("SET SHOWPLAN_XML ON");
63
+ showplanEnabled = true;
64
+ const planResult = await pool.request().batch(query);
65
+ const planXml = extractPlanXml(planResult.recordsets);
66
+ return {
67
+ success: true,
68
+ message: planXml
69
+ ? "Estimated execution plan generated successfully."
70
+ : "Execution plan request completed, but no XML plan was returned.",
71
+ planXml,
72
+ recordsets: planXml ? undefined : planResult.recordsets,
73
+ };
74
+ }
75
+ catch (error) {
76
+ console.error("Error explaining query:", error);
77
+ return {
78
+ success: false,
79
+ message: `Failed to explain query: ${error}`,
80
+ };
81
+ }
82
+ finally {
83
+ if (pool && showplanEnabled) {
84
+ try {
85
+ await pool.request().batch("SET SHOWPLAN_XML OFF");
86
+ }
87
+ catch (cleanupError) {
88
+ console.error("Failed to disable SHOWPLAN_XML:", cleanupError);
89
+ }
90
+ }
91
+ if (pool) {
92
+ try {
93
+ await pool.close();
94
+ }
95
+ catch {
96
+ // Ignore pool close errors during cleanup.
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+ //# 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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"}
@@ -1,17 +1,21 @@
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
- }
1
+ type InsertRow = Record<string, unknown>;
2
+ interface InsertDataParams {
3
+ tableName: string;
4
+ data: InsertRow | InsertRow[];
5
+ databaseName?: string;
6
+ }
7
+ export declare class InsertDataTool {
8
+ name: string;
9
+ description: string;
10
+ run(params: InsertDataParams): Promise<{
11
+ success: boolean;
12
+ message: string;
13
+ recordsInserted?: undefined;
14
+ } | {
15
+ success: boolean;
16
+ message: string;
17
+ recordsInserted: number;
18
+ }>;
19
+ }
20
+ export {};
17
21
  //# sourceMappingURL=InsertDataTool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InsertDataTool.d.ts","sourceRoot":"","sources":["../../src/tools/InsertDataTool.ts"],"names":[],"mappings":"AAAA,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,SA0CyD;IACpE,WAAW,MA6BF;IACH,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;CA4EtB"}
1
+ {"version":3,"file":"InsertDataTool.d.ts","sourceRoot":"","sources":["../../src/tools/InsertDataTool.ts"],"names":[],"mappings":"AAGA,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzC,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,IAAI,SAAiB;IACrB,WAAW,SA0CyD;IAE9D,GAAG,CAAC,MAAM,EAAE,gBAAgB;;;;;;;;;CAqFnC"}