@eamonboyle/mssql-mcp 1.1.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.
Files changed (129) hide show
  1. package/README.md +134 -22
  2. package/dist/__tests__/ExplainQueryTool.test.d.ts +2 -0
  3. package/dist/__tests__/ExplainQueryTool.test.d.ts.map +1 -0
  4. package/dist/__tests__/ExplainQueryTool.test.js +96 -0
  5. package/dist/__tests__/ExplainQueryTool.test.js.map +1 -0
  6. package/dist/__tests__/config.test.d.ts +2 -0
  7. package/dist/__tests__/config.test.d.ts.map +1 -0
  8. package/dist/__tests__/config.test.js +29 -0
  9. package/dist/__tests__/config.test.js.map +1 -0
  10. package/dist/__tests__/db.test.d.ts +1 -1
  11. package/dist/__tests__/db.test.js +203 -203
  12. package/dist/__tests__/promptRegistry.test.d.ts +2 -0
  13. package/dist/__tests__/promptRegistry.test.d.ts.map +1 -0
  14. package/dist/__tests__/promptRegistry.test.js +40 -0
  15. package/dist/__tests__/promptRegistry.test.js.map +1 -0
  16. package/dist/__tests__/resourceRegistry.test.d.ts +2 -0
  17. package/dist/__tests__/resourceRegistry.test.d.ts.map +1 -0
  18. package/dist/__tests__/resourceRegistry.test.js +40 -0
  19. package/dist/__tests__/resourceRegistry.test.js.map +1 -0
  20. package/dist/__tests__/schema.test.d.ts +2 -0
  21. package/dist/__tests__/schema.test.d.ts.map +1 -0
  22. package/dist/__tests__/schema.test.js +130 -0
  23. package/dist/__tests__/schema.test.js.map +1 -0
  24. package/dist/__tests__/sql.test.d.ts +2 -0
  25. package/dist/__tests__/sql.test.d.ts.map +1 -0
  26. package/dist/__tests__/sql.test.js +35 -0
  27. package/dist/__tests__/sql.test.js.map +1 -0
  28. package/dist/__tests__/toolRegistry.test.d.ts +2 -0
  29. package/dist/__tests__/toolRegistry.test.d.ts.map +1 -0
  30. package/dist/__tests__/toolRegistry.test.js +47 -0
  31. package/dist/__tests__/toolRegistry.test.js.map +1 -0
  32. package/dist/__tests__/validation.test.d.ts +1 -1
  33. package/dist/__tests__/validation.test.js +110 -110
  34. package/dist/__tests__/validation.test.js.map +1 -1
  35. package/dist/__tests__/writeTools.test.d.ts +2 -0
  36. package/dist/__tests__/writeTools.test.d.ts.map +1 -0
  37. package/dist/__tests__/writeTools.test.js +115 -0
  38. package/dist/__tests__/writeTools.test.js.map +1 -0
  39. package/dist/config.d.ts +5 -0
  40. package/dist/config.d.ts.map +1 -0
  41. package/dist/config.js +34 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/db.d.ts +28 -24
  44. package/dist/db.d.ts.map +1 -1
  45. package/dist/db.js +144 -112
  46. package/dist/db.js.map +1 -1
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.js +70 -122
  49. package/dist/index.js.map +1 -1
  50. package/dist/promptRegistry.d.ts +16 -0
  51. package/dist/promptRegistry.d.ts.map +1 -0
  52. package/dist/promptRegistry.js +107 -0
  53. package/dist/promptRegistry.js.map +1 -0
  54. package/dist/resourceRegistry.d.ts +12 -0
  55. package/dist/resourceRegistry.d.ts.map +1 -0
  56. package/dist/resourceRegistry.js +172 -0
  57. package/dist/resourceRegistry.js.map +1 -0
  58. package/dist/schema.d.ts +41 -0
  59. package/dist/schema.d.ts.map +1 -0
  60. package/dist/schema.js +211 -0
  61. package/dist/schema.js.map +1 -0
  62. package/dist/sql.d.ts +7 -0
  63. package/dist/sql.d.ts.map +1 -0
  64. package/dist/sql.js +73 -0
  65. package/dist/sql.js.map +1 -0
  66. package/dist/toolRegistry.d.ts +16 -0
  67. package/dist/toolRegistry.d.ts.map +1 -0
  68. package/dist/toolRegistry.js +401 -0
  69. package/dist/toolRegistry.js.map +1 -0
  70. package/dist/tools/CreateIndexTool.d.ts +30 -23
  71. package/dist/tools/CreateIndexTool.d.ts.map +1 -1
  72. package/dist/tools/CreateIndexTool.js +47 -77
  73. package/dist/tools/CreateIndexTool.js.map +1 -1
  74. package/dist/tools/CreateTableTool.d.ts +18 -11
  75. package/dist/tools/CreateTableTool.d.ts.map +1 -1
  76. package/dist/tools/CreateTableTool.js +37 -61
  77. package/dist/tools/CreateTableTool.js.map +1 -1
  78. package/dist/tools/DeleteDataTool.d.ts +22 -0
  79. package/dist/tools/DeleteDataTool.d.ts.map +1 -0
  80. package/dist/tools/DeleteDataTool.js +35 -0
  81. package/dist/tools/DeleteDataTool.js.map +1 -0
  82. package/dist/tools/DescribeObjectTool.d.ts +21 -0
  83. package/dist/tools/DescribeObjectTool.d.ts.map +1 -0
  84. package/dist/tools/DescribeObjectTool.js +31 -0
  85. package/dist/tools/DescribeObjectTool.js.map +1 -0
  86. package/dist/tools/DescribeTableTool.d.ts +19 -20
  87. package/dist/tools/DescribeTableTool.d.ts.map +1 -1
  88. package/dist/tools/DescribeTableTool.js +23 -44
  89. package/dist/tools/DescribeTableTool.js.map +1 -1
  90. package/dist/tools/DropTableTool.d.ts +13 -11
  91. package/dist/tools/DropTableTool.d.ts.map +1 -1
  92. package/dist/tools/DropTableTool.js +30 -44
  93. package/dist/tools/DropTableTool.js.map +1 -1
  94. package/dist/tools/ExplainQueryTool.d.ts +32 -0
  95. package/dist/tools/ExplainQueryTool.d.ts.map +1 -0
  96. package/dist/tools/ExplainQueryTool.js +102 -0
  97. package/dist/tools/ExplainQueryTool.js.map +1 -0
  98. package/dist/tools/InsertDataTool.d.ts +20 -16
  99. package/dist/tools/InsertDataTool.d.ts.map +1 -1
  100. package/dist/tools/InsertDataTool.js +91 -108
  101. package/dist/tools/InsertDataTool.js.map +1 -1
  102. package/dist/tools/ListObjectsTool.d.ts +20 -0
  103. package/dist/tools/ListObjectsTool.d.ts.map +1 -0
  104. package/dist/tools/ListObjectsTool.js +26 -0
  105. package/dist/tools/ListObjectsTool.js.map +1 -0
  106. package/dist/tools/ListTableTool.d.ts +20 -16
  107. package/dist/tools/ListTableTool.d.ts.map +1 -1
  108. package/dist/tools/ListTableTool.js +32 -51
  109. package/dist/tools/ListTableTool.js.map +1 -1
  110. package/dist/tools/ReadDataTool.d.ts +35 -33
  111. package/dist/tools/ReadDataTool.d.ts.map +1 -1
  112. package/dist/tools/ReadDataTool.js +92 -105
  113. package/dist/tools/ReadDataTool.js.map +1 -1
  114. package/dist/tools/SearchDataTool.d.ts +27 -0
  115. package/dist/tools/SearchDataTool.d.ts.map +1 -0
  116. package/dist/tools/SearchDataTool.js +61 -0
  117. package/dist/tools/SearchDataTool.js.map +1 -0
  118. package/dist/tools/UpdateDataTool.d.ts +21 -16
  119. package/dist/tools/UpdateDataTool.d.ts.map +1 -1
  120. package/dist/tools/UpdateDataTool.js +45 -65
  121. package/dist/tools/UpdateDataTool.js.map +1 -1
  122. package/dist/validation.d.ts +13 -13
  123. package/dist/validation.js +133 -133
  124. package/dist/validation.js.map +1 -1
  125. package/dist/writeSafety.d.ts +21 -0
  126. package/dist/writeSafety.d.ts.map +1 -0
  127. package/dist/writeSafety.js +169 -0
  128. package/dist/writeSafety.js.map +1 -0
  129. package/package.json +5 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptRegistry.js","sourceRoot":"","sources":["../src/promptRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export interface ResourceRegistryContext {
3
+ serverName: string;
4
+ serverVersion: string;
5
+ isReadOnly: boolean;
6
+ allowedDatabases: string[];
7
+ toolNames: string[];
8
+ maxRows: number;
9
+ queryTimeoutMs: number;
10
+ }
11
+ export declare function registerResources(server: McpServer, context: ResourceRegistryContext): void;
12
+ //# sourceMappingURL=resourceRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceRegistry.d.ts","sourceRoot":"","sources":["../src/resourceRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAqBtF,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AA0JD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,uBAAuB,GAC/B,IAAI,CAyGN"}
@@ -0,0 +1,172 @@
1
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { describeDatabaseObject, describeTableSchema, listDatabaseObjects, listDatabaseTables, } from "./schema.js";
3
+ import { promptDefinitions } from "./promptRegistry.js";
4
+ const resourceTemplates = [
5
+ {
6
+ name: "table_schema",
7
+ uriTemplate: "mssql://table/{databaseName}/{schemaName}/{tableName}",
8
+ description: "Detailed schema for a single table resource.",
9
+ mimeType: "application/json",
10
+ },
11
+ {
12
+ name: "object_definition",
13
+ uriTemplate: "mssql://object/{databaseName}/{schemaName}/{objectName}",
14
+ description: "Definition and metadata for a single table, view, procedure, function, or trigger.",
15
+ mimeType: "application/json",
16
+ },
17
+ ];
18
+ const RESOURCE_LIST_TTL_MS = 30000;
19
+ function buildResourceText(payload) {
20
+ return JSON.stringify(payload, null, 2);
21
+ }
22
+ function parseResourceUri(uri) {
23
+ const parsed = new URL(uri);
24
+ const segments = parsed.pathname
25
+ .split("/")
26
+ .filter(Boolean)
27
+ .map((segment) => decodeURIComponent(segment));
28
+ return {
29
+ resourceType: parsed.hostname,
30
+ segments,
31
+ };
32
+ }
33
+ function createListingCache(ttlMs) {
34
+ const cache = new Map();
35
+ return async function getCachedValue(key, loader) {
36
+ const now = Date.now();
37
+ const cached = cache.get(key);
38
+ if (cached && cached.expiresAt > now) {
39
+ return cached.value;
40
+ }
41
+ const value = await loader();
42
+ cache.set(key, {
43
+ value,
44
+ expiresAt: now + ttlMs,
45
+ });
46
+ return value;
47
+ };
48
+ }
49
+ async function readResourcePayload(uri, context, getCachedValue) {
50
+ const parsed = parseResourceUri(uri);
51
+ if (parsed.resourceType === "config") {
52
+ if (parsed.segments[0] === "server") {
53
+ return {
54
+ server: {
55
+ name: context.serverName,
56
+ version: context.serverVersion,
57
+ readOnly: context.isReadOnly,
58
+ allowedDatabases: context.allowedDatabases,
59
+ maxRows: context.maxRows,
60
+ queryTimeoutMs: context.queryTimeoutMs,
61
+ },
62
+ tools: context.toolNames,
63
+ };
64
+ }
65
+ if (parsed.segments[0] === "prompts") {
66
+ return {
67
+ prompts: promptDefinitions,
68
+ };
69
+ }
70
+ }
71
+ if (parsed.resourceType === "database") {
72
+ const [databaseName, resourceName] = parsed.segments;
73
+ if (resourceName === "tables") {
74
+ return {
75
+ databaseName,
76
+ tables: await getCachedValue(`tables:${databaseName}`, () => listDatabaseTables(databaseName)),
77
+ };
78
+ }
79
+ if (resourceName === "objects") {
80
+ return {
81
+ databaseName,
82
+ objects: await getCachedValue(`objects:${databaseName}`, () => listDatabaseObjects(databaseName)),
83
+ };
84
+ }
85
+ }
86
+ if (parsed.resourceType === "table") {
87
+ const [databaseName, schemaName, tableName] = parsed.segments;
88
+ return {
89
+ databaseName,
90
+ schemaName,
91
+ tableName,
92
+ columns: await describeTableSchema(tableName, databaseName, schemaName),
93
+ };
94
+ }
95
+ if (parsed.resourceType === "object") {
96
+ const [databaseName, schemaName, objectName] = parsed.segments;
97
+ const object = await describeDatabaseObject(objectName, databaseName, schemaName);
98
+ if (!object) {
99
+ throw new Error(`No object named '${objectName}' was found.`);
100
+ }
101
+ return object;
102
+ }
103
+ throw new Error(`Unknown resource URI: ${uri}`);
104
+ }
105
+ function buildReadHandler(context, getCachedValue) {
106
+ return async (uri) => ({
107
+ contents: [
108
+ {
109
+ uri: uri.href,
110
+ mimeType: "application/json",
111
+ text: buildResourceText(await readResourcePayload(uri.href, context, getCachedValue)),
112
+ },
113
+ ],
114
+ });
115
+ }
116
+ export function registerResources(server, context) {
117
+ const getCachedValue = createListingCache(RESOURCE_LIST_TTL_MS);
118
+ const readHandler = buildReadHandler(context, getCachedValue);
119
+ server.registerResource("server_config", "mssql://config/server", {
120
+ title: "Server Config",
121
+ description: "Server configuration, limits, and enabled tools.",
122
+ mimeType: "application/json",
123
+ }, readHandler);
124
+ server.registerResource("prompt_catalog", "mssql://config/prompts", {
125
+ title: "Prompt Catalog",
126
+ description: "Available prompt templates exposed by this server.",
127
+ mimeType: "application/json",
128
+ }, readHandler);
129
+ for (const databaseName of context.allowedDatabases) {
130
+ server.registerResource(`${databaseName}_tables`, `mssql://database/${encodeURIComponent(databaseName)}/tables`, {
131
+ title: `${databaseName} Tables`,
132
+ description: `Base tables available in database ${databaseName}.`,
133
+ mimeType: "application/json",
134
+ }, readHandler);
135
+ server.registerResource(`${databaseName}_objects`, `mssql://database/${encodeURIComponent(databaseName)}/objects`, {
136
+ title: `${databaseName} Objects`,
137
+ description: `Tables, views, procedures, functions, and triggers available in database ${databaseName}.`,
138
+ mimeType: "application/json",
139
+ }, readHandler);
140
+ }
141
+ server.registerResource("table_schema", new ResourceTemplate(resourceTemplates[0].uriTemplate, {
142
+ list: async () => ({
143
+ resources: (await Promise.all(context.allowedDatabases.map(async (databaseName) => {
144
+ const tables = await getCachedValue(`tables:${databaseName}`, () => listDatabaseTables(databaseName));
145
+ return tables.map((table) => ({
146
+ uri: `mssql://table/${encodeURIComponent(databaseName)}/${encodeURIComponent(table.schemaName)}/${encodeURIComponent(table.tableName)}`,
147
+ name: `${databaseName}.${table.schemaName}.${table.tableName}`,
148
+ }));
149
+ }))).flat(),
150
+ }),
151
+ }), {
152
+ title: "Table Schema",
153
+ description: resourceTemplates[0].description,
154
+ mimeType: resourceTemplates[0].mimeType,
155
+ }, readHandler);
156
+ server.registerResource("object_definition", new ResourceTemplate(resourceTemplates[1].uriTemplate, {
157
+ list: async () => ({
158
+ resources: (await Promise.all(context.allowedDatabases.map(async (databaseName) => {
159
+ const objects = await getCachedValue(`objects:${databaseName}`, () => listDatabaseObjects(databaseName));
160
+ return objects.map((object) => ({
161
+ uri: `mssql://object/${encodeURIComponent(databaseName)}/${encodeURIComponent(object.schemaName)}/${encodeURIComponent(object.name)}`,
162
+ name: `${databaseName}.${object.schemaName}.${object.name}`,
163
+ }));
164
+ }))).flat(),
165
+ }),
166
+ }), {
167
+ title: "Object Definition",
168
+ description: resourceTemplates[1].description,
169
+ mimeType: resourceTemplates[1].mimeType,
170
+ }, readHandler);
171
+ }
172
+ //# sourceMappingURL=resourceRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceRegistry.js","sourceRoot":"","sources":["../src/resourceRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import sql from "mssql";
2
+ export interface DatabaseObjectSummary {
3
+ name: string;
4
+ schemaName: string;
5
+ objectType: string;
6
+ typeCode: string;
7
+ typeDescription: string;
8
+ createdAt: Date;
9
+ modifiedAt: Date;
10
+ }
11
+ export interface DatabaseObjectDescription {
12
+ name: string;
13
+ schemaName: string;
14
+ objectType: string;
15
+ typeCode: string;
16
+ typeDescription: string;
17
+ createdAt: Date;
18
+ modifiedAt: Date;
19
+ definition?: string | null;
20
+ columns: Array<{
21
+ name: string;
22
+ dataType: string;
23
+ maxLength: number;
24
+ precision: number;
25
+ scale: number;
26
+ isNullable: boolean;
27
+ isIdentity: boolean;
28
+ defaultValue: string | null;
29
+ }>;
30
+ indexes: Array<{
31
+ name: string;
32
+ type: string;
33
+ isUnique: boolean;
34
+ columns: string[];
35
+ }>;
36
+ }
37
+ export declare function listDatabaseTables(databaseName?: string, schemaName?: string): Promise<sql.IRecordSet<any>>;
38
+ export declare function describeTableSchema(tableName: string, databaseName?: string, schemaName?: string): Promise<sql.IRecordSet<any>>;
39
+ export declare function listDatabaseObjects(databaseName?: string, objectTypes?: string[], schemaName?: string): Promise<DatabaseObjectSummary[]>;
40
+ export declare function describeDatabaseObject(objectName: string, databaseName?: string, schemaName?: string, objectTypes?: string[]): Promise<DatabaseObjectDescription | null>;
41
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAIxB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,wBAAsB,kBAAkB,CACtC,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,gCAuBpB;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,gCA8BpB;AAED,wBAAsB,mBAAmB,CACvC,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAwClC;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAoJ3C"}
package/dist/schema.js ADDED
@@ -0,0 +1,211 @@
1
+ import sql from "mssql";
2
+ import { getSqlRequest } from "./db.js";
3
+ import { getFriendlyObjectType, getObjectTypeCodes } from "./sql.js";
4
+ export async function listDatabaseTables(databaseName, schemaName) {
5
+ const { request, error } = await getSqlRequest(databaseName);
6
+ if (error) {
7
+ throw new Error(error);
8
+ }
9
+ if (schemaName) {
10
+ request.input("schemaName", sql.NVarChar, schemaName);
11
+ }
12
+ const schemaFilter = schemaName ? "AND TABLE_SCHEMA = @schemaName" : "";
13
+ const result = await request.query(`
14
+ SELECT
15
+ TABLE_SCHEMA AS schemaName,
16
+ TABLE_NAME AS tableName
17
+ FROM INFORMATION_SCHEMA.TABLES
18
+ WHERE TABLE_TYPE = 'BASE TABLE'
19
+ ${schemaFilter}
20
+ ORDER BY TABLE_SCHEMA, TABLE_NAME
21
+ `);
22
+ return result.recordset;
23
+ }
24
+ export async function describeTableSchema(tableName, databaseName, schemaName) {
25
+ const { request, error } = await getSqlRequest(databaseName);
26
+ if (error) {
27
+ throw new Error(error);
28
+ }
29
+ request.input("tableName", sql.NVarChar, tableName);
30
+ if (schemaName) {
31
+ request.input("schemaName", sql.NVarChar, schemaName);
32
+ }
33
+ const schemaFilter = schemaName ? "AND c.TABLE_SCHEMA = @schemaName" : "";
34
+ const result = await request.query(`
35
+ SELECT
36
+ c.TABLE_SCHEMA AS schemaName,
37
+ c.COLUMN_NAME AS name,
38
+ c.DATA_TYPE AS type,
39
+ c.IS_NULLABLE AS isNullable,
40
+ c.COLUMN_DEFAULT AS defaultValue,
41
+ c.CHARACTER_MAXIMUM_LENGTH AS maxLength,
42
+ c.NUMERIC_PRECISION AS numericPrecision,
43
+ c.NUMERIC_SCALE AS numericScale
44
+ FROM INFORMATION_SCHEMA.COLUMNS c
45
+ WHERE c.TABLE_NAME = @tableName
46
+ ${schemaFilter}
47
+ ORDER BY c.ORDINAL_POSITION
48
+ `);
49
+ return result.recordset;
50
+ }
51
+ export async function listDatabaseObjects(databaseName, objectTypes, schemaName) {
52
+ const { request, error } = await getSqlRequest(databaseName);
53
+ if (error) {
54
+ throw new Error(error);
55
+ }
56
+ const typeCodes = getObjectTypeCodes(objectTypes);
57
+ const typePlaceholders = typeCodes
58
+ .map((code, index) => {
59
+ const parameterName = `typeCode${index}`;
60
+ request.input(parameterName, sql.NVarChar, code);
61
+ return `@${parameterName}`;
62
+ })
63
+ .join(", ");
64
+ if (schemaName) {
65
+ request.input("schemaName", sql.NVarChar, schemaName);
66
+ }
67
+ const schemaFilter = schemaName ? "AND s.name = @schemaName" : "";
68
+ const result = await request.query(`
69
+ SELECT
70
+ o.name,
71
+ s.name AS schemaName,
72
+ o.type AS typeCode,
73
+ o.type_desc AS typeDescription,
74
+ o.create_date AS createdAt,
75
+ o.modify_date AS modifiedAt
76
+ FROM sys.objects o
77
+ INNER JOIN sys.schemas s ON s.schema_id = o.schema_id
78
+ WHERE o.is_ms_shipped = 0
79
+ AND o.type IN (${typePlaceholders})
80
+ ${schemaFilter}
81
+ ORDER BY s.name, o.name
82
+ `);
83
+ return result.recordset.map((row) => ({
84
+ ...row,
85
+ objectType: getFriendlyObjectType(row.typeCode),
86
+ }));
87
+ }
88
+ export async function describeDatabaseObject(objectName, databaseName, schemaName, objectTypes) {
89
+ const { request, error } = await getSqlRequest(databaseName);
90
+ if (error) {
91
+ throw new Error(error);
92
+ }
93
+ request.input("objectName", sql.NVarChar, objectName);
94
+ if (schemaName) {
95
+ request.input("schemaName", sql.NVarChar, schemaName);
96
+ }
97
+ let typeFilter = "";
98
+ if (objectTypes && objectTypes.length > 0) {
99
+ const typeCodes = getObjectTypeCodes(objectTypes);
100
+ const typePlaceholders = typeCodes
101
+ .map((code, index) => {
102
+ const parameterName = `describeTypeCode${index}`;
103
+ request.input(parameterName, sql.NVarChar, code);
104
+ return `@${parameterName}`;
105
+ })
106
+ .join(", ");
107
+ typeFilter = `AND o.type IN (${typePlaceholders})`;
108
+ }
109
+ const schemaFilter = schemaName ? "AND s.name = @schemaName" : "";
110
+ const objectResult = await request.query(`
111
+ SELECT TOP (2)
112
+ o.object_id AS objectId,
113
+ o.name,
114
+ s.name AS schemaName,
115
+ o.type AS typeCode,
116
+ o.type_desc AS typeDescription,
117
+ o.create_date AS createdAt,
118
+ o.modify_date AS modifiedAt,
119
+ sm.definition
120
+ FROM sys.objects o
121
+ INNER JOIN sys.schemas s ON s.schema_id = o.schema_id
122
+ LEFT JOIN sys.sql_modules sm ON sm.object_id = o.object_id
123
+ WHERE o.is_ms_shipped = 0
124
+ AND o.name = @objectName
125
+ ${schemaFilter}
126
+ ${typeFilter}
127
+ ORDER BY s.name, o.type, o.name
128
+ `);
129
+ const objectRows = objectResult.recordset;
130
+ if (objectRows.length > 1) {
131
+ const matches = objectRows
132
+ .map((row) => `${row.schemaName}.${row.name} (${getFriendlyObjectType(row.typeCode)})`)
133
+ .join(", ");
134
+ throw new Error(`Multiple objects named '${objectName}' matched the request. Specify schemaName or objectTypes to disambiguate. Matches: ${matches}.`);
135
+ }
136
+ const objectRow = objectRows[0];
137
+ if (!objectRow) {
138
+ return null;
139
+ }
140
+ request.input("objectId", sql.Int, objectRow.objectId);
141
+ const detailsResult = await request.query(`
142
+ SELECT
143
+ c.name,
144
+ t.name AS dataType,
145
+ c.max_length AS maxLength,
146
+ c.precision,
147
+ c.scale,
148
+ c.is_nullable AS isNullable,
149
+ c.is_identity AS isIdentity,
150
+ dc.definition AS defaultValue
151
+ FROM sys.columns c
152
+ INNER JOIN sys.types t ON t.user_type_id = c.user_type_id
153
+ LEFT JOIN sys.default_constraints dc
154
+ ON dc.parent_object_id = c.object_id
155
+ AND dc.parent_column_id = c.column_id
156
+ WHERE c.object_id = @objectId
157
+ ORDER BY c.column_id;
158
+
159
+ SELECT
160
+ i.name,
161
+ i.type_desc AS type,
162
+ i.is_unique AS isUnique,
163
+ c.name AS columnName,
164
+ ic.key_ordinal AS keyOrdinal
165
+ FROM sys.indexes i
166
+ INNER JOIN sys.index_columns ic
167
+ ON ic.object_id = i.object_id
168
+ AND ic.index_id = i.index_id
169
+ INNER JOIN sys.columns c
170
+ ON c.object_id = ic.object_id
171
+ AND c.column_id = ic.column_id
172
+ WHERE i.object_id = @objectId
173
+ AND i.is_hypothetical = 0
174
+ AND i.name IS NOT NULL
175
+ ORDER BY i.name, ic.key_ordinal
176
+ `);
177
+ const detailRecordsets = Array.isArray(detailsResult.recordsets)
178
+ ? detailsResult.recordsets
179
+ : [];
180
+ const columnsRecordset = (Array.isArray(detailRecordsets[0])
181
+ ? detailRecordsets[0]
182
+ : []);
183
+ const indexesRecordset = (Array.isArray(detailRecordsets[1])
184
+ ? detailRecordsets[1]
185
+ : []);
186
+ const indexes = new Map();
187
+ for (const row of indexesRecordset) {
188
+ if (!indexes.has(row.name)) {
189
+ indexes.set(row.name, {
190
+ name: row.name,
191
+ type: row.type,
192
+ isUnique: row.isUnique,
193
+ columns: [],
194
+ });
195
+ }
196
+ indexes.get(row.name)?.columns.push(row.columnName);
197
+ }
198
+ return {
199
+ name: objectRow.name,
200
+ schemaName: objectRow.schemaName,
201
+ objectType: getFriendlyObjectType(objectRow.typeCode),
202
+ typeCode: objectRow.typeCode,
203
+ typeDescription: objectRow.typeDescription,
204
+ createdAt: objectRow.createdAt,
205
+ modifiedAt: objectRow.modifiedAt,
206
+ definition: objectRow.definition,
207
+ columns: columnsRecordset,
208
+ indexes: [...indexes.values()],
209
+ };
210
+ }
211
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/sql.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare function isSafeSqlIdentifier(value: string): boolean;
2
+ export declare function assertSafeSqlIdentifier(value: string, label?: string): void;
3
+ export declare function quoteIdentifier(value: string): string;
4
+ export declare function buildQualifiedName(objectName: string, schemaName?: string): string;
5
+ export declare function getFriendlyObjectType(typeCode: string): string;
6
+ export declare function getObjectTypeCodes(objectTypes?: string[]): string[];
7
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAWA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM1D;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,KAAK,SAAe,GACnB,IAAI,CAIN;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAQR;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmB9D;AAED,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA0BnE"}
package/dist/sql.js ADDED
@@ -0,0 +1,73 @@
1
+ function containsControlCharacters(value) {
2
+ for (const character of value) {
3
+ const codePoint = character.charCodeAt(0);
4
+ if (codePoint < 32 || codePoint === 127) {
5
+ return true;
6
+ }
7
+ }
8
+ return false;
9
+ }
10
+ export function isSafeSqlIdentifier(value) {
11
+ return (typeof value === "string" &&
12
+ value.trim().length > 0 &&
13
+ !containsControlCharacters(value));
14
+ }
15
+ export function assertSafeSqlIdentifier(value, label = "identifier") {
16
+ if (!isSafeSqlIdentifier(value)) {
17
+ throw new Error(`Invalid ${label}.`);
18
+ }
19
+ }
20
+ export function quoteIdentifier(value) {
21
+ assertSafeSqlIdentifier(value);
22
+ return `[${value.replace(/\]/g, "]]")}]`;
23
+ }
24
+ export function buildQualifiedName(objectName, schemaName) {
25
+ assertSafeSqlIdentifier(objectName, "object name");
26
+ if (!schemaName) {
27
+ return quoteIdentifier(objectName);
28
+ }
29
+ assertSafeSqlIdentifier(schemaName, "schema name");
30
+ return `${quoteIdentifier(schemaName)}.${quoteIdentifier(objectName)}`;
31
+ }
32
+ export function getFriendlyObjectType(typeCode) {
33
+ switch (typeCode) {
34
+ case "U":
35
+ return "table";
36
+ case "V":
37
+ return "view";
38
+ case "P":
39
+ return "procedure";
40
+ case "FN":
41
+ case "IF":
42
+ case "TF":
43
+ case "FS":
44
+ case "FT":
45
+ return "function";
46
+ case "TR":
47
+ return "trigger";
48
+ default:
49
+ return "object";
50
+ }
51
+ }
52
+ export function getObjectTypeCodes(objectTypes) {
53
+ if (!objectTypes || objectTypes.length === 0) {
54
+ return ["U", "V", "P", "FN", "IF", "TF", "FS", "FT", "TR"];
55
+ }
56
+ const typeMap = {
57
+ table: ["U"],
58
+ view: ["V"],
59
+ procedure: ["P"],
60
+ function: ["FN", "IF", "TF", "FS", "FT"],
61
+ trigger: ["TR"],
62
+ };
63
+ const resolvedCodes = objectTypes.flatMap((objectType) => {
64
+ const normalized = objectType.trim().toLowerCase();
65
+ const codes = typeMap[normalized];
66
+ if (!codes) {
67
+ throw new Error(`Unsupported object type '${objectType}'. Expected one of: ${Object.keys(typeMap).join(", ")}.`);
68
+ }
69
+ return codes;
70
+ });
71
+ return [...new Set(resolvedCodes)];
72
+ }
73
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
2
+ import { z } from "zod";
3
+ export interface RunnableTool {
4
+ name: string;
5
+ description?: string;
6
+ run(params: unknown): Promise<unknown>;
7
+ }
8
+ export interface ToolDefinition {
9
+ tool: RunnableTool;
10
+ inputSchema: z.ZodType;
11
+ annotations: ToolAnnotations;
12
+ readOnly: boolean;
13
+ }
14
+ export declare const toolDefinitions: ToolDefinition[];
15
+ export declare function getAvailableTools(isReadOnly: boolean): ToolDefinition[];
16
+ //# sourceMappingURL=toolRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolRegistry.d.ts","sourceRoot":"","sources":["../src/toolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC;IACvB,WAAW,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;CACnB;AA0DD,eAAO,MAAM,eAAe,EAAE,cAAc,EAmY3C,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,OAAO,GAAG,cAAc,EAAE,CAIvE"}