This is the documentation for the v2 beta — looking for the v1 documentation?
Skip to content

MCP TypeScript SDK (V2) / @modelcontextprotocol/node / streamableHttp

streamableHttp

Classes

NodeStreamableHTTPServerTransport

Defined in: packages/middleware/node/src/streamableHttp.ts:73

Server transport for Streamable HTTP: this implements the MCP Streamable HTTP transport specification. It supports both SSE streaming and direct HTTP responses.

This is a wrapper around WebStandardStreamableHTTPServerTransport that provides Node.js HTTP compatibility. It uses the @hono/node-server library to convert between Node.js HTTP and Web Standard APIs.

In stateful mode:

  • Session ID is generated and included in response headers
  • Session ID is always included in initialization responses
  • Requests with invalid session IDs are rejected with 404 Not Found
  • Non-initialization requests without a session ID are rejected with 400 Bad Request
  • State is maintained in-memory (connections, message history)

In stateless mode:

  • No Session ID is included in any responses
  • No session validation is performed

Examples

Stateful setup

ts
const server = new McpServer({ name: 'my-server', version: '1.0.0' });

const transport = new NodeStreamableHTTPServerTransport({
    sessionIdGenerator: () => randomUUID()
});

await server.connect(transport);

Stateless setup

ts
const transport = new NodeStreamableHTTPServerTransport({
    sessionIdGenerator: undefined
});

Using with a pre-parsed request body (e.g. Express)

ts
app.post('/mcp', (req, res) => {
    transport.handleRequest(req, res, req.body);
});

Implements

Constructors

Constructor

new NodeStreamableHTTPServerTransport(options?): NodeStreamableHTTPServerTransport

Defined in: packages/middleware/node/src/streamableHttp.ts:79

Parameters
options?

WebStandardStreamableHTTPServerTransportOptions = {}

Returns

NodeStreamableHTTPServerTransport

Accessors

onclose
Get Signature

get onclose(): (() => void) | undefined

Defined in: packages/middleware/node/src/streamableHttp.ts:113

Callback for when the connection is closed for any reason.

This should be invoked when close() is called as well.

Returns

(() => void) | undefined

Set Signature

set onclose(handler): void

Defined in: packages/middleware/node/src/streamableHttp.ts:109

Sets callback for when the transport is closed.

Parameters
handler

(() => void) | undefined

Returns

void

Callback for when the connection is closed for any reason.

This should be invoked when close() is called as well.

Implementation of

Transport.onclose

onerror
Get Signature

get onerror(): ((error) => void) | undefined

Defined in: packages/middleware/node/src/streamableHttp.ts:124

Callback for when an error occurs.

Note that errors are not necessarily fatal; they are used for reporting any kind of exceptional condition out of band.

Returns

((error) => void) | undefined

Set Signature

set onerror(handler): void

Defined in: packages/middleware/node/src/streamableHttp.ts:120

Sets callback for transport errors.

Parameters
handler

((error) => void) | undefined

Returns

void

Callback for when an error occurs.

Note that errors are not necessarily fatal; they are used for reporting any kind of exceptional condition out of band.

Implementation of

Transport.onerror

onmessage
Get Signature

get onmessage(): ((message, extra?) => void) | undefined

Defined in: packages/middleware/node/src/streamableHttp.ts:135

Callback for when a message (request or response) is received over the connection.

Includes the request and authInfo if the transport is authenticated.

The request can be used to get the original request information (headers, etc.)

Returns

((message, extra?) => void) | undefined

Set Signature

set onmessage(handler): void

Defined in: packages/middleware/node/src/streamableHttp.ts:131

Sets callback for incoming messages.

Parameters
handler

((message, extra?) => void) | undefined

Returns

void

Callback for when a message (request or response) is received over the connection.

Includes the request and authInfo if the transport is authenticated.

The request can be used to get the original request information (headers, etc.)

Implementation of

Transport.onmessage

sessionId
Get Signature

get sessionId(): string | undefined

Defined in: packages/middleware/node/src/streamableHttp.ts:102

Gets the session ID for this transport instance.

Returns

string | undefined

The session ID generated for this connection.

Implementation of

Transport.sessionId

Methods

close()

close(): Promise<void>

Defined in: packages/middleware/node/src/streamableHttp.ts:150

Closes the transport and all active connections.

Returns

Promise<void>

Implementation of

Transport.close

closeSSEStream()

closeSSEStream(requestId): void

Defined in: packages/middleware/node/src/streamableHttp.ts:210

Close an SSE stream for a specific request, triggering client reconnection. Use this to implement polling behavior during long-running operations - client will reconnect after the retry interval specified in the priming event.

Parameters
requestId

RequestId

Returns

void

closeStandaloneSSEStream()

closeStandaloneSSEStream(): void

Defined in: packages/middleware/node/src/streamableHttp.ts:218

Close the standalone GET SSE stream, triggering client reconnection. Use this to implement polling behavior for server-initiated notifications.

Returns

void

handleRequest()

handleRequest(req, res, parsedBody?): Promise<void>

Defined in: packages/middleware/node/src/streamableHttp.ts:182

Handles an incoming HTTP request, whether GET or POST.

This method converts Node.js HTTP objects to Web Standard Request/Response and delegates to the underlying WebStandardStreamableHTTPServerTransport.

Parameters
req

IncomingMessage & object

Node.js IncomingMessage, optionally with auth property from middleware

res

ServerResponse

Node.js ServerResponse

parsedBody?

unknown

Optional pre-parsed body from body-parser middleware

Returns

Promise<void>

send()

send(message, options?): Promise<void>

Defined in: packages/middleware/node/src/streamableHttp.ts:157

Sends a JSON-RPC message through the transport.

Parameters
message

JSONRPCMessage

options?
relatedRequestId?

RequestId

Returns

Promise<void>

Implementation of

Transport.send

setSupportedProtocolVersions()

setSupportedProtocolVersions(versions): void

Defined in: packages/middleware/node/src/streamableHttp.ts:168

Forwards the supported protocol versions to the wrapped Web Standard transport for MCP-Protocol-Version header validation. Called by the protocol layer during connect; without this delegation a server's supportedProtocolVersions option never reached the Node adapter's header validation.

Parameters
versions

string[]

Returns

void

Implementation of

Transport.setSupportedProtocolVersions

start()

start(): Promise<void>

Defined in: packages/middleware/node/src/streamableHttp.ts:143

Starts the transport. This is required by the Transport interface but is a no-op for the Streamable HTTP transport as connections are managed per-request.

Returns

Promise<void>

Implementation of

Transport.start

Type Aliases

StreamableHTTPServerTransportOptions

StreamableHTTPServerTransportOptions = WebStandardStreamableHTTPServerTransportOptions

Defined in: packages/middleware/node/src/streamableHttp.ts:28

Configuration options for NodeStreamableHTTPServerTransport

This is an alias for WebStandardStreamableHTTPServerTransportOptions for backward compatibility.