@eamonboyle/mssql-mcp 1.0.0 → 1.2.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/README.md +153 -36
- package/dist/__tests__/ExplainQueryTool.test.d.ts +2 -0
- package/dist/__tests__/ExplainQueryTool.test.d.ts.map +1 -0
- package/dist/__tests__/ExplainQueryTool.test.js +96 -0
- package/dist/__tests__/ExplainQueryTool.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +29 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/db.test.d.ts +2 -0
- package/dist/__tests__/db.test.d.ts.map +1 -0
- package/dist/__tests__/db.test.js +204 -0
- package/dist/__tests__/db.test.js.map +1 -0
- package/dist/__tests__/promptRegistry.test.d.ts +2 -0
- package/dist/__tests__/promptRegistry.test.d.ts.map +1 -0
- package/dist/__tests__/promptRegistry.test.js +40 -0
- package/dist/__tests__/promptRegistry.test.js.map +1 -0
- package/dist/__tests__/resourceRegistry.test.d.ts +2 -0
- package/dist/__tests__/resourceRegistry.test.d.ts.map +1 -0
- package/dist/__tests__/resourceRegistry.test.js +40 -0
- package/dist/__tests__/resourceRegistry.test.js.map +1 -0
- package/dist/__tests__/schema.test.d.ts +2 -0
- package/dist/__tests__/schema.test.d.ts.map +1 -0
- package/dist/__tests__/schema.test.js +130 -0
- package/dist/__tests__/schema.test.js.map +1 -0
- package/dist/__tests__/sql.test.d.ts +2 -0
- package/dist/__tests__/sql.test.d.ts.map +1 -0
- package/dist/__tests__/sql.test.js +35 -0
- package/dist/__tests__/sql.test.js.map +1 -0
- package/dist/__tests__/toolRegistry.test.d.ts +2 -0
- package/dist/__tests__/toolRegistry.test.d.ts.map +1 -0
- package/dist/__tests__/toolRegistry.test.js +47 -0
- package/dist/__tests__/toolRegistry.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +2 -0
- package/dist/__tests__/validation.test.d.ts.map +1 -0
- package/dist/__tests__/validation.test.js +111 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/__tests__/writeTools.test.d.ts +2 -0
- package/dist/__tests__/writeTools.test.d.ts.map +1 -0
- package/dist/__tests__/writeTools.test.js +115 -0
- package/dist/__tests__/writeTools.test.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +28 -24
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +144 -89
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +70 -105
- package/dist/index.js.map +1 -1
- package/dist/promptRegistry.d.ts +16 -0
- package/dist/promptRegistry.d.ts.map +1 -0
- package/dist/promptRegistry.js +107 -0
- package/dist/promptRegistry.js.map +1 -0
- package/dist/resourceRegistry.d.ts +12 -0
- package/dist/resourceRegistry.d.ts.map +1 -0
- package/dist/resourceRegistry.js +172 -0
- package/dist/resourceRegistry.js.map +1 -0
- package/dist/schema.d.ts +41 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +211 -0
- package/dist/schema.js.map +1 -0
- package/dist/sql.d.ts +7 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +73 -0
- package/dist/sql.js.map +1 -0
- package/dist/toolRegistry.d.ts +16 -0
- package/dist/toolRegistry.d.ts.map +1 -0
- package/dist/toolRegistry.js +401 -0
- package/dist/toolRegistry.js.map +1 -0
- package/dist/tools/CreateIndexTool.d.ts +30 -23
- package/dist/tools/CreateIndexTool.d.ts.map +1 -1
- package/dist/tools/CreateIndexTool.js +47 -71
- package/dist/tools/CreateIndexTool.js.map +1 -1
- package/dist/tools/CreateTableTool.d.ts +18 -11
- package/dist/tools/CreateTableTool.d.ts.map +1 -1
- package/dist/tools/CreateTableTool.js +37 -56
- package/dist/tools/CreateTableTool.js.map +1 -1
- package/dist/tools/DeleteDataTool.d.ts +22 -0
- package/dist/tools/DeleteDataTool.d.ts.map +1 -0
- package/dist/tools/DeleteDataTool.js +35 -0
- package/dist/tools/DeleteDataTool.js.map +1 -0
- package/dist/tools/DescribeObjectTool.d.ts +21 -0
- package/dist/tools/DescribeObjectTool.d.ts.map +1 -0
- package/dist/tools/DescribeObjectTool.js +31 -0
- package/dist/tools/DescribeObjectTool.js.map +1 -0
- package/dist/tools/DescribeTableTool.d.ts +19 -20
- package/dist/tools/DescribeTableTool.d.ts.map +1 -1
- package/dist/tools/DescribeTableTool.js +23 -41
- package/dist/tools/DescribeTableTool.js.map +1 -1
- package/dist/tools/DropTableTool.d.ts +13 -11
- package/dist/tools/DropTableTool.d.ts.map +1 -1
- package/dist/tools/DropTableTool.js +30 -44
- package/dist/tools/DropTableTool.js.map +1 -1
- package/dist/tools/ExplainQueryTool.d.ts +32 -0
- package/dist/tools/ExplainQueryTool.d.ts.map +1 -0
- package/dist/tools/ExplainQueryTool.js +102 -0
- package/dist/tools/ExplainQueryTool.js.map +1 -0
- package/dist/tools/InsertDataTool.d.ts +20 -16
- package/dist/tools/InsertDataTool.d.ts.map +1 -1
- package/dist/tools/InsertDataTool.js +91 -108
- package/dist/tools/InsertDataTool.js.map +1 -1
- package/dist/tools/ListObjectsTool.d.ts +20 -0
- package/dist/tools/ListObjectsTool.d.ts.map +1 -0
- package/dist/tools/ListObjectsTool.js +26 -0
- package/dist/tools/ListObjectsTool.js.map +1 -0
- package/dist/tools/ListTableTool.d.ts +20 -16
- package/dist/tools/ListTableTool.d.ts.map +1 -1
- package/dist/tools/ListTableTool.js +32 -49
- package/dist/tools/ListTableTool.js.map +1 -1
- package/dist/tools/ReadDataTool.d.ts +35 -41
- package/dist/tools/ReadDataTool.d.ts.map +1 -1
- package/dist/tools/ReadDataTool.js +92 -228
- package/dist/tools/ReadDataTool.js.map +1 -1
- package/dist/tools/SearchDataTool.d.ts +27 -0
- package/dist/tools/SearchDataTool.d.ts.map +1 -0
- package/dist/tools/SearchDataTool.js +61 -0
- package/dist/tools/SearchDataTool.js.map +1 -0
- package/dist/tools/UpdateDataTool.d.ts +21 -16
- package/dist/tools/UpdateDataTool.d.ts.map +1 -1
- package/dist/tools/UpdateDataTool.js +45 -65
- package/dist/tools/UpdateDataTool.js.map +1 -1
- package/dist/validation.d.ts +14 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +134 -0
- package/dist/validation.js.map +1 -0
- package/dist/writeSafety.d.ts +21 -0
- package/dist/writeSafety.d.ts.map +1 -0
- package/dist/writeSafety.js +169 -0
- package/dist/writeSafety.js.map +1 -0
- package/package.json +17 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeTools.test.js","sourceRoot":"","sources":["../../src/__tests__/writeTools.test.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function getMaxRows(): number;
|
|
2
|
+
export declare function getQueryTimeoutMs(): number;
|
|
3
|
+
export declare function getDefaultSearchLimit(): number;
|
|
4
|
+
export declare function clampRowLimit(limit: unknown, fallback?: number): number;
|
|
5
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAqBA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAe,GAAG,MAAM,CAa7E"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const DEFAULT_MAX_ROWS = 10000;
|
|
2
|
+
const DEFAULT_QUERY_TIMEOUT_MS = 30000;
|
|
3
|
+
const DEFAULT_SEARCH_LIMIT = 100;
|
|
4
|
+
function parsePositiveInt(value, fallback, minimum = 1) {
|
|
5
|
+
if (!value) {
|
|
6
|
+
return fallback;
|
|
7
|
+
}
|
|
8
|
+
const parsed = Number.parseInt(value, 10);
|
|
9
|
+
if (!Number.isFinite(parsed) || parsed < minimum) {
|
|
10
|
+
return fallback;
|
|
11
|
+
}
|
|
12
|
+
return parsed;
|
|
13
|
+
}
|
|
14
|
+
export function getMaxRows() {
|
|
15
|
+
return parsePositiveInt(process.env.MAX_ROWS, DEFAULT_MAX_ROWS);
|
|
16
|
+
}
|
|
17
|
+
export function getQueryTimeoutMs() {
|
|
18
|
+
return parsePositiveInt(process.env.QUERY_TIMEOUT_MS, DEFAULT_QUERY_TIMEOUT_MS);
|
|
19
|
+
}
|
|
20
|
+
export function getDefaultSearchLimit() {
|
|
21
|
+
return Math.min(getMaxRows(), DEFAULT_SEARCH_LIMIT);
|
|
22
|
+
}
|
|
23
|
+
export function clampRowLimit(limit, fallback = getMaxRows()) {
|
|
24
|
+
const parsed = typeof limit === "number"
|
|
25
|
+
? limit
|
|
26
|
+
: typeof limit === "string"
|
|
27
|
+
? Number.parseInt(limit, 10)
|
|
28
|
+
: Number.NaN;
|
|
29
|
+
if (!Number.isFinite(parsed) || parsed < 1) {
|
|
30
|
+
return Math.min(fallback, getMaxRows());
|
|
31
|
+
}
|
|
32
|
+
return Math.min(Math.floor(parsed), getMaxRows());
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,SAAS,gBAAgB,CACvB,KAAyB,EACzB,QAAgB,EAChB,OAAO,GAAG,CAAC;IAEX,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,CACrB,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAC5B,wBAAwB,CACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,oBAAoB,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,QAAQ,GAAG,UAAU,EAAE;IACnE,MAAM,MAAM,GACV,OAAO,KAAK,KAAK,QAAQ;QACvB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IAEnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AACpD,CAAC"}
|
package/dist/db.d.ts
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import sql from "mssql";
|
|
2
|
-
/**
|
|
3
|
-
* Returns the list of allowed database names.
|
|
4
|
-
* If DATABASES is set, returns those; otherwise returns only DATABASE_NAME.
|
|
5
|
-
*/
|
|
6
|
-
export declare function getAllowedDatabases(): string[];
|
|
7
|
-
/**
|
|
8
|
-
* Resolves the database name to use (param or default).
|
|
9
|
-
* Returns null if invalid.
|
|
10
|
-
*/
|
|
11
|
-
export declare function resolveDatabaseName(databaseName?: string): string | null;
|
|
12
|
-
/**
|
|
13
|
-
* Ensures a connection pool exists for the given database.
|
|
14
|
-
*/
|
|
15
|
-
export declare function ensureSqlConnection(databaseName: string): Promise<sql.ConnectionPool>;
|
|
16
|
-
/**
|
|
17
|
-
* Returns a sql.Request for the given database.
|
|
18
|
-
* Resolves database name (param or default), validates against allowed list,
|
|
19
|
-
* ensures connection, and returns pool.request().
|
|
20
|
-
*/
|
|
21
|
-
export declare function getSqlRequest(databaseName?: string): Promise<{
|
|
22
|
-
request: sql.Request;
|
|
23
|
-
error?: string;
|
|
24
|
-
}>;
|
|
1
|
+
import sql from "mssql";
|
|
2
|
+
/**
|
|
3
|
+
* Returns the list of allowed database names.
|
|
4
|
+
* If DATABASES is set, returns those; otherwise returns only DATABASE_NAME.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getAllowedDatabases(): string[];
|
|
7
|
+
/**
|
|
8
|
+
* Resolves the database name to use (param or default).
|
|
9
|
+
* Returns null if invalid.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveDatabaseName(databaseName?: string): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* Ensures a connection pool exists for the given database.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ensureSqlConnection(databaseName: string): Promise<sql.ConnectionPool>;
|
|
16
|
+
/**
|
|
17
|
+
* Returns a sql.Request for the given database.
|
|
18
|
+
* Resolves database name (param or default), validates against allowed list,
|
|
19
|
+
* ensures connection, and returns pool.request().
|
|
20
|
+
*/
|
|
21
|
+
export declare function getSqlRequest(databaseName?: string): Promise<{
|
|
22
|
+
request: sql.Request;
|
|
23
|
+
error?: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function getDedicatedSqlPool(databaseName?: string): Promise<{
|
|
26
|
+
pool: sql.ConnectionPool;
|
|
27
|
+
error?: string;
|
|
28
|
+
}>;
|
|
25
29
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAgCxB;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAQ9C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxE;AA6CD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAoB7B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAWnD;AAED,wBAAsB,mBAAmB,CACvC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBvD"}
|
package/dist/db.js
CHANGED
|
@@ -1,90 +1,145 @@
|
|
|
1
|
-
import sql from "mssql";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
1
|
+
import sql from "mssql";
|
|
2
|
+
import { getQueryTimeoutMs } from "./config.js";
|
|
3
|
+
// Connection pools keyed by database name
|
|
4
|
+
const sqlPools = new Map();
|
|
5
|
+
function parseDatabaseList(value) {
|
|
6
|
+
if (!value || !value.trim()) {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
return value
|
|
10
|
+
.split(",")
|
|
11
|
+
.map((db) => db.trim())
|
|
12
|
+
.filter(Boolean);
|
|
13
|
+
}
|
|
14
|
+
function getDefaultDatabaseName() {
|
|
15
|
+
const allowedDatabases = parseDatabaseList(process.env.DATABASES);
|
|
16
|
+
const explicitDefault = process.env.DATABASE_NAME?.trim();
|
|
17
|
+
if (allowedDatabases.length === 0) {
|
|
18
|
+
return explicitDefault ?? null;
|
|
19
|
+
}
|
|
20
|
+
if (explicitDefault && allowedDatabases.includes(explicitDefault)) {
|
|
21
|
+
return explicitDefault;
|
|
22
|
+
}
|
|
23
|
+
return allowedDatabases[0] ?? null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns the list of allowed database names.
|
|
27
|
+
* If DATABASES is set, returns those; otherwise returns only DATABASE_NAME.
|
|
28
|
+
*/
|
|
29
|
+
export function getAllowedDatabases() {
|
|
30
|
+
const allowedDatabases = parseDatabaseList(process.env.DATABASES);
|
|
31
|
+
if (allowedDatabases.length > 0) {
|
|
32
|
+
return allowedDatabases;
|
|
33
|
+
}
|
|
34
|
+
const defaultDb = process.env.DATABASE_NAME?.trim();
|
|
35
|
+
return defaultDb ? [defaultDb] : [];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolves the database name to use (param or default).
|
|
39
|
+
* Returns null if invalid.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveDatabaseName(databaseName) {
|
|
42
|
+
const resolved = databaseName?.trim() || getDefaultDatabaseName();
|
|
43
|
+
if (!resolved)
|
|
44
|
+
return null;
|
|
45
|
+
const allowed = getAllowedDatabases();
|
|
46
|
+
if (allowed.length === 0)
|
|
47
|
+
return null;
|
|
48
|
+
if (allowed.includes(resolved))
|
|
49
|
+
return resolved;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
function createSqlConfigForDatabase(databaseName) {
|
|
53
|
+
const trustServerCertificate = process.env.TRUST_SERVER_CERTIFICATE?.toLowerCase() === "true";
|
|
54
|
+
const connectionTimeout = process.env.CONNECTION_TIMEOUT
|
|
55
|
+
? parseInt(process.env.CONNECTION_TIMEOUT, 10)
|
|
56
|
+
: 30;
|
|
57
|
+
return {
|
|
58
|
+
server: process.env.SERVER_NAME || "localhost",
|
|
59
|
+
database: databaseName,
|
|
60
|
+
user: process.env.DB_USER,
|
|
61
|
+
password: process.env.DB_PASSWORD,
|
|
62
|
+
requestTimeout: getQueryTimeoutMs(),
|
|
63
|
+
options: {
|
|
64
|
+
encrypt: false,
|
|
65
|
+
trustServerCertificate: trustServerCertificate || true,
|
|
66
|
+
enableArithAbort: true,
|
|
67
|
+
useUTC: false,
|
|
68
|
+
},
|
|
69
|
+
connectionTimeout: connectionTimeout * 1000,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async function resolveConfiguredDatabase(databaseName) {
|
|
73
|
+
const resolved = resolveDatabaseName(databaseName);
|
|
74
|
+
if (!resolved) {
|
|
75
|
+
const allowed = getAllowedDatabases();
|
|
76
|
+
const configurationHint = allowed.length > 0
|
|
77
|
+
? `Allowed: ${allowed.join(", ")}.`
|
|
78
|
+
: "Set DATABASE_NAME or DATABASES to configure database access.";
|
|
79
|
+
return {
|
|
80
|
+
databaseName: "",
|
|
81
|
+
error: `Invalid or disallowed database. ${configurationHint} Use the databaseName parameter to target a specific configured database.`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return { databaseName: resolved };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Ensures a connection pool exists for the given database.
|
|
88
|
+
*/
|
|
89
|
+
export async function ensureSqlConnection(databaseName) {
|
|
90
|
+
const existing = sqlPools.get(databaseName);
|
|
91
|
+
if (existing && existing.connected) {
|
|
92
|
+
return existing;
|
|
93
|
+
}
|
|
94
|
+
if (existing) {
|
|
95
|
+
try {
|
|
96
|
+
await existing.close();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Ignore close errors
|
|
100
|
+
}
|
|
101
|
+
sqlPools.delete(databaseName);
|
|
102
|
+
}
|
|
103
|
+
const config = createSqlConfigForDatabase(databaseName);
|
|
104
|
+
const pool = new sql.ConnectionPool(config);
|
|
105
|
+
await pool.connect();
|
|
106
|
+
sqlPools.set(databaseName, pool);
|
|
107
|
+
return pool;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Returns a sql.Request for the given database.
|
|
111
|
+
* Resolves database name (param or default), validates against allowed list,
|
|
112
|
+
* ensures connection, and returns pool.request().
|
|
113
|
+
*/
|
|
114
|
+
export async function getSqlRequest(databaseName) {
|
|
115
|
+
const resolved = await resolveConfiguredDatabase(databaseName);
|
|
116
|
+
if (resolved.error) {
|
|
117
|
+
return {
|
|
118
|
+
request: null,
|
|
119
|
+
error: resolved.error,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const pool = await ensureSqlConnection(resolved.databaseName);
|
|
123
|
+
return { request: pool.request() };
|
|
124
|
+
}
|
|
125
|
+
export async function getDedicatedSqlPool(databaseName) {
|
|
126
|
+
const resolved = await resolveConfiguredDatabase(databaseName);
|
|
127
|
+
if (resolved.error) {
|
|
128
|
+
return {
|
|
129
|
+
pool: null,
|
|
130
|
+
error: resolved.error,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const config = {
|
|
134
|
+
...createSqlConfigForDatabase(resolved.databaseName),
|
|
135
|
+
pool: {
|
|
136
|
+
max: 1,
|
|
137
|
+
min: 0,
|
|
138
|
+
idleTimeoutMillis: 30000,
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
const pool = new sql.ConnectionPool(config);
|
|
142
|
+
await pool.connect();
|
|
143
|
+
return { pool };
|
|
144
|
+
}
|
|
90
145
|
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
export {};
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export {};
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,106 +1,71 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
result = await describeTableTool.run(args);
|
|
72
|
-
break;
|
|
73
|
-
default:
|
|
74
|
-
return {
|
|
75
|
-
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
76
|
-
isError: true,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
return {
|
|
80
|
-
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
return {
|
|
85
|
-
content: [{ type: 'text', text: `Error occurred: ${error}` }],
|
|
86
|
-
isError: true,
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
// Server startup
|
|
91
|
-
async function runServer() {
|
|
92
|
-
try {
|
|
93
|
-
const transport = new StdioServerTransport();
|
|
94
|
-
await server.connect(transport);
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
console.error('Fatal error running server:', error);
|
|
98
|
-
process.exit(1);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
runServer().catch((error) => {
|
|
102
|
-
console.error('Fatal error running server:', error);
|
|
103
|
-
process.exit(1);
|
|
104
|
-
});
|
|
105
|
-
// Tools call getSqlRequest(databaseName) internally - no wrapping needed
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as dotenv from "dotenv";
|
|
3
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
dotenv.config();
|
|
6
|
+
import { getMaxRows, getQueryTimeoutMs } from "./config.js";
|
|
7
|
+
import { getAllowedDatabases } from "./db.js";
|
|
8
|
+
import { registerPrompts } from "./promptRegistry.js";
|
|
9
|
+
import { registerResources } from "./resourceRegistry.js";
|
|
10
|
+
import { getAvailableTools } from "./toolRegistry.js";
|
|
11
|
+
const SERVER_VERSION = "1.2.0";
|
|
12
|
+
const SERVER_NAME = "mssql-mcp-server";
|
|
13
|
+
const isReadOnly = process.env.READONLY === "true";
|
|
14
|
+
const allowedDatabases = getAllowedDatabases();
|
|
15
|
+
const availableTools = getAvailableTools(isReadOnly);
|
|
16
|
+
const baseInstructions = "Use list_objects or list_table to inspect schema before querying data. Prefer read_data, search_data, and explain_query for safe read-only analysis.";
|
|
17
|
+
const readOnlyInstructions = " This server is READONLY: write/DDL MCP tools are disabled. Never use sqlcmd, SSMS, other DB CLI tools, or terminal scripts to perform INSERT, UPDATE, DELETE, or DDL as a workaround—state that the user must set READONLY=false on this server or apply changes themselves.";
|
|
18
|
+
const server = new McpServer({
|
|
19
|
+
name: SERVER_NAME,
|
|
20
|
+
version: SERVER_VERSION,
|
|
21
|
+
}, {
|
|
22
|
+
instructions: isReadOnly
|
|
23
|
+
? baseInstructions + readOnlyInstructions
|
|
24
|
+
: baseInstructions,
|
|
25
|
+
});
|
|
26
|
+
function asTextToolResult(result) {
|
|
27
|
+
const isError = typeof result === "object" &&
|
|
28
|
+
result !== null &&
|
|
29
|
+
"success" in result &&
|
|
30
|
+
result.success === false;
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
33
|
+
isError,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function registerTools(serverInstance) {
|
|
37
|
+
for (const definition of availableTools) {
|
|
38
|
+
serverInstance.registerTool(definition.tool.name, {
|
|
39
|
+
title: definition.tool.name,
|
|
40
|
+
description: definition.tool.description,
|
|
41
|
+
inputSchema: definition.inputSchema,
|
|
42
|
+
annotations: definition.annotations,
|
|
43
|
+
}, async (args) => asTextToolResult(await definition.tool.run(args)));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
registerTools(server);
|
|
47
|
+
registerResources(server, {
|
|
48
|
+
serverName: SERVER_NAME,
|
|
49
|
+
serverVersion: SERVER_VERSION,
|
|
50
|
+
isReadOnly,
|
|
51
|
+
allowedDatabases,
|
|
52
|
+
toolNames: availableTools.map((tool) => tool.tool.name),
|
|
53
|
+
maxRows: getMaxRows(),
|
|
54
|
+
queryTimeoutMs: getQueryTimeoutMs(),
|
|
55
|
+
});
|
|
56
|
+
registerPrompts(server, { isReadOnly });
|
|
57
|
+
async function runServer() {
|
|
58
|
+
try {
|
|
59
|
+
const transport = new StdioServerTransport();
|
|
60
|
+
await server.connect(transport);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error("Fatal error running server:", error);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
runServer().catch((error) => {
|
|
68
|
+
console.error("Fatal error running server:", error);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
});
|
|
106
71
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export interface PromptDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
arguments?: Array<{
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
required?: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export declare const promptDefinitions: PromptDefinition[];
|
|
12
|
+
export interface RegisterPromptsOptions {
|
|
13
|
+
isReadOnly: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function registerPrompts(server: McpServer, options: RegisterPromptsOptions): void;
|
|
16
|
+
//# sourceMappingURL=promptRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptRegistry.d.ts","sourceRoot":"","sources":["../src/promptRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EAiD/C,CAAC;AAYF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,OAAO,CAAC;CACrB;AAkDD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,sBAAsB,GAC9B,IAAI,CA0BN"}
|