@@ -110,6 +110,7 @@ $transport = new StreamableHttpTransport(
110110- ** ` request ` ** (required): ` ServerRequestInterface ` - The incoming PSR-7 HTTP request
111111- ** ` responseFactory ` ** (optional): ` ResponseFactoryInterface ` - PSR-17 factory for creating HTTP responses. Auto-discovered if not provided.
112112- ** ` streamFactory ` ** (optional): ` StreamFactoryInterface ` - PSR-17 factory for creating response body streams. Auto-discovered if not provided.
113+ - ** ` corsHeaders ` ** (optional): ` array ` - Custom CORS headers to override defaults. Merges with secure defaults. Defaults to ` [] ` .
113114- ** ` logger ` ** (optional): ` LoggerInterface ` - PSR-3 logger for debugging. Defaults to ` NullLogger ` .
114115
115116### PSR-17 Auto-Discovery
@@ -136,6 +137,48 @@ $psr17Factory = new Psr17Factory();
136137$transport = new StreamableHttpTransport($request, $psr17Factory, $psr17Factory);
137138```
138139
140+ ### CORS Configuration
141+
142+ The transport sets secure CORS defaults that can be customized or disabled:
143+
144+ ``` php
145+ // Default CORS headers (backward compatible)
146+ $transport = new StreamableHttpTransport($request, $responseFactory, $streamFactory);
147+
148+ // Restrict to specific origin
149+ $transport = new StreamableHttpTransport(
150+ $request,
151+ $responseFactory,
152+ $streamFactory,
153+ ['Access-Control-Allow-Origin' => 'https://myapp.com']
154+ );
155+
156+ // Disable CORS for proxy scenarios
157+ $transport = new StreamableHttpTransport(
158+ $request,
159+ $responseFactory,
160+ $streamFactory,
161+ ['Access-Control-Allow-Origin' => '']
162+ );
163+
164+ // Custom headers with logger
165+ $transport = new StreamableHttpTransport(
166+ $request,
167+ $responseFactory,
168+ $streamFactory,
169+ [
170+ 'Access-Control-Allow-Origin' => 'https://api.example.com',
171+ 'Access-Control-Max-Age' => '86400'
172+ ],
173+ $logger
174+ );
175+ ```
176+
177+ Default CORS headers:
178+ - ` Access-Control-Allow-Origin: * `
179+ - ` Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS `
180+ - ` Access-Control-Allow-Headers: Content-Type, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID, Authorization, Accept `
181+
139182### Architecture
140183
141184The HTTP transport doesn't run its own web server. Instead, it processes PSR-7 requests and returns PSR-7 responses that
0 commit comments