import { expect, test } from "bun:test" import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js" test("does not reconnect an SSE stream after a JSON-RPC error response", async () => { let requests = 0 const transport = new StreamableHTTPClientTransport(new URL("http://mcp.invalid"), { fetch: async () => { requests += 1 return new Response( new ReadableStream({ start(controller) { controller.enqueue(new TextEncoder().encode("id: prime\nretry: 1\ndata:\n\n")) controller.enqueue( new TextEncoder().encode( 'id: error\ndata: {"jsonrpc":"2.0","error":{"code":-32601,"message":"Method not found"},"id":1}\n\n', ), ) controller.close() }, }), { status: 200, headers: { "content-type": "text/event-stream" } }, ) }, reconnectionOptions: { initialReconnectionDelay: 1, maxReconnectionDelay: 1, reconnectionDelayGrowFactor: 1, maxRetries: 2, }, }) await transport.start() await transport.send({ jsonrpc: "2.0", method: "resources/list", id: 1 }) await Bun.sleep(25) await transport.close() expect(requests).toBe(1) })