From 8fee2feb1215ee6ad83a55b7b5b8205015311856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gau=C2=B7Beo?= Date: Sat, 7 Nov 2026 18:40:09 +0700 Subject: [PATCH] fix(otel): mark client span ERROR with tool_error when tools/call returns isError (#3810) --- src/mcp/shared/jsonrpc_dispatcher.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mcp/shared/jsonrpc_dispatcher.py b/src/mcp/shared/jsonrpc_dispatcher.py index 223373da0f..7508e2d0fe 100644 --- a/src/mcp/shared/jsonrpc_dispatcher.py +++ b/src/mcp/shared/jsonrpc_dispatcher.py @@ -418,6 +418,9 @@ async def send_raw_request( code = str(outcome.code) span.set_attributes({"error.type": code, "rpc.response.status_code": code}) span.set_status(StatusCode.ERROR, outcome.message) + elif method == "tools/call" and isinstance(outcome, Mapping) and outcome.get("isError") is True: + span.set_attribute("error.type", "tool_error") + span.set_status(StatusCode.ERROR) except TimeoutError: if not timeout_armed: # The clock starts only after the write, so this TimeoutError is the