@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.
- package/dist/audit/AuditLogger.d.ts +37 -0
- package/dist/audit/AuditLogger.d.ts.map +1 -0
- package/dist/audit/AuditLogger.js +145 -0
- package/dist/audit/AuditLogger.js.map +1 -0
- package/dist/config/EnvironmentManager.d.ts +75 -0
- package/dist/config/EnvironmentManager.d.ts.map +1 -0
- package/dist/config/EnvironmentManager.js +305 -0
- package/dist/config/EnvironmentManager.js.map +1 -0
- package/dist/config/ScriptManager.d.ts +69 -0
- package/dist/config/ScriptManager.d.ts.map +1 -0
- package/dist/config/ScriptManager.js +166 -0
- package/dist/config/ScriptManager.js.map +1 -0
- package/dist/config/SecretResolver.d.ts +66 -0
- package/dist/config/SecretResolver.d.ts.map +1 -0
- package/dist/config/SecretResolver.js +230 -0
- package/dist/config/SecretResolver.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/routing/IntentRouter.d.ts +17 -0
- package/dist/routing/IntentRouter.d.ts.map +1 -0
- package/dist/routing/IntentRouter.js +243 -0
- package/dist/routing/IntentRouter.js.map +1 -0
- package/dist/server/createMcpServer.d.ts +7 -0
- package/dist/server/createMcpServer.d.ts.map +1 -0
- package/dist/server/createMcpServer.js +100 -0
- package/dist/server/createMcpServer.js.map +1 -0
- package/dist/server/toolsets.d.ts +42 -0
- package/dist/server/toolsets.d.ts.map +1 -0
- package/dist/server/toolsets.js +303 -0
- package/dist/server/toolsets.js.map +1 -0
- package/dist/server/wrapToolRun.d.ts +13 -0
- package/dist/server/wrapToolRun.d.ts.map +1 -0
- package/dist/server/wrapToolRun.js +102 -0
- package/dist/server/wrapToolRun.js.map +1 -0
- package/dist/shims.d.ts +2 -0
- package/dist/shims.d.ts.map +1 -0
- package/dist/shims.js +15 -0
- package/dist/shims.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 +32 -0
- package/dist/tools/DescribeTableTool.d.ts.map +1 -0
- package/dist/tools/DescribeTableTool.js +116 -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 +102 -0
- package/dist/tools/InsertDataTool.js.map +1 -0
- package/dist/tools/InspectDependenciesTool.d.ts +46 -0
- package/dist/tools/InspectDependenciesTool.d.ts.map +1 -0
- package/dist/tools/InspectDependenciesTool.js +215 -0
- package/dist/tools/InspectDependenciesTool.js.map +1 -0
- package/dist/tools/ListDatabasesTool.d.ts +27 -0
- package/dist/tools/ListDatabasesTool.d.ts.map +1 -0
- package/dist/tools/ListDatabasesTool.js +107 -0
- package/dist/tools/ListDatabasesTool.js.map +1 -0
- package/dist/tools/ListEnvironmentsTool.d.ts +49 -0
- package/dist/tools/ListEnvironmentsTool.d.ts.map +1 -0
- package/dist/tools/ListEnvironmentsTool.js +73 -0
- package/dist/tools/ListEnvironmentsTool.js.map +1 -0
- package/dist/tools/ListScriptsTool.d.ts +41 -0
- package/dist/tools/ListScriptsTool.d.ts.map +1 -0
- package/dist/tools/ListScriptsTool.js +86 -0
- package/dist/tools/ListScriptsTool.js.map +1 -0
- package/dist/tools/ListTableTool.d.ts +24 -0
- package/dist/tools/ListTableTool.d.ts.map +1 -0
- package/dist/tools/ListTableTool.js +85 -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 +373 -0
- package/dist/tools/ProfileTableTool.js.map +1 -0
- package/dist/tools/ReadDataTool.d.ts +61 -0
- package/dist/tools/ReadDataTool.d.ts.map +1 -0
- package/dist/tools/ReadDataTool.js +299 -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 +156 -0
- package/dist/tools/RelationshipInspectorTool.js.map +1 -0
- package/dist/tools/RunScriptTool.d.ts +214 -0
- package/dist/tools/RunScriptTool.d.ts.map +1 -0
- package/dist/tools/RunScriptTool.js +186 -0
- package/dist/tools/RunScriptTool.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 +237 -0
- package/dist/tools/SearchSchemaTool.js.map +1 -0
- package/dist/tools/TestConnectionTool.d.ts +38 -0
- package/dist/tools/TestConnectionTool.d.ts.map +1 -0
- package/dist/tools/TestConnectionTool.js +156 -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/dist/tools/ValidateEnvironmentConfigTool.d.ts +51 -0
- package/dist/tools/ValidateEnvironmentConfigTool.d.ts.map +1 -0
- package/dist/tools/ValidateEnvironmentConfigTool.js +320 -0
- package/dist/tools/ValidateEnvironmentConfigTool.js.map +1 -0
- package/dist/tools/index.d.ts +21 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +22 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,MAAM,OAAO,gBAAgB;IAA7B;QAEE,SAAI,GAAG,eAAe,CAAC;QACvB,gBAAW,GAAG,4FAA4F,CAAC;QAE3G,gBAAW,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mEAAmE;iBACjF;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;iBACzE;gBACD,cAAc,EAAE;oBACd,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,8EAA8E;iBAC5F;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACb,CAAC;IAqFX,CAAC;IAnFC,KAAK,CAAC,GAAG,CAAC,MAAW;QACnB,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAEnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,gDAAgD;gBACzD,KAAK,EAAE,eAAe;aACvB,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAEzD,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,WAAW,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAChD,eAAe,GAAG,IAAI,CAAC;YAEvB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAE1D,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAEhD,MAAM,OAAO,GAAG;gBACd,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,qCAAqC;gBAC9C,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC;aAC7B,CAAC;YAEF,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;gBAC9B,OAAO;oBACL,GAAG,OAAO;oBACV,OAAO;iBACR,CAAC;YACJ,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,4BAA4B,YAAY,EAAE;gBACnD,KAAK,EAAE,iBAAiB;aACzB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC3C,MAAM,YAAY,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACpD,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,GAAQ;QAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG;YACnB,aAAa;YACb,wCAAwC;YACxC,MAAM;SACP,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACjD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAC9D,CAAC;QAEF,OAAQ,QAA+B,IAAI,IAAI,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -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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"}
|