Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 19 additions & 54 deletions sentry_sdk/integrations/mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,33 +179,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,
Expand Down Expand Up @@ -518,10 +491,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)

Expand All @@ -532,7 +501,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,
Expand All @@ -541,7 +510,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,
)

Expand All @@ -550,8 +519,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,
Expand All @@ -573,7 +542,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

Expand Down Expand Up @@ -618,10 +589,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)

Expand All @@ -632,7 +599,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,
Expand All @@ -641,7 +608,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,
)

Expand All @@ -650,8 +617,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,
Expand All @@ -671,7 +638,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

Expand Down Expand Up @@ -718,10 +687,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)

Expand All @@ -732,7 +697,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,
Expand All @@ -741,7 +706,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,
)

Expand All @@ -750,8 +715,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,
Expand Down Expand Up @@ -790,7 +755,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

Expand Down
Loading