@eamonboyle/mssql-mcp 1.2.0 → 1.3.1

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 (124) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +43 -7
  3. package/dist/config.d.ts +8 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +40 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/db.d.ts +1 -0
  8. package/dist/db.d.ts.map +1 -1
  9. package/dist/db.js +1 -1
  10. package/dist/db.js.map +1 -1
  11. package/dist/index.js +356 -44
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcpResults.d.ts +49 -0
  14. package/dist/mcpResults.d.ts.map +1 -0
  15. package/dist/mcpResults.js +246 -0
  16. package/dist/mcpResults.js.map +1 -0
  17. package/dist/promptRegistry.d.ts.map +1 -1
  18. package/dist/promptRegistry.js +6 -1
  19. package/dist/promptRegistry.js.map +1 -1
  20. package/dist/resourceRegistry.d.ts +2 -0
  21. package/dist/resourceRegistry.d.ts.map +1 -1
  22. package/dist/resourceRegistry.js +149 -10
  23. package/dist/resourceRegistry.js.map +1 -1
  24. package/dist/schema.d.ts +16 -0
  25. package/dist/schema.d.ts.map +1 -1
  26. package/dist/schema.js +180 -1
  27. package/dist/schema.js.map +1 -1
  28. package/dist/serverState.d.ts +28 -0
  29. package/dist/serverState.d.ts.map +1 -0
  30. package/dist/serverState.js +99 -0
  31. package/dist/serverState.js.map +1 -0
  32. package/dist/sql.js +0 -0
  33. package/dist/toolRegistry.d.ts +4 -0
  34. package/dist/toolRegistry.d.ts.map +1 -1
  35. package/dist/toolRegistry.js +210 -64
  36. package/dist/toolRegistry.js.map +1 -1
  37. package/dist/tools/AnalyzeTableTool.d.ts +37 -0
  38. package/dist/tools/AnalyzeTableTool.d.ts.map +1 -0
  39. package/dist/tools/AnalyzeTableTool.js +81 -0
  40. package/dist/tools/AnalyzeTableTool.js.map +1 -0
  41. package/dist/tools/DeleteDataTool.d.ts.map +1 -1
  42. package/dist/tools/DeleteDataTool.js +4 -1
  43. package/dist/tools/DeleteDataTool.js.map +1 -1
  44. package/dist/tools/DescribeRelationshipsTool.d.ts +20 -0
  45. package/dist/tools/DescribeRelationshipsTool.d.ts.map +1 -0
  46. package/dist/tools/DescribeRelationshipsTool.js +24 -0
  47. package/dist/tools/DescribeRelationshipsTool.js.map +1 -0
  48. package/dist/tools/ListDatabasesTool.d.ts +16 -0
  49. package/dist/tools/ListDatabasesTool.d.ts.map +1 -0
  50. package/dist/tools/ListDatabasesTool.js +26 -0
  51. package/dist/tools/ListDatabasesTool.js.map +1 -0
  52. package/dist/tools/ListForeignKeysTool.d.ts +19 -0
  53. package/dist/tools/ListForeignKeysTool.d.ts.map +1 -0
  54. package/dist/tools/ListForeignKeysTool.js +24 -0
  55. package/dist/tools/ListForeignKeysTool.js.map +1 -0
  56. package/dist/tools/PreviewDeleteTool.d.ts +28 -0
  57. package/dist/tools/PreviewDeleteTool.d.ts.map +1 -0
  58. package/dist/tools/PreviewDeleteTool.js +31 -0
  59. package/dist/tools/PreviewDeleteTool.js.map +1 -0
  60. package/dist/tools/PreviewUpdateTool.d.ts +30 -0
  61. package/dist/tools/PreviewUpdateTool.d.ts.map +1 -0
  62. package/dist/tools/PreviewUpdateTool.js +34 -0
  63. package/dist/tools/PreviewUpdateTool.js.map +1 -0
  64. package/dist/tools/ReadDataTool.js +2 -2
  65. package/dist/tools/ReadDataTool.js.map +1 -1
  66. package/dist/tools/UpdateDataTool.d.ts +1 -0
  67. package/dist/tools/UpdateDataTool.d.ts.map +1 -1
  68. package/dist/tools/UpdateDataTool.js +6 -3
  69. package/dist/tools/UpdateDataTool.js.map +1 -1
  70. package/dist/validation.js +0 -0
  71. package/dist/writePreview.d.ts +20 -0
  72. package/dist/writePreview.d.ts.map +1 -0
  73. package/dist/writePreview.js +27 -0
  74. package/dist/writePreview.js.map +1 -0
  75. package/dist/writePreviewGrant.d.ts +18 -0
  76. package/dist/writePreviewGrant.d.ts.map +1 -0
  77. package/dist/writePreviewGrant.js +71 -0
  78. package/dist/writePreviewGrant.js.map +1 -0
  79. package/dist/writePreviewGrantStore.d.ts +10 -0
  80. package/dist/writePreviewGrantStore.d.ts.map +1 -0
  81. package/dist/writePreviewGrantStore.js +47 -0
  82. package/dist/writePreviewGrantStore.js.map +1 -0
  83. package/dist/writeSafety.js +0 -0
  84. package/package.json +6 -2
  85. package/dist/__tests__/ExplainQueryTool.test.d.ts +0 -2
  86. package/dist/__tests__/ExplainQueryTool.test.d.ts.map +0 -1
  87. package/dist/__tests__/ExplainQueryTool.test.js +0 -96
  88. package/dist/__tests__/ExplainQueryTool.test.js.map +0 -1
  89. package/dist/__tests__/config.test.d.ts +0 -2
  90. package/dist/__tests__/config.test.d.ts.map +0 -1
  91. package/dist/__tests__/config.test.js +0 -29
  92. package/dist/__tests__/config.test.js.map +0 -1
  93. package/dist/__tests__/db.test.d.ts +0 -2
  94. package/dist/__tests__/db.test.d.ts.map +0 -1
  95. package/dist/__tests__/db.test.js +0 -204
  96. package/dist/__tests__/db.test.js.map +0 -1
  97. package/dist/__tests__/promptRegistry.test.d.ts +0 -2
  98. package/dist/__tests__/promptRegistry.test.d.ts.map +0 -1
  99. package/dist/__tests__/promptRegistry.test.js +0 -40
  100. package/dist/__tests__/promptRegistry.test.js.map +0 -1
  101. package/dist/__tests__/resourceRegistry.test.d.ts +0 -2
  102. package/dist/__tests__/resourceRegistry.test.d.ts.map +0 -1
  103. package/dist/__tests__/resourceRegistry.test.js +0 -40
  104. package/dist/__tests__/resourceRegistry.test.js.map +0 -1
  105. package/dist/__tests__/schema.test.d.ts +0 -2
  106. package/dist/__tests__/schema.test.d.ts.map +0 -1
  107. package/dist/__tests__/schema.test.js +0 -130
  108. package/dist/__tests__/schema.test.js.map +0 -1
  109. package/dist/__tests__/sql.test.d.ts +0 -2
  110. package/dist/__tests__/sql.test.d.ts.map +0 -1
  111. package/dist/__tests__/sql.test.js +0 -35
  112. package/dist/__tests__/sql.test.js.map +0 -1
  113. package/dist/__tests__/toolRegistry.test.d.ts +0 -2
  114. package/dist/__tests__/toolRegistry.test.d.ts.map +0 -1
  115. package/dist/__tests__/toolRegistry.test.js +0 -47
  116. package/dist/__tests__/toolRegistry.test.js.map +0 -1
  117. package/dist/__tests__/validation.test.d.ts +0 -2
  118. package/dist/__tests__/validation.test.d.ts.map +0 -1
  119. package/dist/__tests__/validation.test.js +0 -111
  120. package/dist/__tests__/validation.test.js.map +0 -1
  121. package/dist/__tests__/writeTools.test.d.ts +0 -2
  122. package/dist/__tests__/writeTools.test.d.ts.map +0 -1
  123. package/dist/__tests__/writeTools.test.js +0 -115
  124. 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
- const SERVER_VERSION = "1.2.0";
15
+ import { fingerprintForWriteTool } from "./writePreviewGrant.js";
16
+ import { writePreviewGrantStore } from "./writePreviewGrantStore.js";
17
+ import { previewFilteredRows } from "./writePreview.js";
18
+ const SERVER_VERSION = "1.3.1";
12
19
  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
- };
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 registerTools(serverInstance) {
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
- serverInstance.registerTool(definition.tool.name, {
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) => asTextToolResult(await definition.tool.run(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
- 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() {
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("Fatal error running server:", error);
64
- process.exit(1);
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
- runServer().catch((error) => {
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"}