@@ -66,13 +66,14 @@ async def main():
6666from mcp .server .streamable_http import EventStore
6767from mcp .server .streamable_http_manager import StreamableHTTPASGIApp , StreamableHTTPSessionManager
6868from mcp .server .transport_security import TransportSecuritySettings
69- from mcp .shared ._otel import extract_trace_context , otel_span
69+ from mcp .shared ._otel import build_server_span_attributes , extract_trace_context , otel_span
7070from mcp .shared ._stream_protocols import ReadStream , WriteStream
7171from mcp .shared .exceptions import MCPError
7272from mcp .shared .message import ServerMessageMetadata , SessionMessage
7373from mcp .shared .session import RequestResponder
7474
7575logger = logging .getLogger (__name__ )
76+ MCP_SESSION_ID_HEADER = "mcp-session-id"
7677
7778LifespanResultT = TypeVar ("LifespanResultT" , default = Any )
7879
@@ -454,28 +455,32 @@ async def _handle_request(
454455 # Extract W3C trace context from _meta (SEP-414).
455456 meta = cast (dict [str , Any ] | None , getattr (req .params , "meta" , None )) if req .params else None
456457 parent_context = extract_trace_context (meta ) if meta is not None else None
458+ request_data = None
459+ close_sse_stream_cb = None
460+ close_standalone_sse_stream_cb = None
461+ if message .message_metadata is not None and isinstance (message .message_metadata , ServerMessageMetadata ):
462+ request_data = message .message_metadata .request_context
463+ close_sse_stream_cb = message .message_metadata .close_sse_stream
464+ close_standalone_sse_stream_cb = message .message_metadata .close_standalone_sse_stream
465+ request_headers = getattr (request_data , "headers" , None )
466+ session_id = request_headers .get (MCP_SESSION_ID_HEADER ) if request_headers is not None else None
457467
458468 with otel_span (
459469 span_name ,
460470 kind = SpanKind .SERVER ,
461- attributes = {"mcp.method.name" : req .method , "jsonrpc.request.id" : message .request_id },
471+ attributes = build_server_span_attributes (
472+ service_name = self .name ,
473+ method = req .method ,
474+ request_id = message .request_id ,
475+ params = req .params ,
476+ session_id = session_id ,
477+ ),
462478 context = parent_context ,
463479 ) as span :
464480 if handler := self ._request_handlers .get (req .method ):
465481 logger .debug ("Dispatching request of type %s" , type (req ).__name__ )
466482
467483 try :
468- # Extract request context and close_sse_stream from message metadata
469- request_data = None
470- close_sse_stream_cb = None
471- close_standalone_sse_stream_cb = None
472- if message .message_metadata is not None and isinstance (
473- message .message_metadata , ServerMessageMetadata
474- ):
475- request_data = message .message_metadata .request_context
476- close_sse_stream_cb = message .message_metadata .close_sse_stream
477- close_standalone_sse_stream_cb = message .message_metadata .close_standalone_sse_stream
478-
479484 client_capabilities = session .client_params .capabilities if session .client_params else None
480485 task_support = self ._experimental_handlers .task_support if self ._experimental_handlers else None
481486 # Get task metadata from request params if present
0 commit comments