[BUG] MCP client silently drops all tools when third-party server includes outputSchema in tools/list response
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:
- Parse and use the
outputSchema,title, andtoolAnnotationsfields from MCP 2025-11-25, or - 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
- Create an MCP server (any language/SDK) that registers tools with
outputSchemain thetools/listresponse. 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 */ }
- Configure Claude Code to connect to this MCP server (via stdio or Docker)
- Start Claude Code — the server connects successfully
ListMcpResourcesToolreturns resources from the server (confirming connection)- No MCP tools from this server appear in Claude Code's available tools
- Comment out
title,outputSchema, andtoolAnnotationsfrom theaddTool()call - Rebuild and restart
- 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 —
outputSchemaadvertised butstructuredContentnull (aboutclaude mcp serve, not third-party servers) - #10031 —
outputSchemamissingtypefield breaks tool display (closed, fixed forclaude mcp serve) - #2682 — MCP tools not available despite connection (may be same root cause for some reporters)
This issue has 5 comments on GitHub. Read the full discussion on GitHub ↗