1
1
from __future__ import annotations
2
2
3
3
import os
4
- from collections .abc import AsyncIterator
5
4
from contextlib import asynccontextmanager
6
5
from datetime import timedelta
7
- from pathlib import Path
8
- from typing import Any , Literal , Protocol
6
+ from typing import TYPE_CHECKING , Any , Literal , Protocol
9
7
10
- import httpx
11
8
from mcp import ClientSession , StdioServerParameters
12
9
from mcp .client .sse import sse_client
13
10
from mcp .client .stdio import stdio_client
14
11
from mcp .client .streamable_http import streamablehttp_client
15
12
from typing_extensions import NotRequired , TypedDict
16
13
14
+ if TYPE_CHECKING :
15
+ from collections .abc import AsyncIterator
16
+ from pathlib import Path
17
+
18
+ import httpx
19
+
17
20
EncodingErrorHandler = Literal ["strict" , "ignore" , "replace" ]
18
21
19
22
DEFAULT_ENCODING = "utf-8"
@@ -147,7 +150,7 @@ class WebsocketConnection(TypedDict):
147
150
148
151
149
152
@asynccontextmanager
150
- async def _create_stdio_session (
153
+ async def _create_stdio_session ( # noqa: PLR0913
151
154
* ,
152
155
command : str ,
153
156
args : list [str ],
@@ -186,13 +189,15 @@ async def _create_stdio_session(
186
189
)
187
190
188
191
# Create and store the connection
189
- async with stdio_client (server_params ) as (read , write ):
190
- async with ClientSession (read , write , ** (session_kwargs or {})) as session :
191
- yield session
192
+ async with (
193
+ stdio_client (server_params ) as (read , write ),
194
+ ClientSession (read , write , ** (session_kwargs or {})) as session ,
195
+ ):
196
+ yield session
192
197
193
198
194
199
@asynccontextmanager
195
- async def _create_sse_session (
200
+ async def _create_sse_session ( # noqa: PLR0913
196
201
* ,
197
202
url : str ,
198
203
headers : dict [str , Any ] | None = None ,
@@ -219,16 +224,18 @@ async def _create_sse_session(
219
224
if httpx_client_factory is not None :
220
225
kwargs ["httpx_client_factory" ] = httpx_client_factory
221
226
222
- async with sse_client (url , headers , timeout , sse_read_timeout , auth = auth , ** kwargs ) as (
223
- read ,
224
- write ,
227
+ async with (
228
+ sse_client (url , headers , timeout , sse_read_timeout , auth = auth , ** kwargs ) as (
229
+ read ,
230
+ write ,
231
+ ),
232
+ ClientSession (read , write , ** (session_kwargs or {})) as session ,
225
233
):
226
- async with ClientSession (read , write , ** (session_kwargs or {})) as session :
227
- yield session
234
+ yield session
228
235
229
236
230
237
@asynccontextmanager
231
- async def _create_streamable_http_session (
238
+ async def _create_streamable_http_session ( # noqa: PLR0913
232
239
* ,
233
240
url : str ,
234
241
headers : dict [str , Any ] | None = None ,
@@ -257,16 +264,26 @@ async def _create_streamable_http_session(
257
264
if httpx_client_factory is not None :
258
265
kwargs ["httpx_client_factory" ] = httpx_client_factory
259
266
260
- async with streamablehttp_client (
261
- url , headers , timeout , sse_read_timeout , terminate_on_close , auth = auth , ** kwargs
262
- ) as (read , write , _ ):
263
- async with ClientSession (read , write , ** (session_kwargs or {})) as session :
264
- yield session
267
+ async with (
268
+ streamablehttp_client (
269
+ url ,
270
+ headers ,
271
+ timeout ,
272
+ sse_read_timeout ,
273
+ terminate_on_close ,
274
+ auth = auth ,
275
+ ** kwargs ,
276
+ ) as (read , write , _ ),
277
+ ClientSession (read , write , ** (session_kwargs or {})) as session ,
278
+ ):
279
+ yield session
265
280
266
281
267
282
@asynccontextmanager
268
283
async def _create_websocket_session (
269
- * , url : str , session_kwargs : dict [str , Any ] | None = None
284
+ * ,
285
+ url : str ,
286
+ session_kwargs : dict [str , Any ] | None = None ,
270
287
) -> AsyncIterator [ClientSession ]:
271
288
"""Create a new session to an MCP server using Websockets.
272
289
@@ -288,13 +305,15 @@ async def _create_websocket_session(
288
305
)
289
306
raise ImportError (msg ) from None
290
307
291
- async with websocket_client (url ) as (read , write ):
292
- async with ClientSession (read , write , ** (session_kwargs or {})) as session :
293
- yield session
308
+ async with (
309
+ websocket_client (url ) as (read , write ),
310
+ ClientSession (read , write , ** (session_kwargs or {})) as session ,
311
+ ):
312
+ yield session
294
313
295
314
296
315
@asynccontextmanager
297
- async def create_session (connection : Connection ) -> AsyncIterator [ClientSession ]:
316
+ async def create_session (connection : Connection ) -> AsyncIterator [ClientSession ]: # noqa: C901
298
317
"""Create a new session to an MCP server.
299
318
300
319
Args:
0 commit comments