diff --git a/sentry_sdk/integrations/mcp.py b/sentry_sdk/integrations/mcp.py index 8b9fca40c8..db3191c656 100644 --- a/sentry_sdk/integrations/mcp.py +++ b/sentry_sdk/integrations/mcp.py @@ -178,33 +178,6 @@ def _get_request_context_data( return request_id, session_id, mcp_transport -def _get_span_config( - handler_type: str, item_name: str -) -> "tuple[str, str, str, Optional[str]]": - """ - Get span configuration based on handler type. - - Returns: - Tuple of (span_data_key, span_name, mcp_method_name, result_data_key) - Note: result_data_key is None for resources - """ - if handler_type == "tool": - span_data_key = SPANDATA.MCP_TOOL_NAME - mcp_method_name = "tools/call" - result_data_key = SPANDATA.MCP_TOOL_RESULT_CONTENT - elif handler_type == "prompt": - span_data_key = SPANDATA.MCP_PROMPT_NAME - mcp_method_name = "prompts/get" - result_data_key = SPANDATA.MCP_PROMPT_RESULT_MESSAGE_CONTENT - else: # resource - span_data_key = SPANDATA.MCP_RESOURCE_URI - mcp_method_name = "resources/read" - result_data_key = None # Resources don't capture result content - - span_name = f"{mcp_method_name} {item_name}" - return span_data_key, span_name, mcp_method_name, result_data_key - - def _set_span_input_data( span: "Union[StreamedSpan, Span]", handler_name: str, @@ -508,10 +481,6 @@ async def _tool_handler_wrapper( "tool", original_args, original_kwargs ) - span_data_key, span_name, mcp_method_name, result_data_key = _get_span_config( - "tool", handler_name - ) - # Get request ID, session ID, and transport from context request_id, session_id, mcp_transport = _get_request_context_data(ctx=ctx) @@ -522,7 +491,7 @@ async def _tool_handler_wrapper( span_mgr: "Union[Span, StreamedSpan]" if span_streaming: span_mgr = sentry_sdk.traces.start_span( - name=span_name, + name=f"tools/call {handler_name}", attributes={ "sentry.op": OP.MCP_SERVER, "sentry.origin": MCPIntegration.origin, @@ -531,7 +500,7 @@ async def _tool_handler_wrapper( else: span_mgr = get_start_span_function()( op=OP.MCP_SERVER, - name=span_name, + name=f"tools/call {handler_name}", origin=MCPIntegration.origin, ) @@ -540,8 +509,8 @@ async def _tool_handler_wrapper( _set_span_input_data( span, handler_name, - span_data_key, - mcp_method_name, + SPANDATA.MCP_TOOL_NAME, + "tools/call", arguments, request_id, session_id, @@ -563,7 +532,9 @@ async def _tool_handler_wrapper( sentry_sdk.capture_exception(e) raise - _set_span_output_data(span, result, result_data_key, "tool") + _set_span_output_data( + span, result, SPANDATA.MCP_TOOL_RESULT_CONTENT, "tool" + ) return result @@ -608,10 +579,6 @@ async def _prompt_handler_wrapper( "prompt", original_args, original_kwargs ) - span_data_key, span_name, mcp_method_name, result_data_key = _get_span_config( - "prompt", handler_name - ) - # Get request ID, session ID, and transport from context request_id, session_id, mcp_transport = _get_request_context_data(ctx=ctx) @@ -622,7 +589,7 @@ async def _prompt_handler_wrapper( span_mgr: "Union[Span, StreamedSpan]" if span_streaming: span_mgr = sentry_sdk.traces.start_span( - name=span_name, + name=f"prompts/get {handler_name}", attributes={ "sentry.op": OP.MCP_SERVER, "sentry.origin": MCPIntegration.origin, @@ -631,7 +598,7 @@ async def _prompt_handler_wrapper( else: span_mgr = get_start_span_function()( op=OP.MCP_SERVER, - name=span_name, + name=f"prompts/get {handler_name}", origin=MCPIntegration.origin, ) @@ -640,8 +607,8 @@ async def _prompt_handler_wrapper( _set_span_input_data( span, handler_name, - span_data_key, - mcp_method_name, + SPANDATA.MCP_PROMPT_NAME, + "prompts/get", arguments, request_id, session_id, @@ -661,7 +628,9 @@ async def _prompt_handler_wrapper( sentry_sdk.capture_exception(e) raise - _set_span_output_data(span, result, result_data_key, "prompt") + _set_span_output_data( + span, result, SPANDATA.MCP_PROMPT_RESULT_MESSAGE_CONTENT, "prompt" + ) return result @@ -708,10 +677,6 @@ async def _resource_handler_wrapper( "resource", original_args, original_kwargs ) - span_data_key, span_name, mcp_method_name, result_data_key = _get_span_config( - "resource", handler_name - ) - # Get request ID, session ID, and transport from context request_id, session_id, mcp_transport = _get_request_context_data(ctx=ctx) @@ -722,7 +687,7 @@ async def _resource_handler_wrapper( span_mgr: "Union[Span, StreamedSpan]" if span_streaming: span_mgr = sentry_sdk.traces.start_span( - name=span_name, + name=f"resources/read {handler_name}", attributes={ "sentry.op": OP.MCP_SERVER, "sentry.origin": MCPIntegration.origin, @@ -731,7 +696,7 @@ async def _resource_handler_wrapper( else: span_mgr = get_start_span_function()( op=OP.MCP_SERVER, - name=span_name, + name=f"resources/read {handler_name}", origin=MCPIntegration.origin, ) @@ -740,8 +705,8 @@ async def _resource_handler_wrapper( _set_span_input_data( span, handler_name, - span_data_key, - mcp_method_name, + SPANDATA.MCP_RESOURCE_URI, + "resources/read", arguments, request_id, session_id, @@ -780,7 +745,7 @@ async def _resource_handler_wrapper( sentry_sdk.capture_exception(e) raise - _set_span_output_data(span, result, result_data_key, "resource") + _set_span_output_data(span, result, None, "resource") return result