1414
1515import json
1616from contextlib import asynccontextmanager
17+ from datetime import timedelta
1718from typing import Any , override
1819
1920from mcp import ClientSession , Tool as MCPToolDef
2021from mcp .client .sse import sse_client
2122from mcp .client .stdio import StdioServerParameters , stdio_client
23+ from mcp .client .streamable_http import streamablehttp_client
2224from mcp .client .websocket import websocket_client
2325from mcp .shared .exceptions import McpError
2426from opentelemetry import trace
@@ -100,6 +102,29 @@ def __init__(self, url: str, cache_enabled: bool = True):
100102 self .url = url
101103
102104
105+ class StreamableHTTPMCPEndpoint (MCPEndpoint ):
106+ """
107+ A MCP endpoint that communicates with an MCP server over HTTP streaming.
108+ """
109+
110+ url : str
111+
112+ def __init__ (self , url : str , cache_enabled : bool = True ):
113+ """
114+ Create a new WebsocketMCPEndpoint instance.
115+
116+ Args:
117+ url: The URL of the WebSocket server.
118+ cache_enabled: Whether to cache the list of {tools,resources,prompts} from the server.
119+ """
120+ super ().__init__ (cache_enabled )
121+ self .url = url
122+
123+ @property
124+ def headers (self ) -> dict [str , Any ]:
125+ return {}
126+
127+
103128@asynccontextmanager
104129async def mcp_client (server : MCPEndpoint ):
105130 """
@@ -110,13 +135,19 @@ async def mcp_client(server: MCPEndpoint):
110135 async with ClientSession (read , write ) as client :
111136 yield MCPClient (server , client )
112137 elif isinstance (server , SSEMCPEndpoint ):
113- async with sse_client (server .url , server .headers ) as (read , write ):
138+ async with sse_client (server .url , server .headers , timeout = 30 ) as (read , write ):
114139 async with ClientSession (read , write ) as client :
115140 yield MCPClient (server , client )
116141 elif isinstance (server , WebsocketMCPEndpoint ):
117142 async with websocket_client (server .url ) as (read , write ):
118143 async with ClientSession (read , write ) as client :
119144 yield MCPClient (server , client )
145+ elif isinstance (server , StreamableHTTPMCPEndpoint ):
146+ async with streamablehttp_client (
147+ server .url , server .headers , timeout = timedelta (seconds = 30 )
148+ ) as (read , write , _get_session_id ):
149+ async with ClientSession (read , write ) as client :
150+ yield MCPClient (server , client )
120151 else :
121152 raise NotImplementedError (f"Unknown server type: { server } " )
122153
0 commit comments