@eamonboyle/mssql-mcp 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -7
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -1
- package/dist/db.d.ts +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +1 -1
- package/dist/db.js.map +1 -1
- package/dist/index.js +356 -44
- package/dist/index.js.map +1 -1
- package/dist/mcpResults.d.ts +49 -0
- package/dist/mcpResults.d.ts.map +1 -0
- package/dist/mcpResults.js +246 -0
- package/dist/mcpResults.js.map +1 -0
- package/dist/promptRegistry.d.ts.map +1 -1
- package/dist/promptRegistry.js +6 -1
- package/dist/promptRegistry.js.map +1 -1
- package/dist/resourceRegistry.d.ts +2 -0
- package/dist/resourceRegistry.d.ts.map +1 -1
- package/dist/resourceRegistry.js +149 -10
- package/dist/resourceRegistry.js.map +1 -1
- package/dist/schema.d.ts +16 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +180 -1
- package/dist/schema.js.map +1 -1
- package/dist/serverState.d.ts +28 -0
- package/dist/serverState.d.ts.map +1 -0
- package/dist/serverState.js +99 -0
- package/dist/serverState.js.map +1 -0
- package/dist/toolRegistry.d.ts +4 -0
- package/dist/toolRegistry.d.ts.map +1 -1
- package/dist/toolRegistry.js +210 -64
- package/dist/toolRegistry.js.map +1 -1
- package/dist/tools/AnalyzeTableTool.d.ts +37 -0
- package/dist/tools/AnalyzeTableTool.d.ts.map +1 -0
- package/dist/tools/AnalyzeTableTool.js +81 -0
- package/dist/tools/AnalyzeTableTool.js.map +1 -0
- package/dist/tools/DeleteDataTool.d.ts.map +1 -1
- package/dist/tools/DeleteDataTool.js +4 -1
- package/dist/tools/DeleteDataTool.js.map +1 -1
- package/dist/tools/DescribeRelationshipsTool.d.ts +20 -0
- package/dist/tools/DescribeRelationshipsTool.d.ts.map +1 -0
- package/dist/tools/DescribeRelationshipsTool.js +24 -0
- package/dist/tools/DescribeRelationshipsTool.js.map +1 -0
- package/dist/tools/ListDatabasesTool.d.ts +16 -0
- package/dist/tools/ListDatabasesTool.d.ts.map +1 -0
- package/dist/tools/ListDatabasesTool.js +26 -0
- package/dist/tools/ListDatabasesTool.js.map +1 -0
- package/dist/tools/ListForeignKeysTool.d.ts +19 -0
- package/dist/tools/ListForeignKeysTool.d.ts.map +1 -0
- package/dist/tools/ListForeignKeysTool.js +24 -0
- package/dist/tools/ListForeignKeysTool.js.map +1 -0
- package/dist/tools/PreviewDeleteTool.d.ts +28 -0
- package/dist/tools/PreviewDeleteTool.d.ts.map +1 -0
- package/dist/tools/PreviewDeleteTool.js +31 -0
- package/dist/tools/PreviewDeleteTool.js.map +1 -0
- package/dist/tools/PreviewUpdateTool.d.ts +30 -0
- package/dist/tools/PreviewUpdateTool.d.ts.map +1 -0
- package/dist/tools/PreviewUpdateTool.js +34 -0
- package/dist/tools/PreviewUpdateTool.js.map +1 -0
- package/dist/tools/UpdateDataTool.d.ts +1 -0
- package/dist/tools/UpdateDataTool.d.ts.map +1 -1
- package/dist/tools/UpdateDataTool.js +6 -3
- package/dist/tools/UpdateDataTool.js.map +1 -1
- package/dist/writePreview.d.ts +20 -0
- package/dist/writePreview.d.ts.map +1 -0
- package/dist/writePreview.js +27 -0
- package/dist/writePreview.js.map +1 -0
- package/dist/writePreviewGrant.d.ts +18 -0
- package/dist/writePreviewGrant.d.ts.map +1 -0
- package/dist/writePreviewGrant.js +71 -0
- package/dist/writePreviewGrant.js.map +1 -0
- package/dist/writePreviewGrantStore.d.ts +10 -0
- package/dist/writePreviewGrantStore.d.ts.map +1 -0
- package/dist/writePreviewGrantStore.js +47 -0
- package/dist/writePreviewGrantStore.js.map +1 -0
- package/package.json +2 -2
- package/dist/__tests__/ExplainQueryTool.test.d.ts +0 -2
- package/dist/__tests__/ExplainQueryTool.test.d.ts.map +0 -1
- package/dist/__tests__/ExplainQueryTool.test.js +0 -96
- package/dist/__tests__/ExplainQueryTool.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -29
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/db.test.d.ts +0 -2
- package/dist/__tests__/db.test.d.ts.map +0 -1
- package/dist/__tests__/db.test.js +0 -204
- package/dist/__tests__/db.test.js.map +0 -1
- package/dist/__tests__/promptRegistry.test.d.ts +0 -2
- package/dist/__tests__/promptRegistry.test.d.ts.map +0 -1
- package/dist/__tests__/promptRegistry.test.js +0 -40
- package/dist/__tests__/promptRegistry.test.js.map +0 -1
- package/dist/__tests__/resourceRegistry.test.d.ts +0 -2
- package/dist/__tests__/resourceRegistry.test.d.ts.map +0 -1
- package/dist/__tests__/resourceRegistry.test.js +0 -40
- package/dist/__tests__/resourceRegistry.test.js.map +0 -1
- package/dist/__tests__/schema.test.d.ts +0 -2
- package/dist/__tests__/schema.test.d.ts.map +0 -1
- package/dist/__tests__/schema.test.js +0 -130
- package/dist/__tests__/schema.test.js.map +0 -1
- package/dist/__tests__/sql.test.d.ts +0 -2
- package/dist/__tests__/sql.test.d.ts.map +0 -1
- package/dist/__tests__/sql.test.js +0 -35
- package/dist/__tests__/sql.test.js.map +0 -1
- package/dist/__tests__/toolRegistry.test.d.ts +0 -2
- package/dist/__tests__/toolRegistry.test.d.ts.map +0 -1
- package/dist/__tests__/toolRegistry.test.js +0 -47
- package/dist/__tests__/toolRegistry.test.js.map +0 -1
- package/dist/__tests__/validation.test.d.ts +0 -2
- package/dist/__tests__/validation.test.d.ts.map +0 -1
- package/dist/__tests__/validation.test.js +0 -111
- package/dist/__tests__/validation.test.js.map +0 -1
- package/dist/__tests__/writeTools.test.d.ts +0 -2
- package/dist/__tests__/writeTools.test.d.ts.map +0 -1
- package/dist/__tests__/writeTools.test.js +0 -115
- package/dist/__tests__/writeTools.test.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,70 +1,382 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createServer } from "node:http";
|
|
2
3
|
import * as dotenv from "dotenv";
|
|
3
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
5
7
|
dotenv.config();
|
|
6
|
-
import { getMaxRows, getQueryTimeoutMs } from "./config.js";
|
|
8
|
+
import { getMaxRows, getMcpHttpHost, getMcpHttpPort, getMcpTransport, getMaxWriteRows, getQueryTimeoutMs, isDdlEnabled, isWritePreviewRequired, } from "./config.js";
|
|
7
9
|
import { getAllowedDatabases } from "./db.js";
|
|
10
|
+
import { createResourceLink, createToolResult, normalizeToolResult, } from "./mcpResults.js";
|
|
8
11
|
import { registerPrompts } from "./promptRegistry.js";
|
|
9
12
|
import { registerResources } from "./resourceRegistry.js";
|
|
13
|
+
import { ServerState } from "./serverState.js";
|
|
10
14
|
import { getAvailableTools } from "./toolRegistry.js";
|
|
11
|
-
|
|
15
|
+
import { fingerprintForWriteTool } from "./writePreviewGrant.js";
|
|
16
|
+
import { writePreviewGrantStore } from "./writePreviewGrantStore.js";
|
|
17
|
+
import { previewFilteredRows } from "./writePreview.js";
|
|
18
|
+
const SERVER_VERSION = "1.3.0";
|
|
12
19
|
const SERVER_NAME = "mssql-mcp-server";
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
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
|
-
};
|
|
20
|
+
function createInstructions(isReadOnly) {
|
|
21
|
+
const baseInstructions = "Inspect schema first with list_objects, list_table, describe_object, or describe_table. Prefer read_data, search_data, analyze_table, describe_relationships, and explain_query for safe analysis. For update_data and delete_data, run preview_update or preview_delete first, then pass the returned previewToken with confirmed=true when REQUIRE_WRITE_PREVIEW is enabled (default).";
|
|
22
|
+
const readOnlyInstructions = " This server is READONLY: write and DDL tools are disabled. Never use sqlcmd, SSMS, other DB CLI tools, or terminal scripts to bypass the MCP safety model.";
|
|
23
|
+
return isReadOnly ? baseInstructions + readOnlyInstructions : baseInstructions;
|
|
35
24
|
}
|
|
36
|
-
function
|
|
25
|
+
function createServerInstance(state) {
|
|
26
|
+
const isReadOnly = process.env.READONLY === "true";
|
|
27
|
+
const allowedDatabases = getAllowedDatabases();
|
|
28
|
+
const availableTools = getAvailableTools(isReadOnly);
|
|
29
|
+
const server = new McpServer({
|
|
30
|
+
name: SERVER_NAME,
|
|
31
|
+
version: SERVER_VERSION,
|
|
32
|
+
websiteUrl: "https://github.com/eamonboyle/mssql-mcp",
|
|
33
|
+
icons: [
|
|
34
|
+
{
|
|
35
|
+
src: "https://raw.githubusercontent.com/eamonboyle/mssql-mcp/main/src/img/logo.png",
|
|
36
|
+
mimeType: "image/png",
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
}, {
|
|
40
|
+
instructions: createInstructions(isReadOnly),
|
|
41
|
+
capabilities: {
|
|
42
|
+
logging: {},
|
|
43
|
+
},
|
|
44
|
+
});
|
|
37
45
|
for (const definition of availableTools) {
|
|
38
|
-
|
|
39
|
-
title: definition.tool.name
|
|
46
|
+
server.registerTool(definition.tool.name, {
|
|
47
|
+
title: definition.tool.name
|
|
48
|
+
.split("_")
|
|
49
|
+
.map((part) => part[0].toUpperCase() + part.slice(1))
|
|
50
|
+
.join(" "),
|
|
40
51
|
description: definition.tool.description,
|
|
41
52
|
inputSchema: definition.inputSchema,
|
|
53
|
+
outputSchema: definition.outputSchema,
|
|
42
54
|
annotations: definition.annotations,
|
|
43
|
-
}, async (args) =>
|
|
55
|
+
}, async (args, extra) => {
|
|
56
|
+
if (definition.requiresDdl &&
|
|
57
|
+
!isDdlEnabled()) {
|
|
58
|
+
return createToolResult({
|
|
59
|
+
version: 1,
|
|
60
|
+
success: false,
|
|
61
|
+
message: "DDL tools are disabled. Set ENABLE_DDL=true to allow create_table, create_index, and drop_table.",
|
|
62
|
+
error: {
|
|
63
|
+
code: "DDL_DISABLED",
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const requestArgs = typeof args === "object" && args !== null
|
|
68
|
+
? { ...args }
|
|
69
|
+
: {};
|
|
70
|
+
if (definition.requiresConfirmation && requestArgs.confirmed !== true) {
|
|
71
|
+
try {
|
|
72
|
+
const elicited = await server.server.elicitInput({
|
|
73
|
+
mode: "form",
|
|
74
|
+
message: `Confirm ${definition.tool.name} after reviewing its preview and impact.`,
|
|
75
|
+
requestedSchema: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
confirmed: {
|
|
79
|
+
type: "boolean",
|
|
80
|
+
title: "Confirmed",
|
|
81
|
+
description: "I reviewed the preview and want to proceed with this operation.",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
required: ["confirmed"],
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
if (elicited.action !== "accept" || !elicited.content?.confirmed) {
|
|
88
|
+
if (definition.writePreviewTool && isWritePreviewRequired()) {
|
|
89
|
+
return createToolResult({
|
|
90
|
+
version: 1,
|
|
91
|
+
success: false,
|
|
92
|
+
message: `Confirmation canceled. Call ${definition.writePreviewTool}, then run ${definition.tool.name} with the returned previewToken and confirmed=true.`,
|
|
93
|
+
error: { code: "PREVIEW_REQUIRED" },
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (definition.writePreviewTool) {
|
|
97
|
+
return createToolResult({
|
|
98
|
+
version: 1,
|
|
99
|
+
success: false,
|
|
100
|
+
message: `Confirmation canceled. Retry with confirmed=true after reviewing ${definition.writePreviewTool}.`,
|
|
101
|
+
error: { code: "CONFIRMATION_REQUIRED" },
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return createToolResult({
|
|
105
|
+
version: 1,
|
|
106
|
+
success: false,
|
|
107
|
+
message: "Confirmation canceled. Retry with confirmed=true after reviewing the operation.",
|
|
108
|
+
error: { code: "CONFIRMATION_REQUIRED" },
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
requestArgs.confirmed = true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
if (definition.writePreviewTool && isWritePreviewRequired()) {
|
|
115
|
+
return createToolResult({
|
|
116
|
+
version: 1,
|
|
117
|
+
success: false,
|
|
118
|
+
message: `Interactive confirmation is unavailable. Call ${definition.writePreviewTool}, then run ${definition.tool.name} with previewToken and confirmed=true.`,
|
|
119
|
+
error: { code: "PREVIEW_REQUIRED" },
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (definition.writePreviewTool) {
|
|
123
|
+
return createToolResult({
|
|
124
|
+
version: 1,
|
|
125
|
+
success: false,
|
|
126
|
+
message: `Interactive confirmation is unavailable. Retry with confirmed=true after reviewing ${definition.writePreviewTool}.`,
|
|
127
|
+
error: { code: "CONFIRMATION_REQUIRED" },
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return createToolResult({
|
|
131
|
+
version: 1,
|
|
132
|
+
success: false,
|
|
133
|
+
message: "Interactive confirmation is unavailable. Retry with confirmed=true after reviewing the operation.",
|
|
134
|
+
error: { code: "CONFIRMATION_REQUIRED" },
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (definition.tool.name === "update_data" || definition.tool.name === "delete_data") {
|
|
139
|
+
const preview = await previewFilteredRows({
|
|
140
|
+
tableName: String(requestArgs.tableName),
|
|
141
|
+
schemaName: typeof requestArgs.schemaName === "string"
|
|
142
|
+
? requestArgs.schemaName
|
|
143
|
+
: undefined,
|
|
144
|
+
filters: requestArgs.filters ?? [],
|
|
145
|
+
databaseName: typeof requestArgs.databaseName === "string"
|
|
146
|
+
? requestArgs.databaseName
|
|
147
|
+
: undefined,
|
|
148
|
+
limit: 1,
|
|
149
|
+
}).catch((error) => ({
|
|
150
|
+
affectedRowCount: -1,
|
|
151
|
+
rows: [],
|
|
152
|
+
query: "",
|
|
153
|
+
countQuery: "",
|
|
154
|
+
previewError: String(error),
|
|
155
|
+
}));
|
|
156
|
+
if ("previewError" in preview) {
|
|
157
|
+
return createToolResult({
|
|
158
|
+
version: 1,
|
|
159
|
+
success: false,
|
|
160
|
+
message: `Failed to validate write impact: ${preview.previewError}`,
|
|
161
|
+
error: {
|
|
162
|
+
code: "WRITE_PREVIEW_FAILED",
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (preview.affectedRowCount > getMaxWriteRows()) {
|
|
167
|
+
return createToolResult({
|
|
168
|
+
version: 1,
|
|
169
|
+
success: false,
|
|
170
|
+
message: `Write exceeds MAX_WRITE_ROWS (${getMaxWriteRows()}). Matching rows: ${preview.affectedRowCount}. Narrow the filters or raise MAX_WRITE_ROWS.`,
|
|
171
|
+
error: {
|
|
172
|
+
code: "WRITE_LIMIT_EXCEEDED",
|
|
173
|
+
},
|
|
174
|
+
data: {
|
|
175
|
+
affectedRowCount: preview.affectedRowCount,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (isWritePreviewRequired()) {
|
|
180
|
+
const writeName = definition.tool.name;
|
|
181
|
+
const fingerprint = fingerprintForWriteTool(writeName, requestArgs);
|
|
182
|
+
const previewToken = typeof requestArgs.previewToken === "string" ? requestArgs.previewToken.trim() : "";
|
|
183
|
+
if (!writePreviewGrantStore.consume(previewToken, fingerprint, writeName)) {
|
|
184
|
+
return createToolResult({
|
|
185
|
+
version: 1,
|
|
186
|
+
success: false,
|
|
187
|
+
message: `Invalid or expired write preview token. Call ${writeName === "update_data" ? "preview_update" : "preview_delete"} with the same table, filters${writeName === "update_data" ? ", and updates" : ""}, then pass the returned previewToken with confirmed=true.`,
|
|
188
|
+
error: { code: "PREVIEW_TOKEN_INVALID" },
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (definition.tool.name === "insert_data") {
|
|
194
|
+
const rows = Array.isArray(requestArgs.data) ? requestArgs.data.length : 1;
|
|
195
|
+
if (rows > getMaxWriteRows()) {
|
|
196
|
+
return createToolResult({
|
|
197
|
+
version: 1,
|
|
198
|
+
success: false,
|
|
199
|
+
message: `Insert exceeds MAX_WRITE_ROWS (${getMaxWriteRows()}). Requested rows: ${rows}.`,
|
|
200
|
+
error: {
|
|
201
|
+
code: "WRITE_LIMIT_EXCEEDED",
|
|
202
|
+
},
|
|
203
|
+
data: {
|
|
204
|
+
requestedRows: rows,
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (definition.tool.name === "explain_query" &&
|
|
210
|
+
extra._meta?.progressToken !== undefined) {
|
|
211
|
+
await extra.sendNotification({
|
|
212
|
+
method: "notifications/progress",
|
|
213
|
+
params: {
|
|
214
|
+
progressToken: extra._meta.progressToken,
|
|
215
|
+
progress: 1,
|
|
216
|
+
total: 2,
|
|
217
|
+
message: "Generating estimated execution plan",
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
const rawResult = await definition.tool.run(requestArgs);
|
|
222
|
+
if ((definition.tool.name === "preview_update" ||
|
|
223
|
+
definition.tool.name === "preview_delete") &&
|
|
224
|
+
isWritePreviewRequired() &&
|
|
225
|
+
typeof rawResult === "object" &&
|
|
226
|
+
rawResult !== null &&
|
|
227
|
+
rawResult.success === true) {
|
|
228
|
+
const fingerprint = fingerprintForWriteTool(definition.tool.name, requestArgs);
|
|
229
|
+
const writeTool = definition.tool.name === "preview_update" ? "update_data" : "delete_data";
|
|
230
|
+
const previewToken = writePreviewGrantStore.issue(fingerprint, writeTool);
|
|
231
|
+
const withData = rawResult;
|
|
232
|
+
if (typeof withData.data === "object" && withData.data !== null && !Array.isArray(withData.data)) {
|
|
233
|
+
withData.data = { ...withData.data, previewToken };
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
withData.data = { preview: withData.data, previewToken };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const payload = normalizeToolResult(rawResult, `${definition.tool.name} completed.`);
|
|
240
|
+
const extraContent = [];
|
|
241
|
+
if (definition.tool.name === "explain_query" && typeof rawResult === "object" && rawResult) {
|
|
242
|
+
const planXml = typeof rawResult.planXml === "string"
|
|
243
|
+
? rawResult.planXml
|
|
244
|
+
: undefined;
|
|
245
|
+
const databaseName = typeof requestArgs.databaseName === "string"
|
|
246
|
+
? requestArgs.databaseName
|
|
247
|
+
: undefined;
|
|
248
|
+
if (planXml) {
|
|
249
|
+
const plan = state.storeQueryPlan(databaseName, String(requestArgs.query ?? ""), planXml);
|
|
250
|
+
extraContent.push(createResourceLink(`mssql://query-plan/${plan.id}`, "query-plan", "Execution Plan", "Stored estimated execution plan for this query.", "application/json"));
|
|
251
|
+
payload.meta = {
|
|
252
|
+
...(payload.meta ?? {}),
|
|
253
|
+
queryPlanUri: `mssql://query-plan/${plan.id}`,
|
|
254
|
+
};
|
|
255
|
+
await server.server.sendResourceListChanged();
|
|
256
|
+
await server.server.sendResourceUpdated({
|
|
257
|
+
uri: `mssql://query-plan/${plan.id}`,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if ((definition.tool.name === "read_data" || definition.tool.name === "search_data") &&
|
|
262
|
+
payload.success) {
|
|
263
|
+
const data = payload.data;
|
|
264
|
+
const recordCount = Array.isArray(data)
|
|
265
|
+
? data.length
|
|
266
|
+
: Array.isArray(data?.data)
|
|
267
|
+
? data.data.length
|
|
268
|
+
: 0;
|
|
269
|
+
if (recordCount >= 25 || payload.truncated) {
|
|
270
|
+
const result = state.storeQueryResult(typeof requestArgs.databaseName === "string"
|
|
271
|
+
? requestArgs.databaseName
|
|
272
|
+
: undefined, definition.tool.name, data);
|
|
273
|
+
extraContent.push(createResourceLink(`mssql://query-result/${result.id}`, "query-result", "Query Result", "Stored query result for larger result-grid rendering.", "application/json"));
|
|
274
|
+
payload.meta = {
|
|
275
|
+
...(payload.meta ?? {}),
|
|
276
|
+
queryResultUri: `mssql://query-result/${result.id}`,
|
|
277
|
+
};
|
|
278
|
+
await server.server.sendResourceListChanged();
|
|
279
|
+
await server.server.sendResourceUpdated({
|
|
280
|
+
uri: `mssql://query-result/${result.id}`,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (definition.tool.name === "explain_query" &&
|
|
285
|
+
extra._meta?.progressToken !== undefined) {
|
|
286
|
+
await extra.sendNotification({
|
|
287
|
+
method: "notifications/progress",
|
|
288
|
+
params: {
|
|
289
|
+
progressToken: extra._meta.progressToken,
|
|
290
|
+
progress: 2,
|
|
291
|
+
total: 2,
|
|
292
|
+
message: "Execution plan ready",
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
return createToolResult(payload, extraContent);
|
|
297
|
+
});
|
|
44
298
|
}
|
|
299
|
+
registerResources(server, {
|
|
300
|
+
serverName: SERVER_NAME,
|
|
301
|
+
serverVersion: SERVER_VERSION,
|
|
302
|
+
isReadOnly,
|
|
303
|
+
allowedDatabases,
|
|
304
|
+
toolNames: availableTools.map((tool) => tool.tool.name),
|
|
305
|
+
maxRows: getMaxRows(),
|
|
306
|
+
queryTimeoutMs: getQueryTimeoutMs(),
|
|
307
|
+
state,
|
|
308
|
+
});
|
|
309
|
+
registerPrompts(server, { isReadOnly });
|
|
310
|
+
return server;
|
|
45
311
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
312
|
+
async function readRequestBody(req) {
|
|
313
|
+
const chunks = [];
|
|
314
|
+
for await (const chunk of req) {
|
|
315
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
316
|
+
}
|
|
317
|
+
if (chunks.length === 0) {
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
const raw = Buffer.concat(chunks).toString("utf8").trim();
|
|
321
|
+
if (!raw) {
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
return JSON.parse(raw);
|
|
325
|
+
}
|
|
326
|
+
async function handleHttpRequest(req, res) {
|
|
327
|
+
const server = createServerInstance(new ServerState());
|
|
328
|
+
const transport = new StreamableHTTPServerTransport({
|
|
329
|
+
sessionIdGenerator: undefined,
|
|
330
|
+
});
|
|
58
331
|
try {
|
|
59
|
-
const transport = new StdioServerTransport();
|
|
60
332
|
await server.connect(transport);
|
|
333
|
+
const parsedBody = req.method === "POST" ? await readRequestBody(req) : undefined;
|
|
334
|
+
await transport.handleRequest(req, res, parsedBody);
|
|
61
335
|
}
|
|
62
336
|
catch (error) {
|
|
63
|
-
console.error("
|
|
64
|
-
|
|
337
|
+
console.error("HTTP transport error:", error);
|
|
338
|
+
if (!res.headersSent) {
|
|
339
|
+
res.writeHead(500, { "content-type": "application/json" });
|
|
340
|
+
res.end(JSON.stringify({
|
|
341
|
+
jsonrpc: "2.0",
|
|
342
|
+
error: {
|
|
343
|
+
code: -32603,
|
|
344
|
+
message: "Internal server error",
|
|
345
|
+
},
|
|
346
|
+
id: null,
|
|
347
|
+
}));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
await transport.close().catch(() => undefined);
|
|
352
|
+
await server.close().catch(() => undefined);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
async function runStdioServer() {
|
|
356
|
+
const server = createServerInstance(new ServerState());
|
|
357
|
+
const transport = new StdioServerTransport();
|
|
358
|
+
await server.connect(transport);
|
|
359
|
+
}
|
|
360
|
+
async function runHttpServer() {
|
|
361
|
+
const host = getMcpHttpHost();
|
|
362
|
+
const port = getMcpHttpPort();
|
|
363
|
+
const httpServer = createServer((req, res) => {
|
|
364
|
+
void handleHttpRequest(req, res);
|
|
365
|
+
});
|
|
366
|
+
await new Promise((resolve, reject) => {
|
|
367
|
+
httpServer.once("error", reject);
|
|
368
|
+
httpServer.listen(port, host, () => resolve());
|
|
369
|
+
});
|
|
370
|
+
console.error(`MCP Streamable HTTP server listening on http://${host}:${port}`);
|
|
371
|
+
}
|
|
372
|
+
async function main() {
|
|
373
|
+
if (getMcpTransport() === "http") {
|
|
374
|
+
await runHttpServer();
|
|
375
|
+
return;
|
|
65
376
|
}
|
|
377
|
+
await runStdioServer();
|
|
66
378
|
}
|
|
67
|
-
|
|
379
|
+
main().catch((error) => {
|
|
68
380
|
console.error("Fatal error running server:", error);
|
|
69
381
|
process.exit(1);
|
|
70
382
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { CallToolResult, ContentBlock, ResourceLink } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export declare const toolResultOutputSchema: {
|
|
4
|
+
version: z.ZodLiteral<1>;
|
|
5
|
+
success: z.ZodBoolean;
|
|
6
|
+
message: z.ZodString;
|
|
7
|
+
data: z.ZodOptional<z.ZodUnknown>;
|
|
8
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
9
|
+
warnings: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
10
|
+
error: z.ZodOptional<z.ZodObject<{
|
|
11
|
+
code: z.ZodString;
|
|
12
|
+
details: z.ZodOptional<z.ZodUnknown>;
|
|
13
|
+
}, z.core.$strip>>;
|
|
14
|
+
pagination: z.ZodOptional<z.ZodObject<{
|
|
15
|
+
returned: z.ZodNumber;
|
|
16
|
+
total: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
nextCursor: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, z.core.$strip>>;
|
|
19
|
+
truncated: z.ZodOptional<z.ZodBoolean>;
|
|
20
|
+
};
|
|
21
|
+
export interface StandardToolPayload extends Record<string, unknown> {
|
|
22
|
+
version: 1;
|
|
23
|
+
success: boolean;
|
|
24
|
+
message: string;
|
|
25
|
+
data?: unknown;
|
|
26
|
+
meta?: Record<string, unknown>;
|
|
27
|
+
warnings?: string[];
|
|
28
|
+
error?: {
|
|
29
|
+
code: string;
|
|
30
|
+
details?: unknown;
|
|
31
|
+
};
|
|
32
|
+
pagination?: {
|
|
33
|
+
returned: number;
|
|
34
|
+
total?: number;
|
|
35
|
+
nextCursor?: string;
|
|
36
|
+
};
|
|
37
|
+
truncated?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export declare function classifyToolErrorCode(raw: Record<string, unknown>, message: string, fallback?: string): string;
|
|
40
|
+
export declare function buildInlineDataAttachment(data: unknown): string;
|
|
41
|
+
export declare function createResourceLink(uri: string, name: string, title: string, description: string, mimeType?: string): ResourceLink;
|
|
42
|
+
/**
|
|
43
|
+
* JSON-serializable copy of the tool payload for MCP `structuredContent`.
|
|
44
|
+
* Required when tools declare `outputSchema` — the SDK rejects missing structured output on success.
|
|
45
|
+
*/
|
|
46
|
+
export declare function toToolStructuredContent(payload: StandardToolPayload): Record<string, unknown>;
|
|
47
|
+
export declare function createToolResult(payload: StandardToolPayload, extraContent?: ContentBlock[]): CallToolResult;
|
|
48
|
+
export declare function normalizeToolResult(rawResult: unknown, fallbackMessage: string): StandardToolPayload;
|
|
49
|
+
//# sourceMappingURL=mcpResults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpResults.d.ts","sourceRoot":"","sources":["../src/mcpResults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACrG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;CAqBV,CAAC;AAE1B,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,SAA0B,GACjC,MAAM,CAoDR;AA+BD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CA2B/D;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,SAAqB,GAC5B,YAAY,CASd;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,mBAAmB,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuBzB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,mBAAmB,EAC5B,YAAY,GAAE,YAAY,EAAO,GAChC,cAAc,CAkBhB;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,OAAO,EAClB,eAAe,EAAE,MAAM,GACtB,mBAAmB,CA4FrB"}
|