MCP PHP SDK

StreamableHttpTransport extends BaseTransport

Provides a skeletal implementation of the TransportInterface to minimize the effort required to implement this interface.

Tags
author

Kyrian Obikwelu koshnawaza@gmail.com

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]

Properties

$outgoingMessagesProvider

protected callable(Uuid): array<int, array{message: string, context: array}> $outgoingMessagesProvider

$pendingRequestsProvider

protected callable(Uuid): array<int, array<string, mixed>> $pendingRequestsProvider

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

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
phpstan-return

FiberResume

Return values
Response|Error|null

createErrorResponse()

protected createErrorResponse(Error $jsonRpcError, int $statusCode) : ResponseInterface
Parameters
$jsonRpcError : Error
$statusCode : int
Return values
ResponseInterface

createJsonResponse()

protected createJsonResponse() : ResponseInterface
Return values
ResponseInterface

createStreamedResponse()

protected createStreamedResponse() : ResponseInterface
Return values
ResponseInterface

flushOutgoingMessages()

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: array}>

getPendingRequests()

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
ResponseInterface

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
ResponseInterface

handlePostRequest()

protected handlePostRequest() : ResponseInterface
Return values
ResponseInterface

handleSessionEnd()

protected handleSessionEnd(Uuid|null $sessionId) : void
Parameters
$sessionId : Uuid|null

withCorsHeaders()

protected withCorsHeaders(ResponseInterface $response) : ResponseInterface
Parameters
$response : ResponseInterface
Return values
ResponseInterface

handleRequest()

private handleRequest(ServerRequestInterface $request) : ResponseInterface
Parameters
$request : ServerRequestInterface
Return values
ResponseInterface

        
On this page

Search results