Skip to content

fix(server): omit derived tool schema titles - #3400

Closed
daleselaji-dev wants to merge 1 commit into
modelcontextprotocol:mainfrom
daleselaji-dev:codex/reduce-mcp-tool-schema-titles-3391
Closed

fix(server): omit derived tool schema titles#3400
daleselaji-dev wants to merge 1 commit into
modelcontextprotocol:mainfrom
daleselaji-dev:codex/reduce-mcp-tool-schema-titles-3391

Conversation

@daleselaji-dev

Copy link
Copy Markdown

Problem

Pydantic derives a title from every tool argument name in the published JSON Schema. For example, exercise_id becomes "title": "Exercise Id"; the title repeats the property key and increases the tool schema sent to models on every request.

Root Cause

Tool.from_function calls Pydantic's default model_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

  • Add NoTitleJsonSchema, based on the existing strict generator, with field_title_should_be_set disabled.
  • Use it when Tool.from_function builds the input schema.
  • Add an integration regression test covering both derived and explicit field titles.

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)
  • Full typecheck was not verified locally because the partial Git checkout did not contain the configured mcp-types environment; 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

@github-actions github-actions Bot added the missing-issue-link Auto-closed: PR needs a linked issue assigned to its author (see CONTRIBUTING.md) label Aug 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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:

  • We're a small team with very little capacity to review community PRs right now.
  • Many recent PRs are AI-generated with little human review, and reviewing one carefully still costs a maintainer as much time as it ever did. A well-described issue is usually more useful to us than the code.

Maintainers: reopen, remove missing-issue-link, or add bypass-issue-check to override.

@github-actions github-actions Bot closed this Aug 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

missing-issue-link Auto-closed: PR needs a linked issue assigned to its author (see CONTRIBUTING.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool input schemas carry a pydantic-derived title on every property

1 participant