diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index ae9360b..0026b2b 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -1,6 +1,6 @@ { "name": "@next-ai-drawio/mcp-server", - "version": "0.1.18", + "version": "0.1.19", "description": "MCP server for Next AI Draw.io - AI-powered diagram generation with real-time browser preview", "type": "module", "main": "dist/index.js", diff --git a/packages/mcp-server/src/http-server.ts b/packages/mcp-server/src/http-server.ts index d2f16d2..c75a48f 100644 --- a/packages/mcp-server/src/http-server.ts +++ b/packages/mcp-server/src/http-server.ts @@ -4,6 +4,29 @@ */ import http from "node:http" + +const MAX_BODY_BYTES = 10 * 1024 * 1024 // 10 MiB + +function readBody( + req: http.IncomingMessage, + res: http.ServerResponse, + cb: (body: string) => void, +): void { + let body = "" + let size = 0 + req.on("data", (chunk: Buffer) => { + size += chunk.length + if (size > MAX_BODY_BYTES) { + res.writeHead(413, { "Content-Type": "application/json" }) + res.end(JSON.stringify({ error: "Payload too large" })) + req.destroy() + return + } + body += chunk + }) + req.on("end", () => cb(body)) +} + import { addHistory, clearHistory, @@ -266,11 +289,7 @@ function handleStateApi( }), ) } else if (req.method === "POST") { - let body = "" - req.on("data", (chunk) => { - body += chunk - }) - req.on("end", () => { + readBody(req, res, (body) => { try { const data = JSON.parse(body) const { sessionId } = data @@ -347,11 +366,7 @@ function handleRestoreApi( return } - let body = "" - req.on("data", (chunk) => { - body += chunk - }) - req.on("end", () => { + readBody(req, res, (body) => { try { const { sessionId, index } = JSON.parse(body) if (!sessionId || index === undefined) { @@ -393,11 +408,7 @@ function handleHistorySvgApi( return } - let body = "" - req.on("data", (chunk) => { - body += chunk - }) - req.on("end", () => { + readBody(req, res, (body) => { try { const { sessionId, svg } = JSON.parse(body) if (!sessionId || !svg) {