@@ -66,7 +66,7 @@ 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
@@ -455,32 +455,28 @@ async def _handle_request(
455455 # Extract W3C trace context from _meta (SEP-414).
456456 meta = cast (dict [str , Any ] | None , getattr (req .params , "meta" , None )) if req .params else None
457457 parent_context = extract_trace_context (meta ) if meta is not None else None
458- request_data = None
458+ server_message_metadata = (
459+ message .message_metadata if isinstance (message .message_metadata , ServerMessageMetadata ) else None
460+ )
461+ request_data = server_message_metadata .request_context if server_message_metadata is not None else None
459462 close_sse_stream_cb = None
460463 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
464+ if server_message_metadata is not None :
465+ close_sse_stream_cb = server_message_metadata .close_sse_stream
466+ close_standalone_sse_stream_cb = server_message_metadata .close_standalone_sse_stream
465467 request_headers = getattr (request_data , "headers" , None )
466468 session_id = request_headers .get (MCP_SESSION_ID_HEADER ) if request_headers is not None else None
467- span_attributes : dict [str , Any ] = {
468- "rpc.system" : "mcp" ,
469- "rpc.service" : self .name ,
470- "rpc.method" : req .method ,
471- "mcp.method.name" : req .method ,
472- "jsonrpc.request.id" : message .request_id ,
473- }
474- resource_uri = getattr (req .params , "uri" , None )
475- if resource_uri is not None :
476- span_attributes ["mcp.resource.uri" ] = str (resource_uri )
477- if session_id is not None :
478- span_attributes ["mcp.session.id" ] = session_id
479469
480470 with otel_span (
481471 span_name ,
482472 kind = SpanKind .SERVER ,
483- attributes = span_attributes ,
473+ attributes = build_server_span_attributes (
474+ service_name = self .name ,
475+ method = req .method ,
476+ request_id = message .request_id ,
477+ params = req .params ,
478+ session_id = session_id ,
479+ ),
484480 context = parent_context ,
485481 ) as span :
486482 if handler := self ._request_handlers .get (req .method ):
0 commit comments