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"); +}