13
13
from mcp import ClientSession , StdioServerParameters , Tool as MCPTool , stdio_client
14
14
from mcp .client .sse import sse_client
15
15
from mcp .client .streamable_http import GetSessionIdCallback , streamablehttp_client
16
+ from mcp .client .session import MessageHandlerFnT
16
17
from mcp .shared .message import SessionMessage
17
18
from mcp .types import CallToolResult , GetPromptResult , InitializeResult , ListPromptsResult
18
19
from typing_extensions import NotRequired , TypedDict
@@ -103,6 +104,7 @@ def __init__(
103
104
use_structured_content : bool = False ,
104
105
max_retry_attempts : int = 0 ,
105
106
retry_backoff_seconds_base : float = 1.0 ,
107
+ message_handler : MessageHandlerFnT | None = None ,
106
108
):
107
109
"""
108
110
Args:
@@ -124,6 +126,8 @@ def __init__(
124
126
Defaults to no retries.
125
127
retry_backoff_seconds_base: The base delay, in seconds, used for exponential
126
128
backoff between retries.
129
+ message_handler: Optional handler invoked for session messages as delivered by the
130
+ ClientSession.
127
131
"""
128
132
super ().__init__ (use_structured_content = use_structured_content )
129
133
self .session : ClientSession | None = None
@@ -135,6 +139,7 @@ def __init__(
135
139
self .client_session_timeout_seconds = client_session_timeout_seconds
136
140
self .max_retry_attempts = max_retry_attempts
137
141
self .retry_backoff_seconds_base = retry_backoff_seconds_base
142
+ self .message_handler = message_handler
138
143
139
144
# The cache is always dirty at startup, so that we fetch tools at least once
140
145
self ._cache_dirty = True
@@ -272,6 +277,7 @@ async def connect(self):
272
277
timedelta (seconds = self .client_session_timeout_seconds )
273
278
if self .client_session_timeout_seconds
274
279
else None ,
280
+ message_handler = self .message_handler ,
275
281
)
276
282
)
277
283
server_result = await session .initialize ()
@@ -394,6 +400,7 @@ def __init__(
394
400
use_structured_content : bool = False ,
395
401
max_retry_attempts : int = 0 ,
396
402
retry_backoff_seconds_base : float = 1.0 ,
403
+ message_handler : MessageHandlerFnT | None = None ,
397
404
):
398
405
"""Create a new MCP server based on the stdio transport.
399
406
@@ -421,6 +428,8 @@ def __init__(
421
428
Defaults to no retries.
422
429
retry_backoff_seconds_base: The base delay, in seconds, for exponential
423
430
backoff between retries.
431
+ message_handler: Optional handler invoked for session messages as delivered by the
432
+ ClientSession.
424
433
"""
425
434
super ().__init__ (
426
435
cache_tools_list ,
@@ -429,6 +438,7 @@ def __init__(
429
438
use_structured_content ,
430
439
max_retry_attempts ,
431
440
retry_backoff_seconds_base ,
441
+ message_handler = message_handler ,
432
442
)
433
443
434
444
self .params = StdioServerParameters (
@@ -492,6 +502,7 @@ def __init__(
492
502
use_structured_content : bool = False ,
493
503
max_retry_attempts : int = 0 ,
494
504
retry_backoff_seconds_base : float = 1.0 ,
505
+ message_handler : MessageHandlerFnT | None = None ,
495
506
):
496
507
"""Create a new MCP server based on the HTTP with SSE transport.
497
508
@@ -521,6 +532,8 @@ def __init__(
521
532
Defaults to no retries.
522
533
retry_backoff_seconds_base: The base delay, in seconds, for exponential
523
534
backoff between retries.
535
+ message_handler: Optional handler invoked for session messages as delivered by the
536
+ ClientSession.
524
537
"""
525
538
super ().__init__ (
526
539
cache_tools_list ,
@@ -529,6 +542,7 @@ def __init__(
529
542
use_structured_content ,
530
543
max_retry_attempts ,
531
544
retry_backoff_seconds_base ,
545
+ message_handler = message_handler ,
532
546
)
533
547
534
548
self .params = params
@@ -592,6 +606,7 @@ def __init__(
592
606
use_structured_content : bool = False ,
593
607
max_retry_attempts : int = 0 ,
594
608
retry_backoff_seconds_base : float = 1.0 ,
609
+ message_handler : MessageHandlerFnT | None = None ,
595
610
):
596
611
"""Create a new MCP server based on the Streamable HTTP transport.
597
612
@@ -622,6 +637,8 @@ def __init__(
622
637
Defaults to no retries.
623
638
retry_backoff_seconds_base: The base delay, in seconds, for exponential
624
639
backoff between retries.
640
+ message_handler: Optional handler invoked for session messages as delivered by the
641
+ ClientSession.
625
642
"""
626
643
super ().__init__ (
627
644
cache_tools_list ,
@@ -630,6 +647,7 @@ def __init__(
630
647
use_structured_content ,
631
648
max_retry_attempts ,
632
649
retry_backoff_seconds_base ,
650
+ message_handler = message_handler ,
633
651
)
634
652
635
653
self .params = params
0 commit comments