fix(server): omit derived tool schema titles - #3400
Conversation
|
This PR has been closed automatically. It's still a draft, but we close those early so you don't put in more time only to have it closed the moment you mark it ready. This repo only keeps pull requests open when they come from a maintainer, or from a contributor a maintainer has assigned to the linked issue, and you aren't currently assigned to #3391. If a maintainer assigns you to #3391, this PR reopens on its own and there's nothing more you need to do here. Assignment is a maintainer call based on capacity; comments that only ask to be assigned don't factor in. What does help is engaging on the issue itself by confirming the repro, explaining why it matters for your use case, or describing the approach you'd take. You're welcome to keep pushing commits here (just avoid force-pushing, since GitHub can't reopen a rewritten branch), but that on its own won't get the PR reviewed or the issue assigned, and realistically most auto-closed PRs stay closed. There's no need to open a new PR either way. CONTRIBUTING.md has the full reasoning, but in short:
Maintainers: reopen, remove |
Problem
Pydantic derives a title from every tool argument name in the published JSON Schema. For example,
exercise_idbecomes"title": "Exercise Id"; the title repeats the property key and increases the tool schema sent to models on every request.Root Cause
Tool.from_functioncalls Pydantic's defaultmodel_json_schema, whose generator adds field-name titles whenever a field does not provide an explicit title.Solution
Use a strict schema generator for tool input models that disables only Pydantic's automatic field-name title generation. Explicit
Field(title=...)metadata remains unchanged.Changes
NoTitleJsonSchema, based on the existing strict generator, withfield_title_should_be_setdisabled.Tool.from_functionbuilds the input schema.Testing
py -3.10 -m pytest -q --noconftest tests/server/mcpserver/test_title.py tests/server/mcpserver/test_func_metadata.py(passed: 64)py -3.10 -m ruff check src/mcp/server/mcpserver/utilities/func_metadata.py src/mcp/server/mcpserver/tools/base.py tests/server/mcpserver/test_title.py(passed)py -3.10 -m ruff format --check src/mcp/server/mcpserver/utilities/func_metadata.py src/mcp/server/mcpserver/tools/base.py tests/server/mcpserver/test_title.py(passed)py -3.10 -m compileall -q src/mcp/server/mcpserver/utilities/func_metadata.py src/mcp/server/mcpserver/tools/base.py tests/server/mcpserver/test_title.py(passed)git diff --check(passed)mcp-typesenvironment; the targeted runtime and static checks above passed.Compatibility/Risk
This changes only generated tool input schemas. It removes redundant auto-derived property titles while preserving explicit titles and all other validation metadata. Consumers that depended on Pydantic's derived titles may observe a smaller schema, but property names and types are unchanged.
Notes for Reviewer
Please confirm that removing default property titles is the desired default for MCP tool schemas, and whether output schemas, prompts, or resource templates should follow in a separate change.
Linked Issue
Closes #3391