From 1637b70524b6ba6211e0bd2782ade4d8c7104c82 Mon Sep 17 00:00:00 2001 From: Antonio Molner Date: Wed, 23 Jul 2025 10:14:11 -0500 Subject: [PATCH] feat: add support for disabling output validation for tools --- src/mcp/client/session.py | 3 ++- src/mcp/server/lowlevel/server.py | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/mcp/client/session.py b/src/mcp/client/session.py index 1853ce7c1..d7ec86a53 100644 --- a/src/mcp/client/session.py +++ b/src/mcp/client/session.py @@ -287,6 +287,7 @@ async def call_tool( arguments: dict[str, Any] | None = None, read_timeout_seconds: timedelta | None = None, progress_callback: ProgressFnT | None = None, + validate_output: bool = True, ) -> types.CallToolResult: """Send a tools/call request with optional progress callback support.""" @@ -305,7 +306,7 @@ async def call_tool( progress_callback=progress_callback, ) - if not result.isError: + if not result.isError and validate_output: await self._validate_tool_result(name, result) return result diff --git a/src/mcp/server/lowlevel/server.py b/src/mcp/server/lowlevel/server.py index 562de31b7..14a84c74b 100644 --- a/src/mcp/server/lowlevel/server.py +++ b/src/mcp/server/lowlevel/server.py @@ -423,11 +423,12 @@ async def _get_cached_tool_definition(self, tool_name: str) -> types.Tool | None return tool - def call_tool(self, *, validate_input: bool = True): + def call_tool(self, *, validate_input: bool = True, validate_output: bool = True): """Register a tool call handler. Args: validate_input: If True, validates input against inputSchema. Default is True. + validate_output: If True, validates output against outputSchema. Default is True. The handler validates input against inputSchema (if validate_input=True), calls the tool function, and builds a CallToolResult with the results: @@ -486,10 +487,11 @@ async def handler(req: types.CallToolRequest): "Output validation error: outputSchema defined but no structured output returned" ) else: - try: - jsonschema.validate(instance=maybe_structured_content, schema=tool.outputSchema) - except jsonschema.ValidationError as e: - return self._make_error_result(f"Output validation error: {e.message}") + if validate_output: + try: + jsonschema.validate(instance=maybe_structured_content, schema=tool.outputSchema) + except jsonschema.ValidationError as e: + return self._make_error_result(f"Output validation error: {e.message}") # result return types.ServerResult(