StreamableHttpTransport extends BaseTransport
Provides a skeletal implementation of the TransportInterface to minimize the effort required to implement this interface.
Tags
Table of Contents
Constants
- ALLOWED_HEADER = ['Accept', 'Authorization', 'Content-Type', 'Last-Event-ID', 'Mcp-Protocol-Version', self::SESSION_HEADER]
- SESSION_HEADER = 'Mcp-Session-Id'
Properties
- $fiberYieldHandler : callable(Array, Array): void
- $logger : LoggerInterface
- $messageListener : callable(TransportInterface<string|int, mixed>, string, Array): void
-
$outgoingMessagesProvider
: callable(Uuid): array<int, array{message: string, context: array
}> - $pendingRequestsProvider : callable(Uuid): array<int, array<string, mixed>>
- $responseFinder : callable(int, Uuid): Response<string|int, array<string, mixed>>|Error|null
- $sessionEndListener : callable(Uuid): void
- $sessionFiber : McpFiber|null
- $sessionId : Uuid|null
- $corsHeaders : array<string, string>
- $immediateResponse : string|null
- $immediateStatusCode : int|null
- $middleware : array<int, MiddlewareInterface>
- $request : ServerRequestInterface
- $responseFactory : ResponseFactoryInterface
- $streamFactory : StreamFactoryInterface
Methods
- __construct() : mixed
- attachFiberToSession() : void
- close() : void
- Closes the transport and cleans up any resources.
- initialize() : void
- Initializes the transport.
- listen() : TResult
- Starts the transport's execution process.
- onMessage() : void
- onSessionEnd() : void
- send() : void
- Send a message to the client immediately (bypassing session queue).
- setFiberYieldHandler() : void
- setOutgoingMessagesProvider() : void
- setPendingRequestsProvider() : void
- setResponseFinder() : void
- setSessionId() : void
- Set the session ID for the current transport context.
- checkForResponse() : Response|Error|null
- createErrorResponse() : ResponseInterface
- createJsonResponse() : ResponseInterface
- createStreamedResponse() : ResponseInterface
- flushOutgoingMessages() : void
-
getOutgoingMessages()
: array<int, array{message: string, context: array
}> - getPendingRequests() : array<int, array<string, mixed>>
- handleDeleteRequest() : ResponseInterface
- handleFiberTermination() : void
- handleFiberYield() : void
- handleMessage() : void
- handleOptionsRequest() : ResponseInterface
- handlePostRequest() : ResponseInterface
- handleSessionEnd() : void
- withCorsHeaders() : ResponseInterface
- handleRequest() : ResponseInterface
Constants
ALLOWED_HEADER
private
mixed
ALLOWED_HEADER
= ['Accept', 'Authorization', 'Content-Type', 'Last-Event-ID', 'Mcp-Protocol-Version', self::SESSION_HEADER]
SESSION_HEADER
private
mixed
SESSION_HEADER
= 'Mcp-Session-Id'
Properties
$fiberYieldHandler
protected
callable(Array, Array): void
$fiberYieldHandler
$logger
protected
LoggerInterface
$logger
$messageListener
protected
callable(TransportInterface<string|int, mixed>, string, Array): void
$messageListener
$outgoingMessagesProvider
protected
callable(Uuid): array<int, array{message: string, context: array}>
$outgoingMessagesProvider
$pendingRequestsProvider
protected
callable(Uuid): array<int, array<string, mixed>>
$pendingRequestsProvider
$responseFinder
protected
callable(int, Uuid): Response<string|int, array<string, mixed>>|Error|null
$responseFinder
$sessionEndListener
protected
callable(Uuid): void
$sessionEndListener
$sessionFiber
protected
McpFiber|null
$sessionFiber
= null
$sessionId
protected
Uuid|null
$sessionId
= null
$corsHeaders
private
array<string, string>
$corsHeaders
$immediateResponse
private
string|null
$immediateResponse
= null
$immediateStatusCode
private
int|null
$immediateStatusCode
= null
$middleware
private
array<int, MiddlewareInterface>
$middleware
= []
$request
private
ServerRequestInterface
$request
$responseFactory
private
ResponseFactoryInterface
$responseFactory
$streamFactory
private
StreamFactoryInterface
$streamFactory
Methods
__construct()
public
__construct(ServerRequestInterface $request[, ResponseFactoryInterface|null $responseFactory = null ][, StreamFactoryInterface|null $streamFactory = null ][, array<string, string> $corsHeaders = [] ][, LoggerInterface|null $logger = null ][, iterable<string|int, MiddlewareInterface> $middleware = [] ]) : mixed
Parameters
- $request : ServerRequestInterface
- $responseFactory : ResponseFactoryInterface|null = null
- $streamFactory : StreamFactoryInterface|null = null
- $corsHeaders : array<string, string> = []
- $logger : LoggerInterface|null = null
- $middleware : iterable<string|int, MiddlewareInterface> = []
attachFiberToSession()
public
attachFiberToSession(McpFiber $fiber, Uuid $sessionId) : void
Parameters
- $fiber : McpFiber
- $sessionId : Uuid
close()
Closes the transport and cleans up any resources.
public
close() : void
initialize()
Initializes the transport.
public
initialize() : void
listen()
Starts the transport's execution process.
public
listen() : TResult
- For a blocking transport like STDIO, this method will run a continuous loop.
- For a single-request transport like HTTP, this will process the request and return a result (e.g., a PSR-7 Response) to be sent to the client.
Return values
TResult —the result of the transport's execution, if any
onMessage()
public
onMessage(callable $listener) : void
Parameters
- $listener : callable
onSessionEnd()
public
onSessionEnd(callable $listener) : void
Parameters
- $listener : callable
send()
Send a message to the client immediately (bypassing session queue).
public
send(string $data, array<string|int, mixed> $context) : void
Used for session resolution errors when no session is available. The transport decides HOW to send based on context.
Parameters
- $data : string
- $context : array<string|int, mixed>
-
Context about this message:
- 'session_id': Uuid|null
- 'type': 'response'|'request'|'notification'
- 'status_code': int (HTTP status code for errors)
setFiberYieldHandler()
public
setFiberYieldHandler(callable(Array, Array): void $handler) : void
Parameters
- $handler : callable(Array, Array): void
setOutgoingMessagesProvider()
public
setOutgoingMessagesProvider(callable $provider) : void
Parameters
- $provider : callable
setPendingRequestsProvider()
public
setPendingRequestsProvider(callable $provider) : void
Parameters
- $provider : callable
setResponseFinder()
public
setResponseFinder(callable(int, Uuid): Array $finder) : void
Parameters
- $finder : callable(int, Uuid): Array
setSessionId()
Set the session ID for the current transport context.
public
setSessionId(Uuid|null $sessionId) : void
Parameters
- $sessionId : Uuid|null
-
The session ID, or null to clear
checkForResponse()
protected
checkForResponse(int $requestId, Uuid|null $sessionId) : Response|Error|null
Parameters
- $requestId : int
- $sessionId : Uuid|null
Tags
Return values
Response|Error|nullcreateErrorResponse()
protected
createErrorResponse(Error $jsonRpcError, int $statusCode) : ResponseInterface
Parameters
- $jsonRpcError : Error
- $statusCode : int
Return values
ResponseInterfacecreateJsonResponse()
protected
createJsonResponse() : ResponseInterface
Return values
ResponseInterfacecreateStreamedResponse()
protected
createStreamedResponse() : ResponseInterface
Return values
ResponseInterfaceflushOutgoingMessages()
protected
flushOutgoingMessages(Uuid|null $sessionId) : void
Parameters
- $sessionId : Uuid|null
getOutgoingMessages()
protected
getOutgoingMessages(Uuid|null $sessionId) : array<int, array{message: string, context: array}>
Parameters
- $sessionId : Uuid|null
Return values
array<int, array{message: string, context: arraygetPendingRequests()
protected
getPendingRequests(Uuid|null $sessionId) : array<int, array<string, mixed>>
Parameters
- $sessionId : Uuid|null
Return values
array<int, array<string, mixed>>handleDeleteRequest()
protected
handleDeleteRequest() : ResponseInterface
Return values
ResponseInterfacehandleFiberTermination()
protected
handleFiberTermination() : void
handleFiberYield()
protected
handleFiberYield(FiberSuspend|null $yielded, Uuid|null $sessionId) : void
Parameters
- $yielded : FiberSuspend|null
- $sessionId : Uuid|null
handleMessage()
protected
handleMessage(string $payload, Uuid|null $sessionId) : void
Parameters
- $payload : string
- $sessionId : Uuid|null
handleOptionsRequest()
protected
handleOptionsRequest() : ResponseInterface
Return values
ResponseInterfacehandlePostRequest()
protected
handlePostRequest() : ResponseInterface
Return values
ResponseInterfacehandleSessionEnd()
protected
handleSessionEnd(Uuid|null $sessionId) : void
Parameters
- $sessionId : Uuid|null
withCorsHeaders()
protected
withCorsHeaders(ResponseInterface $response) : ResponseInterface
Parameters
- $response : ResponseInterface
Return values
ResponseInterfacehandleRequest()
private
handleRequest(ServerRequestInterface $request) : ResponseInterface
Parameters
- $request : ServerRequestInterface