|
13 | 13 | from pydantic import BaseModel, Field |
14 | 14 |
|
15 | 15 | from mcp.server.fastmcp.utilities.func_metadata import func_metadata |
16 | | -from mcp.types import CallToolResult |
| 16 | +from mcp.types import CallToolResult, TextContent |
17 | 17 |
|
18 | 18 |
|
19 | 19 | class SomeInputModelA(BaseModel): |
@@ -878,6 +878,24 @@ def func_returning_annotated_tool_call_result() -> Annotated[CallToolResult, Per |
878 | 878 | meta.convert_result(func_returning_annotated_tool_call_result()) |
879 | 879 |
|
880 | 880 |
|
| 881 | +def test_tool_call_result_annotated_error_skips_structured_validation(): |
| 882 | + class PersonClass(BaseModel): |
| 883 | + name: str |
| 884 | + |
| 885 | + def func_returning_tool_error() -> Annotated[CallToolResult, PersonClass]: # pragma: no cover |
| 886 | + return CallToolResult(content=[TextContent(type="text", text="Division by zero")], isError=True) |
| 887 | + |
| 888 | + meta = func_metadata(func_returning_tool_error) |
| 889 | + result = meta.convert_result(func_returning_tool_error()) |
| 890 | + |
| 891 | + assert isinstance(result, CallToolResult) |
| 892 | + assert result.isError is True |
| 893 | + assert result.structuredContent is None |
| 894 | + content = result.content[0] |
| 895 | + assert isinstance(content, TextContent) |
| 896 | + assert content.text == "Division by zero" |
| 897 | + |
| 898 | + |
881 | 899 | def test_tool_call_result_in_optional_is_rejected(): |
882 | 900 | """Test that Optional[CallToolResult] raises InvalidSignature""" |
883 | 901 |
|
|
0 commit comments