[BUG] MCP client silently drops all tools when third-party server includes outputSchema in tools/list response

Resolved 💬 5 comments Opened Feb 11, 2026 by jpicklyk Closed Mar 31, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

When a third-party MCP server (not claude mcp serve) includes outputSchema, title, or toolAnnotations fields in its tools/list response — as defined by the MCP 2025-11-25 specification — Claude Code's MCP client silently fails to register all tools from that server.

The MCP server shows as connected (resources via ListMcpResourcesTool and ReadMcpResourceTool work correctly), but zero tools appear in Claude Code's tool list. There are no error messages visible to the user.

This differs from existing reports (#24742, #10031) which are about claude mcp serve acting as a server. This bug is about Claude Code acting as an MCP client consuming a third-party server.

What Should Happen?

Claude Code should either:

  1. Parse and use the outputSchema, title, and toolAnnotations fields from MCP 2025-11-25, or
  2. Gracefully ignore unknown/unsupported fields and still register the tools

Error Messages/Logs

No error messages are shown to the user. The tools simply do not appear.
MCP resources from the same server work fine — only tools are affected.

Steps to Reproduce

  1. Create an MCP server (any language/SDK) that registers tools with outputSchema in the tools/list response. For example, using the Kotlin MCP SDK 0.8.3:
server.addTool(
    name = "query_container",
    description = "Query containers",
    inputSchema = myInputSchema,
    title = "Query Container",                    // MCP 2025-11-25
    outputSchema = ToolSchema(buildJsonObject {    // MCP 2025-11-25
        put("type", "object")
        put("description", "Response data")
    }),
    toolAnnotations = ToolAnnotations(             // MCP 2025-11-25
        readOnlyHint = true,
        destructiveHint = false,
        idempotentHint = true,
        openWorldHint = false
    )
) { request -> /* handler */ }
  1. Configure Claude Code to connect to this MCP server (via stdio or Docker)
  2. Start Claude Code — the server connects successfully
  3. ListMcpResourcesTool returns resources from the server (confirming connection)
  4. No MCP tools from this server appear in Claude Code's available tools
  1. Comment out title, outputSchema, and toolAnnotations from the addTool() call
  2. Rebuild and restart
  3. All tools now appear and work correctly

Claude Model

Opus

Is this a regression?

I don't know

Claude Code Version

2.1.38

Platform

Anthropic API

Operating System

Windows

Terminal/Shell

Windows Terminal

Additional Information

Server details: Kotlin-based MCP server using io.modelcontextprotocol:kotlin-sdk:0.8.3, running in Docker via stdio transport. The server registers 13 tools and 18 resources.

Narrowing the cause: The issue is specifically in the tools/list response parsing — when the same server omits outputSchema, title, and toolAnnotations from tool registration (but keeps everything else identical, including structuredContent in CallToolResult responses), all 13 tools appear and work correctly.

Workaround: Comment out outputSchema, title, and toolAnnotations in the server's tool registration. structuredContent in tool responses can remain enabled without issue.

Related issues:

  • #24742 — outputSchema advertised but structuredContent null (about claude mcp serve, not third-party servers)
  • #10031 — outputSchema missing type field breaks tool display (closed, fixed for claude mcp serve)
  • #2682 — MCP tools not available despite connection (may be same root cause for some reporters)

View original on GitHub ↗

This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗