11from __future__ import annotations
22
33import logging
4+ import uuid
45from typing import Any , Protocol
56
67import anyio .lowlevel
1314from mcp .shared ._context import RequestContext
1415from mcp .shared .message import SessionMessage
1516from mcp .shared .session import BaseSession , ProgressFnT , RequestResponder
17+ from mcp .shared .session_state import SessionState
1618from mcp .shared .version import SUPPORTED_PROTOCOL_VERSIONS
1719from mcp .types ._types import RequestParamsMeta
1820
@@ -132,6 +134,9 @@ def __init__(
132134 self ._message_handler = message_handler or _default_message_handler
133135 self ._tool_output_schemas : dict [str , dict [str , Any ] | None ] = {}
134136 self ._server_capabilities : types .ServerCapabilities | None = None
137+ self ._server_info : types .Implementation | None = None
138+ self ._initialized_sent : bool = False
139+ self ._session_id : str = str (uuid .uuid4 ())
135140 self ._experimental_features : ExperimentalClientFeatures | None = None
136141
137142 # Experimental: Task handlers (use defaults if not provided)
@@ -186,8 +191,10 @@ async def initialize(self) -> types.InitializeResult:
186191 raise RuntimeError (f"Unsupported protocol version from the server: { result .protocol_version } " )
187192
188193 self ._server_capabilities = result .capabilities
194+ self ._server_info = result .server_info
189195
190196 await self .send_notification (types .InitializedNotification ())
197+ self ._initialized_sent = True
191198
192199 return result
193200
@@ -198,6 +205,34 @@ def get_server_capabilities(self) -> types.ServerCapabilities | None:
198205 """
199206 return self ._server_capabilities
200207
208+ def get_session_state (self ) -> SessionState :
209+ """Extract a serializable snapshot of the current session state.
210+
211+ This allows the session state to be stored in external storage
212+ (Redis, database, etc.) for distributed deployments.
213+
214+ Returns:
215+ A SessionState object containing the serializable state
216+ """
217+ from mcp .shared .version import LATEST_PROTOCOL_VERSION
218+
219+ return SessionState (
220+ session_id = self ._session_id ,
221+ protocol_version = LATEST_PROTOCOL_VERSION ,
222+ next_request_id = self ._request_id ,
223+ server_capabilities = (
224+ self ._server_capabilities .model_dump (by_alias = True , mode = "json" , exclude_none = True )
225+ if self ._server_capabilities
226+ else None
227+ ),
228+ server_info = (
229+ self ._server_info .model_dump (by_alias = True , mode = "json" , exclude_none = True )
230+ if self ._server_info
231+ else None
232+ ),
233+ initialized_sent = self ._initialized_sent ,
234+ )
235+
201236 @property
202237 def experimental (self ) -> ExperimentalClientFeatures :
203238 """Experimental APIs for tasks and other features.
0 commit comments