1212from sentry_sdk .integrations .mcp import MCPIntegration
1313from sentry_sdk .integrations .mcp .transport import (
1414 detect_mcp_transport_from_context ,
15- mcp_session_id_ctx ,
15+ get_session_id_from_context ,
1616)
1717from sentry_sdk .utils import safe_serialize
1818
2424 from typing import Any , Callable
2525
2626
27+ def _get_request_context_data ():
28+ # type: () -> tuple[str | None, str | None]
29+ """
30+ Extract request ID and session ID from the MCP request context.
31+
32+ Returns:
33+ Tuple of (request_id, session_id). Either value may be None if not available.
34+ """
35+ request_id = None # type: str | None
36+ session_id = None # type: str | None
37+
38+ try :
39+ ctx = request_ctx .get ()
40+ request_id = ctx .request_id
41+ session_id = get_session_id_from_context (ctx )
42+ except LookupError :
43+ # No request context available
44+ pass
45+
46+ return request_id , session_id
47+
48+
2749def _get_span_config (handler_type , item_name ):
2850 # type: (str, str) -> tuple[str, str, str, str | None]
2951 """
@@ -51,9 +73,15 @@ def _get_span_config(handler_type, item_name):
5173
5274
5375def _set_span_input_data (
54- span , handler_name , span_data_key , mcp_method_name , arguments , request_id = None
76+ span ,
77+ handler_name ,
78+ span_data_key ,
79+ mcp_method_name ,
80+ arguments ,
81+ request_id = None ,
82+ session_id = None ,
5583):
56- # type: (Any, str, str, str, dict[str, Any], str | None) -> None
84+ # type: (Any, str, str, str, dict[str, Any], str | None, str | None ) -> None
5785 """Set input span data for MCP handlers."""
5886 # Set handler identifier
5987 span .set_data (span_data_key , handler_name )
@@ -69,19 +97,14 @@ def _set_span_input_data(
6997 # No request context available - likely stdio
7098 span .set_data (SPANDATA .MCP_TRANSPORT , "pipe" )
7199
72- # Extract session ID from context variable if available (HTTP transport)
73- try :
74- session_id = mcp_session_id_ctx .get ()
75- if session_id :
76- span .set_data (SPANDATA .MCP_SESSION_ID , session_id )
77- except Exception :
78- # Session ID not available or transport module not imported
79- pass
80-
81100 # Set request_id if provided
82101 if request_id :
83102 span .set_data (SPANDATA .MCP_REQUEST_ID , request_id )
84103
104+ # Set session_id if provided
105+ if session_id :
106+ span .set_data (SPANDATA .MCP_SESSION_ID , session_id )
107+
85108 # Set request arguments (excluding common request context objects)
86109 for k , v in arguments .items ():
87110 span .set_data (f"mcp.request.argument.{ k } " , safe_serialize (v ))
@@ -262,13 +285,8 @@ async def _async_handler_wrapper(handler_type, func, original_args):
262285 name = span_name ,
263286 origin = MCPIntegration .origin ,
264287 ) as span :
265- # Get request ID from context
266- request_id = None
267- try :
268- ctx = request_ctx .get ()
269- request_id = ctx .request_id
270- except LookupError :
271- pass
288+ # Get request ID and session ID from context
289+ request_id , session_id = _get_request_context_data ()
272290
273291 # Set input span data
274292 _set_span_input_data (
@@ -278,6 +296,7 @@ async def _async_handler_wrapper(handler_type, func, original_args):
278296 mcp_method_name ,
279297 arguments ,
280298 request_id ,
299+ session_id ,
281300 )
282301
283302 # For resources, extract and set protocol
@@ -329,13 +348,8 @@ def _sync_handler_wrapper(handler_type, func, original_args):
329348 name = span_name ,
330349 origin = MCPIntegration .origin ,
331350 ) as span :
332- # Get request ID from context
333- request_id = None
334- try :
335- ctx = request_ctx .get ()
336- request_id = ctx .request_id
337- except LookupError :
338- pass
351+ # Get request ID and session ID from context
352+ request_id , session_id = _get_request_context_data ()
339353
340354 # Set input span data
341355 _set_span_input_data (
@@ -345,6 +359,7 @@ def _sync_handler_wrapper(handler_type, func, original_args):
345359 mcp_method_name ,
346360 arguments ,
347361 request_id ,
362+ session_id ,
348363 )
349364
350365 # For resources, extract and set protocol
0 commit comments