From 086a028879f5517dfcf4a4d563c69c4a343d4ae3 Mon Sep 17 00:00:00 2001 From: Time Date: Mon, 19 Oct 2026 16:15:06 +0000 Subject: [PATCH] card #98: update havre/src/http.js --- havre/src/http.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 havre/src/http.js diff --git a/havre/src/http.js b/havre/src/http.js new file mode 100644 index 0000000..41b1024 --- /dev/null +++ b/havre/src/http.js @@ -0,0 +1,26 @@ +import { createServer as createHttp } from "node:http"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import { createServer } from "./server.js"; + +// Stateless streamable HTTP: a fresh MCP server + transport per request, nothing kept between requests. +export function createHttpServer() { + return createHttp(async (req, res) => { + const path = new URL(req.url, "http://x").pathname; + if (path === "/health") return res.writeHead(200, { "content-type": "text/plain" }).end("ok"); + if (path !== "/mcp") return res.writeHead(404).end(); + if (req.method !== "POST") return res.writeHead(405, { allow: "POST" }).end(); + const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true }); + const server = createServer(); + res.on("close", () => { transport.close(); server.close(); }); + try { + await server.connect(transport); + await transport.handleRequest(req, res); + } catch { + if (!res.headersSent) res.writeHead(500).end(); + } + }); +} + +if (import.meta.url === `file://${process.argv[1]}`) { + createHttpServer().listen(Number(process.env.PORT ?? 8080), "0.0.0.0"); +}