88import { getIsolationScope , withIsolationScope } from '../../currentScopes' ;
99import { startInactiveSpan , withActiveSpan } from '../../tracing' ;
1010import { fill } from '../../utils/object' ;
11+ import { MCP_PROTOCOL_VERSION_ATTRIBUTE } from './attributes' ;
1112import { cleanupPendingSpansForTransport , completeSpanWithResults , storeSpanForRequest } from './correlation' ;
1213import { captureError } from './errorCapture' ;
13- import { extractSessionDataFromInitializeRequest , extractSessionDataFromInitializeResponse } from './sessionExtraction' ;
14+ import {
15+ buildClientAttributesFromInfo ,
16+ extractSessionDataFromInitializeRequest ,
17+ extractSessionDataFromInitializeResponse ,
18+ } from './sessionExtraction' ;
1419import {
1520 cleanupSessionDataForTransport ,
1621 storeSessionDataForTransport ,
1722 updateSessionDataForTransport ,
1823} from './sessionManagement' ;
1924import { buildMcpServerSpanConfig , createMcpNotificationSpan , createMcpOutgoingNotificationSpan } from './spans' ;
20- import type { ExtraHandlerData , MCPTransport } from './types' ;
25+ import type { ExtraHandlerData , MCPTransport , SessionData } from './types' ;
2126import { isJsonRpcNotification , isJsonRpcRequest , isJsonRpcResponse , isValidContentItem } from './validation' ;
2227
2328/**
@@ -31,10 +36,13 @@ export function wrapTransportOnMessage(transport: MCPTransport): void {
3136 fill ( transport , 'onmessage' , originalOnMessage => {
3237 return function ( this : MCPTransport , message : unknown , extra ?: unknown ) {
3338 if ( isJsonRpcRequest ( message ) ) {
34- if ( message . method === 'initialize' ) {
39+ const isInitialize = message . method === 'initialize' ;
40+ let initSessionData : SessionData | undefined ;
41+
42+ if ( isInitialize ) {
3543 try {
36- const sessionData = extractSessionDataFromInitializeRequest ( message ) ;
37- storeSessionDataForTransport ( this , sessionData ) ;
44+ initSessionData = extractSessionDataFromInitializeRequest ( message ) ;
45+ storeSessionDataForTransport ( this , initSessionData ) ;
3846 } catch {
3947 // noop
4048 }
@@ -46,6 +54,16 @@ export function wrapTransportOnMessage(transport: MCPTransport): void {
4654 const spanConfig = buildMcpServerSpanConfig ( message , this , extra as ExtraHandlerData ) ;
4755 const span = startInactiveSpan ( spanConfig ) ;
4856
57+ // For initialize requests, add client info directly to span (works even for stateless transports)
58+ if ( isInitialize && initSessionData ) {
59+ span . setAttributes ( {
60+ ...buildClientAttributesFromInfo ( initSessionData . clientInfo ) ,
61+ ...( initSessionData . protocolVersion && {
62+ [ MCP_PROTOCOL_VERSION_ATTRIBUTE ] : initSessionData . protocolVersion ,
63+ } ) ,
64+ } ) ;
65+ }
66+
4967 storeSpanForRequest ( this , message . id , span , message . method ) ;
5068
5169 return withActiveSpan ( span , ( ) => {
0 commit comments