Skip to content

[v1.x] Server-side outputSchema validation blocks tool error reporting (isError: true) #2429

Open

Description

@kimsehwan96

Initial Checks

Description

When a tool handler returns unstructured content for an error case, the low-level server's call_tool decorator validates the output against outputSchema before checking if the response is an error.

This prevents tools with outputSchema from reporting errors via isError: true, as the validation fails with "outputSchema defined but no structured output returned", replacing the original error message.

This was already fixed in the TypeScript SDK via modelcontextprotocol/typescript-sdk#654 / PR #655 (2025-06-24), but the equivalent fix has not been applied to the Python SDK v1.x branch.

The issue is in src/mcp/server/lowlevel/server.py, the call_tool decorator handler:

  1. Line ~560: outputSchema validation runs unconditionally — should skip when the result is an error
  2. Line ~575: isError=False is hardcoded — there is no path for the handler to signal an error through unstructured content while outputSchema is defined

Example Code

from mcp.server.lowlevel import Server
from mcp import types

server = Server("test")

@server.call_tool()
async def call_tool(name: str, arguments: dict):
    # Tool has outputSchema but needs to return an error
    # This gets blocked by outputSchema validation
    return [types.TextContent(type="text", text="Resource not found")]

Python & MCP Python SDK

- Python: 3.11 / 3.12
- MCP SDK: v1.26.0+ (v1.x branch)

Activity

  1. ghost added
    bugSomething isn't working
    on Apr 17, 2026
  2. ghost added
    ready for workEnough information for someone to start working on
    on Apr 17, 2026
  3. ghost added
    P2Moderate issues affecting some users, edge cases, potentially valuable feature
    on Apr 17, 2026
  4. ghost added
    fix proposedBot has a verified fix diff in the comment
    on Apr 17, 2026
  5. added 6 commits that reference this issue on Apr 18, 2026
    87ef671
    9494c17
    223f5dc
    d75eb72
    a3e240c
    979f326
  6. RanjithHiremath commented on Apr 26, 2026

    @RanjithHiremath

    Hi, would like to take this one. Plan:

    1. Fix at src/mcp/server/mcpserver/utilities/func_metadata.py:106 — gate the output_model.model_validate(...) call on not result.is_error, matching the TypeScript SDK's resolution in typescript-sdk#655.
    2. Regression test mirroring that PR: register a tool with output_schema, return CallToolResult(is_error=True), assert the unstructured error content reaches the client unmodified.
    3. v1.x backport as a follow-up PR (src/mcp/server/fastmcp/utilities/func_metadata.py:115, same change with the v1.x camelCase fields).

    One thing I noticed but think is out of scope for this issue — src/mcp/client/session.py:336 has the same pattern client-side: it raises RuntimeError("Tool ... has an output schema but did not return structured content") without first checking result.is_error. Different surface, same bug shape. Happy to file a separate issue once this PR is in.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Moderate issues affecting some users, edge cases, potentially valuable featurebugSomething isn't workingfix proposedBot has a verified fix diff in the commentready for workEnough information for someone to start working on

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions