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 8c459383c..3612cb2f5 100644 --- a/src/mcp/server/lowlevel/server.py +++ b/src/mcp/server/lowlevel/server.py @@ -422,11 +422,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: @@ -485,10 +486,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(