Skip to content

Commit 3ce00f9

Browse files
fix: skip outputSchema validation when CallToolResult.is_error=True
1 parent 3d7b311 commit 3ce00f9

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

src/mcp/server/mcpserver/utilities/func_metadata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def convert_result(self, result: Any) -> Any:
103103
the structured output.
104104
"""
105105
if isinstance(result, CallToolResult):
106-
if self.output_schema is not None:
106+
if self.output_schema is not None and not result.is_error:
107107
assert self.output_model is not None, "Output model must be set if output schema is defined"
108108
self.output_model.model_validate(result.structured_content)
109109
return result

tests/server/mcpserver/test_func_metadata.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,24 @@ def func_returning_annotated_tool_call_result() -> Annotated[CallToolResult, Per
875875
meta.convert_result(func_returning_annotated_tool_call_result())
876876

877877

878+
def test_tool_call_result_with_is_error_skips_output_schema_validation():
879+
"""Test that convert_result skips outputSchema validation when is_error=True."""
880+
881+
class PersonClass(BaseModel):
882+
name: str
883+
884+
def func_with_error() -> Annotated[CallToolResult, PersonClass]:
885+
return CallToolResult(content=[], is_error=True)
886+
887+
meta = func_metadata(func_with_error)
888+
assert meta.output_schema is not None
889+
890+
result = meta.convert_result(func_with_error())
891+
892+
assert isinstance(result, CallToolResult)
893+
assert result.is_error is True
894+
895+
878896
def test_tool_call_result_in_optional_is_rejected():
879897
"""Test that Optional[CallToolResult] raises InvalidSignature"""
880898

0 commit comments

Comments
 (0)