@eamonboyle/mssql-mcp 1.0.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/LICENSE +21 -0
- package/README.md +195 -0
- package/dist/db.d.ts +25 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +90 -0
- package/dist/db.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/CreateIndexTool.d.ts +24 -0
- package/dist/tools/CreateIndexTool.d.ts.map +1 -0
- package/dist/tools/CreateIndexTool.js +72 -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 +57 -0
- package/dist/tools/CreateTableTool.js.map +1 -0
- package/dist/tools/DescribeTableTool.d.ts +21 -0
- package/dist/tools/DescribeTableTool.d.ts.map +1 -0
- package/dist/tools/DescribeTableTool.js +42 -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 +45 -0
- package/dist/tools/DropTableTool.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 +151 -0
- package/dist/tools/InsertDataTool.js.map +1 -0
- package/dist/tools/ListTableTool.d.ts +17 -0
- package/dist/tools/ListTableTool.d.ts.map +1 -0
- package/dist/tools/ListTableTool.js +50 -0
- package/dist/tools/ListTableTool.js.map +1 -0
- package/dist/tools/ReadDataTool.d.ts +42 -0
- package/dist/tools/ReadDataTool.d.ts.map +1 -0
- package/dist/tools/ReadDataTool.js +229 -0
- package/dist/tools/ReadDataTool.js.map +1 -0
- package/dist/tools/UpdateDataTool.d.ts +17 -0
- package/dist/tools/UpdateDataTool.d.ts.map +1 -0
- package/dist/tools/UpdateDataTool.js +66 -0
- package/dist/tools/UpdateDataTool.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
}
|
|
21
|
+
//# 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,SAAmF;IAC9F,WAAW,MAUF;IAEH,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;CAsB/D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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: { type: "string", description: "Name of the table to describe" },
|
|
11
|
+
databaseName: {
|
|
12
|
+
type: "string",
|
|
13
|
+
description: "Name of the database to use (optional). Omit to use the default database."
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
required: ["tableName"],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
async run(params) {
|
|
20
|
+
try {
|
|
21
|
+
const { tableName, databaseName } = params;
|
|
22
|
+
const { request, error } = await getSqlRequest(databaseName);
|
|
23
|
+
if (error) {
|
|
24
|
+
return { success: false, message: error };
|
|
25
|
+
}
|
|
26
|
+
const query = `SELECT COLUMN_NAME as name, DATA_TYPE as type FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName`;
|
|
27
|
+
request.input("tableName", sql.NVarChar, tableName);
|
|
28
|
+
const result = await request.query(query);
|
|
29
|
+
return {
|
|
30
|
+
success: true,
|
|
31
|
+
columns: result.recordset,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
message: `Failed to describe table: ${error}`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=DescribeTableTool.js.map
|
|
@@ -0,0 +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,GAAG,+EAA+E,CAAC;QAC9F,gBAAW,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;gBAC3E,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2EAA2E;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"}
|
|
@@ -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":"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,MAUF;IAEH,GAAG,CAAC,MAAM,EAAE,GAAG;;;;CA2BtB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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 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
|
+
}
|
|
45
|
+
//# sourceMappingURL=DropTableTool.js.map
|
|
@@ -0,0 +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,EAAE,2EAA2E;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"}
|
|
@@ -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":"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,MA0BF;IACH,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;CA0EtB"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { getSqlRequest } from "../db.js";
|
|
2
|
+
export class InsertDataTool {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.name = "insert_data";
|
|
5
|
+
this.description = `Inserts data into an MSSQL Database table. Supports both single record insertion and multiple record insertion using standard SQL INSERT with VALUES clause.
|
|
6
|
+
FORMAT EXAMPLES:
|
|
7
|
+
Single Record Insert:
|
|
8
|
+
{
|
|
9
|
+
"tableName": "Users",
|
|
10
|
+
"data": {
|
|
11
|
+
"name": "John Doe",
|
|
12
|
+
"email": "john@example.com",
|
|
13
|
+
"age": 30,
|
|
14
|
+
"isActive": true,
|
|
15
|
+
"createdDate": "2023-01-15"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
Multiple Records Insert:
|
|
19
|
+
{
|
|
20
|
+
"tableName": "Users",
|
|
21
|
+
"data": [
|
|
22
|
+
{
|
|
23
|
+
"name": "John Doe",
|
|
24
|
+
"email": "john@example.com",
|
|
25
|
+
"age": 30,
|
|
26
|
+
"isActive": true,
|
|
27
|
+
"createdDate": "2023-01-15"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "Jane Smith",
|
|
31
|
+
"email": "jane@example.com",
|
|
32
|
+
"age": 25,
|
|
33
|
+
"isActive": false,
|
|
34
|
+
"createdDate": "2023-01-16"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
GENERATED SQL FORMAT:
|
|
39
|
+
- Single: INSERT INTO table (col1, col2) VALUES (@param1, @param2)
|
|
40
|
+
- Multiple: INSERT INTO table (col1, col2) VALUES (@param1, @param2), (@param3, @param4), ...
|
|
41
|
+
IMPORTANT RULES:
|
|
42
|
+
- For single record: Use a single object for the 'data' field
|
|
43
|
+
- For multiple records: Use an array of objects for the 'data' field
|
|
44
|
+
- All objects in array must have identical column names
|
|
45
|
+
- Column names must match the actual database table columns exactly
|
|
46
|
+
- Values should match the expected data types (string, number, boolean, date)
|
|
47
|
+
- Use proper date format for date columns (YYYY-MM-DD or ISO format)`;
|
|
48
|
+
this.inputSchema = {
|
|
49
|
+
type: "object",
|
|
50
|
+
properties: {
|
|
51
|
+
tableName: {
|
|
52
|
+
type: "string",
|
|
53
|
+
description: "Name of the table to insert data into"
|
|
54
|
+
},
|
|
55
|
+
data: {
|
|
56
|
+
oneOf: [
|
|
57
|
+
{
|
|
58
|
+
type: "object",
|
|
59
|
+
description: "Single record data object with column names as keys and values as the data to insert. Example: {\"name\": \"John\", \"age\": 30}"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: "array",
|
|
63
|
+
items: { type: "object" },
|
|
64
|
+
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}]"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
databaseName: {
|
|
69
|
+
type: "string",
|
|
70
|
+
description: "Name of the database to use (optional). Omit to use the default database."
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
required: ["tableName", "data"],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async run(params) {
|
|
77
|
+
try {
|
|
78
|
+
const { tableName, data, databaseName } = params;
|
|
79
|
+
const { request, error } = await getSqlRequest(databaseName);
|
|
80
|
+
if (error) {
|
|
81
|
+
return { success: false, message: error };
|
|
82
|
+
}
|
|
83
|
+
// Check if data is an array (multiple records) or single object
|
|
84
|
+
const isMultipleRecords = Array.isArray(data);
|
|
85
|
+
const records = isMultipleRecords ? data : [data];
|
|
86
|
+
if (records.length === 0) {
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
message: "No data provided for insertion",
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Validate that all records have the same columns
|
|
93
|
+
const firstRecordColumns = Object.keys(records[0]).sort();
|
|
94
|
+
for (let i = 1; i < records.length; i++) {
|
|
95
|
+
const currentColumns = Object.keys(records[i]).sort();
|
|
96
|
+
if (JSON.stringify(firstRecordColumns) !== JSON.stringify(currentColumns)) {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
message: `Column mismatch: Record ${i + 1} has different columns than the first record. Expected columns: [${firstRecordColumns.join(', ')}], but got: [${currentColumns.join(', ')}]`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const columns = firstRecordColumns.join(", ");
|
|
104
|
+
if (isMultipleRecords) {
|
|
105
|
+
// Multiple records insert using VALUES clause - works for 1 or more records
|
|
106
|
+
const valueClauses = [];
|
|
107
|
+
records.forEach((record, recordIndex) => {
|
|
108
|
+
const valueParams = firstRecordColumns
|
|
109
|
+
.map((column, columnIndex) => `@value${recordIndex}_${columnIndex}`)
|
|
110
|
+
.join(", ");
|
|
111
|
+
valueClauses.push(`(${valueParams})`);
|
|
112
|
+
// Add parameters for this record
|
|
113
|
+
firstRecordColumns.forEach((column, columnIndex) => {
|
|
114
|
+
request.input(`value${recordIndex}_${columnIndex}`, record[column]);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
const query = `INSERT INTO ${tableName} (${columns}) VALUES ${valueClauses.join(", ")}`;
|
|
118
|
+
await request.query(query);
|
|
119
|
+
return {
|
|
120
|
+
success: true,
|
|
121
|
+
message: `Successfully inserted ${records.length} record${records.length > 1 ? 's' : ''} into ${tableName}`,
|
|
122
|
+
recordsInserted: records.length,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Single record insert (when data is passed as single object)
|
|
127
|
+
const values = firstRecordColumns
|
|
128
|
+
.map((column, index) => `@value${index}`)
|
|
129
|
+
.join(", ");
|
|
130
|
+
firstRecordColumns.forEach((column, index) => {
|
|
131
|
+
request.input(`value${index}`, records[0][column]);
|
|
132
|
+
});
|
|
133
|
+
const query = `INSERT INTO ${tableName} (${columns}) VALUES (${values})`;
|
|
134
|
+
await request.query(query);
|
|
135
|
+
return {
|
|
136
|
+
success: true,
|
|
137
|
+
message: `Successfully inserted 1 record into ${tableName}`,
|
|
138
|
+
recordsInserted: 1,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
console.error("Error inserting data:", error);
|
|
144
|
+
return {
|
|
145
|
+
success: false,
|
|
146
|
+
message: `Failed to insert data: ${error}`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# 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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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export declare class ListTableTool 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
|
+
items?: undefined;
|
|
11
|
+
} | {
|
|
12
|
+
success: boolean;
|
|
13
|
+
message: string;
|
|
14
|
+
items: import("mssql").IRecordSet<any>;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ListTableTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListTableTool.d.ts","sourceRoot":"","sources":["../../src/tools/ListTableTool.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,SAA2E;IACtF,WAAW,MAiBF;IAEH,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;CAwBtB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { getSqlRequest } from "../db.js";
|
|
2
|
+
export class ListTableTool {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.name = "list_table";
|
|
5
|
+
this.description = "Lists tables in an MSSQL Database, or list tables in specific schemas";
|
|
6
|
+
this.inputSchema = {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
parameters: {
|
|
10
|
+
type: "array",
|
|
11
|
+
description: "Schemas to filter by (optional)",
|
|
12
|
+
items: {
|
|
13
|
+
type: "string"
|
|
14
|
+
},
|
|
15
|
+
minItems: 0
|
|
16
|
+
},
|
|
17
|
+
databaseName: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Name of the database to use (optional). Omit to use the default database."
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: [],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async run(params) {
|
|
26
|
+
try {
|
|
27
|
+
const { parameters, databaseName } = params || {};
|
|
28
|
+
const { request, error } = await getSqlRequest(databaseName);
|
|
29
|
+
if (error) {
|
|
30
|
+
return { success: false, message: error };
|
|
31
|
+
}
|
|
32
|
+
const schemaFilter = parameters && parameters.length > 0 ? `AND TABLE_SCHEMA IN (${parameters.map((p) => `'${p}'`).join(", ")})` : "";
|
|
33
|
+
const query = `SELECT TABLE_SCHEMA + '.' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' ${schemaFilter} ORDER BY TABLE_SCHEMA, TABLE_NAME`;
|
|
34
|
+
const result = await request.query(query);
|
|
35
|
+
return {
|
|
36
|
+
success: true,
|
|
37
|
+
message: `List tables executed successfully`,
|
|
38
|
+
items: result.recordset,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error("Error listing tables:", error);
|
|
43
|
+
return {
|
|
44
|
+
success: false,
|
|
45
|
+
message: `Failed to list tables: ${error}`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ListTableTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListTableTool.js","sourceRoot":"","sources":["../../src/tools/ListTableTool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,OAAO,aAAa;IAA1B;QAEE,SAAI,GAAG,YAAY,CAAC;QACpB,gBAAW,GAAG,uEAAuE,CAAC;QACtF,gBAAW,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,iCAAiC;oBAC9C,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;qBACf;oBACD,QAAQ,EAAE,CAAC;iBACZ;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2EAA2E;iBACzF;aACF;YACD,QAAQ,EAAE,EAAE;SACN,CAAC;IA0BX,CAAC;IAxBC,KAAK,CAAC,GAAG,CAAC,MAAW;QACnB,IAAI;YACF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;YAElD,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,YAAY,GAAG,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,wBAAwB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9I,MAAM,KAAK,GAAG,yGAAyG,YAAY,oCAAoC,CAAC;YACxK,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,mCAAmC;gBAC5C,KAAK,EAAE,MAAM,CAAC,SAAS;aACxB,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,0BAA0B,KAAK,EAAE;aAC3C,CAAC;SACH;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
inputSchema: any;
|
|
7
|
+
private static readonly DANGEROUS_KEYWORDS;
|
|
8
|
+
private static readonly DANGEROUS_PATTERNS;
|
|
9
|
+
/**
|
|
10
|
+
* Validates the SQL query for security issues
|
|
11
|
+
* @param query The SQL query to validate
|
|
12
|
+
* @returns Validation result with success flag and error message if invalid
|
|
13
|
+
*/
|
|
14
|
+
private validateQuery;
|
|
15
|
+
/**
|
|
16
|
+
* Sanitizes the query result to prevent any potential security issues
|
|
17
|
+
* @param data The query result data
|
|
18
|
+
* @returns Sanitized data
|
|
19
|
+
*/
|
|
20
|
+
private sanitizeResult;
|
|
21
|
+
/**
|
|
22
|
+
* Executes the validated SQL query
|
|
23
|
+
* @param params Query parameters
|
|
24
|
+
* @returns Query execution result
|
|
25
|
+
*/
|
|
26
|
+
run(params: any): Promise<{
|
|
27
|
+
success: boolean;
|
|
28
|
+
message: string;
|
|
29
|
+
error: string;
|
|
30
|
+
data?: undefined;
|
|
31
|
+
recordCount?: undefined;
|
|
32
|
+
totalRecords?: undefined;
|
|
33
|
+
} | {
|
|
34
|
+
success: boolean;
|
|
35
|
+
message: string;
|
|
36
|
+
data: any[];
|
|
37
|
+
recordCount: number;
|
|
38
|
+
totalRecords: number;
|
|
39
|
+
error?: undefined;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
42
|
+
//# 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,SAAkK;IAE7K,WAAW,MAaF;IAGT,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,cAAc;IA6BtB;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;CAyDtB"}
|