2020from httpx_sse import EventSource , ServerSentEvent , aconnect_sse
2121from typing_extensions import deprecated
2222
23- from mcp .shared ._httpx_utils import (
24- MCP_DEFAULT_SSE_READ_TIMEOUT ,
25- MCP_DEFAULT_TIMEOUT ,
26- McpHttpClientFactory ,
27- create_mcp_http_client ,
28- )
23+ from mcp .shared ._httpx_utils import McpHttpClientFactory , create_mcp_http_client
2924from mcp .shared .message import ClientMessageMetadata , SessionMessage
3025from mcp .types import (
3126 ErrorData ,
@@ -70,12 +65,10 @@ class RequestContext:
7065 """Context for a request operation."""
7166
7267 client : httpx .AsyncClient
73- headers : dict [str , str ]
7468 session_id : str | None
7569 session_message : SessionMessage
7670 metadata : ClientMessageMetadata | None
7771 read_stream_writer : StreamWriter
78- sse_read_timeout : float
7972
8073
8174class StreamableHTTPTransport :
@@ -93,29 +86,22 @@ def __init__(
9386
9487 Args:
9588 url: The endpoint URL.
96- headers: Optional headers to include in requests .
97- timeout: HTTP timeout for regular operations .
98- sse_read_timeout: Timeout for SSE read operations .
99- auth: Optional HTTPX authentication handler .
89+ headers: DEPRECATED - Ignored. Configure headers on the httpx.AsyncClient instead .
90+ timeout: DEPRECATED - Ignored. Configure timeout on the httpx.AsyncClient instead .
91+ sse_read_timeout: DEPRECATED - Ignored. Configure read timeout on the httpx.AsyncClient instead .
92+ auth: DEPRECATED - Ignored. Configure auth on the httpx.AsyncClient instead .
10093 """
10194 self .url = url
102- self .headers = headers or {}
103- self .timeout = timeout .total_seconds () if isinstance (timeout , timedelta ) else timeout
104- self .sse_read_timeout = (
105- sse_read_timeout .total_seconds () if isinstance (sse_read_timeout , timedelta ) else sse_read_timeout
106- )
107- self .auth = auth
10895 self .session_id = None
10996 self .protocol_version = None
110- self .request_headers = {
111- ** self .headers ,
112- ACCEPT : f"{ JSON } , { SSE } " ,
113- CONTENT_TYPE : JSON ,
114- }
115-
116- def _prepare_request_headers (self , base_headers : dict [str , str ]) -> dict [str , str ]:
117- """Update headers with session ID and protocol version if available."""
118- headers = base_headers .copy ()
97+
98+ def _prepare_headers (self , client : httpx .AsyncClient ) -> dict [str , str ]:
99+ """Build request headers by merging client headers with MCP protocol and session headers."""
100+ headers = dict (client .headers ) if client .headers else {}
101+ # Add MCP protocol headers
102+ headers [ACCEPT ] = f"{ JSON } , { SSE } "
103+ headers [CONTENT_TYPE ] = JSON
104+ # Add session headers if available
119105 if self .session_id :
120106 headers [MCP_SESSION_ID ] = self .session_id
121107 if self .protocol_version :
@@ -206,14 +192,13 @@ async def handle_get_stream(
206192 if not self .session_id :
207193 return
208194
209- headers = self ._prepare_request_headers ( self . request_headers )
195+ headers = self ._prepare_headers ( client )
210196
211197 async with aconnect_sse (
212198 client ,
213199 "GET" ,
214200 self .url ,
215201 headers = headers ,
216- timeout = httpx .Timeout (self .timeout , read = self .sse_read_timeout ),
217202 ) as event_source :
218203 event_source .response .raise_for_status ()
219204 logger .debug ("GET SSE connection established" )
@@ -226,7 +211,7 @@ async def handle_get_stream(
226211
227212 async def _handle_resumption_request (self , ctx : RequestContext ) -> None :
228213 """Handle a resumption request using GET with SSE."""
229- headers = self ._prepare_request_headers (ctx .headers )
214+ headers = self ._prepare_headers (ctx .client )
230215 if ctx .metadata and ctx .metadata .resumption_token :
231216 headers [LAST_EVENT_ID ] = ctx .metadata .resumption_token
232217 else :
@@ -242,7 +227,6 @@ async def _handle_resumption_request(self, ctx: RequestContext) -> None:
242227 "GET" ,
243228 self .url ,
244229 headers = headers ,
245- timeout = httpx .Timeout (self .timeout , read = self .sse_read_timeout ),
246230 ) as event_source :
247231 event_source .response .raise_for_status ()
248232 logger .debug ("Resumption GET SSE connection established" )
@@ -260,7 +244,7 @@ async def _handle_resumption_request(self, ctx: RequestContext) -> None:
260244
261245 async def _handle_post_request (self , ctx : RequestContext ) -> None :
262246 """Handle a POST request with response processing."""
263- headers = self ._prepare_request_headers (ctx .headers )
247+ headers = self ._prepare_headers (ctx .client )
264248 message = ctx .session_message .message
265249 is_initialization = self ._is_initialization_request (message )
266250
@@ -401,12 +385,10 @@ async def post_writer(
401385
402386 ctx = RequestContext (
403387 client = client ,
404- headers = self .request_headers ,
405388 session_id = self .session_id ,
406389 session_message = session_message ,
407390 metadata = metadata ,
408391 read_stream_writer = read_stream_writer ,
409- sse_read_timeout = self .sse_read_timeout ,
410392 )
411393
412394 async def handle_request_async ():
@@ -433,7 +415,7 @@ async def terminate_session(self, client: httpx.AsyncClient) -> None:
433415 return
434416
435417 try :
436- headers = self ._prepare_request_headers ( self . request_headers )
418+ headers = self ._prepare_headers ( client )
437419 response = await client .delete (self .url , headers = headers )
438420
439421 if response .status_code == 405 :
@@ -488,21 +470,11 @@ async def streamable_http_client(
488470 # Determine if we need to create and manage the client
489471 client_provided = http_client is not None
490472 client = http_client
491-
492473 if client is None :
493474 # Create default client with recommended MCP timeouts
494475 client = create_mcp_http_client ()
495476
496- # Extract configuration from the client to pass to transport
497- headers_dict = dict (client .headers ) if client .headers else None
498- timeout = client .timeout .connect if (client .timeout and client .timeout .connect is not None ) else MCP_DEFAULT_TIMEOUT
499- sse_read_timeout = (
500- client .timeout .read if (client .timeout and client .timeout .read is not None ) else MCP_DEFAULT_SSE_READ_TIMEOUT
501- )
502- auth = client .auth
503-
504- # Create transport with extracted configuration
505- transport = StreamableHTTPTransport (url , headers_dict , timeout , sse_read_timeout , auth )
477+ transport = StreamableHTTPTransport (url )
506478
507479 async with anyio .create_task_group () as tg :
508480 try :
0 commit comments