diff --git a/README.md b/README.md index fe4caa3f..a959ae3d 100644 --- a/README.md +++ b/README.md @@ -211,7 +211,7 @@ await server.connect(transport); For remote servers, start a web server with a Server-Sent Events (SSE) endpoint, and a separate endpoint for the client to send its messages to: ```typescript -import express from "express"; +import express, { Request, Response } from "express"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js"; @@ -224,16 +224,27 @@ const server = new McpServer({ const app = express(); -app.get("/sse", async (req, res) => { - const transport = new SSEServerTransport("/messages", res); +// to support multiple simultaneous connections we have a lookup object from +// sessionId to transport +const transports: {[sessionId: string]: SSEServerTransport} = {}; + +app.get("/sse", async (_: Request, res: Response) => { + const transport = new SSEServerTransport('/messages', res); + transports[transport.sessionId] = transport; + res.on("close", () => { + delete transports[transport.sessionId]; + }); await server.connect(transport); }); -app.post("/messages", async (req, res) => { - // Note: to support multiple simultaneous connections, these messages will - // need to be routed to a specific matching transport. (This logic isn't - // implemented here, for simplicity.) - await transport.handlePostMessage(req, res); +app.post("/messages", async (req: Request, res: Response) => { + const sessionId = req.query.sessionId as string; + const transport = transports[sessionId]; + if (transport) { + await transport.handlePostMessage(req, res); + } else { + res.status(400).send('No transport found for sessionId'); + } }); app.listen(3001);