fix: detect plain JSON Schema objects in tool() overload resolution#2010
Open
aayushbaluni wants to merge 2 commits intomodelcontextprotocol:mainfrom
Open
fix: detect plain JSON Schema objects in tool() overload resolution#2010aayushbaluni wants to merge 2 commits intomodelcontextprotocol:mainfrom
aayushbaluni wants to merge 2 commits intomodelcontextprotocol:mainfrom
Conversation
🦋 Changeset detectedLatest commit: 1a5fea9 The changes in this PR will be included in the next version bump. This PR includes changesets to release 5 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
@modelcontextprotocol/client
@modelcontextprotocol/server
@modelcontextprotocol/express
@modelcontextprotocol/fastify
@modelcontextprotocol/hono
@modelcontextprotocol/node
commit: |
2685c73 to
d80e40e
Compare
When a plain JSON Schema object (with type/properties) was passed to server.tool(), the overload resolver incorrectly treated it as ToolAnnotations, causing inputSchema to be silently dropped from the wire protocol. Fixes modelcontextprotocol#1585
7302ec9 to
1a5fea9
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The deprecated
McpServer.tool()variadic overloads were removed during the v2 migration, but callers still rely on them (see issue #1585). When they passed(name, description, plainJsonSchema, handler), older implementations routed any non-Zod object into the ToolAnnotations branch. Plain JSON Schema objects (with nestedproperties, etc.) were therefore stored as annotations andinputSchemastayed unset, sotools/listexposed an empty object schema and arguments were not validated or forwarded correctly.Fix
tool()onMcpServerwith positional overloads equivalent to the common v1 shapes (tool(name, schema, cb)andtool(name, description, schema, cb)).normalizeRawShapeSchema) → plain JSON Schema (structural heuristic +fromJsonSchema()) → ToolAnnotations-only objects (title,*Hintbooleans).TypeErrorwhen the object matches none of these shapes (replacing silent data loss).Note: TypeScript overloads for the rare
(name, paramsSchema, annotations, cb)/ five-argument forms were omitted because they collide with the description overload; those combinations remain supported at runtime viaregisterTool.Testing
packages/server/test/server/mcp.compat.test.ts: plain JSON Schema preservesdirectory_id(and required) throughstandardSchemaToJsonSchema, annotations-only registration yields empty wire input schema and preserved annotations ontools/list, unrecognized objects throw, andtools/callvalidates JSON Schema tools end-to-end.Fixes #1585
Made with Cursor