MCPcopy
hub / github.com/codeaashu/claude-code / startStreamableHTTP

Function startStreamableHTTP

mcp-server/src/http.ts:50–104  ·  view source on GitHub ↗
(app: express.Express)

Source from the content-addressed store, hash-verified

48// ---------------------------------------------------------------------------
49
50async function startStreamableHTTP(app: express.Express): Promise<void> {
51 // Map of session ID -> transport
52 const transports = new Map<string, StreamableHTTPServerTransport>();
53
54 app.post("/mcp", async (req, res) => {
55 const sessionId =
56 (req.headers["mcp-session-id"] as string) ?? undefined;
57 let transport = sessionId ? transports.get(sessionId) : undefined;
58
59 if (!transport) {
60 // New session
61 const server = createServer();
62 transport = new StreamableHTTPServerTransport({
63 sessionIdGenerator: () => randomUUID(),
64 });
65 await server.connect(transport);
66
67 // Store session after first request so we can retrieve it later
68 transport.onclose = () => {
69 if (transport!.sessionId) {
70 transports.delete(transport!.sessionId);
71 }
72 };
73 }
74
75 await transport.handleRequest(req, res, req.body);
76
77 // After handling, store with the now-known session ID
78 if (transport.sessionId && !transports.has(transport.sessionId)) {
79 transports.set(transport.sessionId, transport);
80 }
81 });
82
83 // SSE stream endpoint for Streamable HTTP
84 app.get("/mcp", async (req, res) => {
85 const sessionId = req.headers["mcp-session-id"] as string | undefined;
86 if (!sessionId || !transports.has(sessionId)) {
87 res.status(400).json({ error: "Invalid or missing session ID" });
88 return;
89 }
90 const transport = transports.get(sessionId)!;
91 await transport.handleRequest(req, res);
92 });
93
94 // DELETE — session cleanup
95 app.delete("/mcp", async (req, res) => {
96 const sessionId = req.headers["mcp-session-id"] as string | undefined;
97 if (sessionId && transports.has(sessionId)) {
98 const transport = transports.get(sessionId)!;
99 await transport.close();
100 transports.delete(sessionId);
101 }
102 res.status(200).json({ ok: true });
103 });
104}
105
106// ---------------------------------------------------------------------------
107// Legacy SSE transport (for older clients)

Callers 1

mainFunction · 0.85

Calls 9

createServerFunction · 0.85
postMethod · 0.80
statusMethod · 0.80
getMethod · 0.65
deleteMethod · 0.65
connectMethod · 0.45
hasMethod · 0.45
setMethod · 0.45
closeMethod · 0.45

Tested by

no test coverage detected