@@ -28,6 +28,7 @@ class McpInstrumentor(BaseInstrumentor):
28
28
29
29
_DEFAULT_CLIENT_SPAN_NAME = "span.mcp.client"
30
30
_DEFAULT_SERVER_SPAN_NAME = "span.mcp.server"
31
+ _MCP_SESSION_ID_HEADER = "mcp-session-id"
31
32
32
33
def __init__ (self , ** kwargs ):
33
34
super ().__init__ ()
@@ -226,8 +227,12 @@ async def _wrap_server_message_handler(
226
227
with self .tracer .start_as_current_span (
227
228
self ._DEFAULT_SERVER_SPAN_NAME , kind = SpanKind .SERVER , context = parent_ctx
228
229
) as server_span :
230
+
231
+ # Extract session ID if available
232
+ session_id = self ._extract_session_id (args )
233
+ if session_id :
234
+ server_span .set_attribute (MCPSpanAttributes .MCP_SESSION_ID , session_id )
229
235
230
- server_span .set_attribute (SpanAttributes .RPC_SERVICE , instance .name )
231
236
self ._generate_mcp_message_attrs (server_span , incoming_msg , request_id )
232
237
233
238
try :
@@ -238,7 +243,27 @@ async def _wrap_server_message_handler(
238
243
server_span .set_status (Status (StatusCode .ERROR , str (e )))
239
244
server_span .record_exception (e )
240
245
raise
241
-
246
+
247
+ def _extract_session_id (self , args : Tuple [Any , ...]) -> Optional [str ]:
248
+ """
249
+ Extract session ID from server method arguments.
250
+ """
251
+ try :
252
+ from mcp .shared .session import RequestResponder # pylint: disable=import-outside-toplevel
253
+ from mcp .shared .message import ServerMessageMetadata # pylint: disable=import-outside-toplevel
254
+
255
+ message = args [0 ]
256
+ if isinstance (message , RequestResponder ):
257
+ if message .message_metadata and isinstance (message .message_metadata , ServerMessageMetadata ):
258
+ request_context = message .message_metadata .request_context
259
+ if request_context :
260
+ headers = getattr (request_context , 'headers' , None )
261
+ if headers :
262
+ return headers .get (self ._MCP_SESSION_ID_HEADER )
263
+ return None
264
+ except Exception :
265
+ return None
266
+
242
267
@staticmethod
243
268
def _generate_mcp_message_attrs (span : trace .Span , message , request_id : Optional [int ]) -> None :
244
269
import mcp .types as types # pylint: disable=import-outside-toplevel,consider-using-from-import
0 commit comments