fix: remove unnecessary fields from tools' inputSchema - #856

Merged
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847
May 28, 2026
Merged

fix: remove unnecessary fields from tools' inputSchema#856
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847

Conversation

@fpoli

@fpolifpoli commented May 19, 2026

Copy link
Copy Markdown
Contributor

This PR cleans up the inputSchema generation of MCP tools, removing the unnecessary top-level fields mentioned in #847.

In more detail, the PR adds a schema_for_input wrapper around schema_for_type. The wrapper prepares the inputSchema of macro-generated tool descriptions, removing the top-level title and description fields (i.e. the type name and doc of T in Parameters<T>).

Motivation and Context

See #847. To sum up, I think the top-level title and description fields are unnecessary:

  1. They are not useful. They describe a wrapper type (the T in Parameters<T>) that should not be leaked to the LLM. See these examples. What matters is the type and docs of the fields of T, which remain in the inputSchema and are not modified by this PR.
  2. The fields are not required by the MCP specification (schema). They add noise that can reach the model and consume context tokens.

How Has This Been Tested?

By adding a test_list_tools_result.rs, which compares the tool description against a reference description in a JSON file.

(No) Breaking Changes

The top-level title and description disappear from the inputSchema. This is not a breaking change because the fields are not part of the MCP specification.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Fixes#847.

@fpoli
fpoli requested a review from a team as a code ownerMay 19, 2026 13:05
@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes T-handler Handler implementation changes T-macros Macro changes T-model Model/data structure changes labels May 19, 2026
@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label May 19, 2026
@fpolifpoli changed the title fix: Remove unnecessary fields from tools' inputSchemafix: remove unnecessary fields from tools' inputSchemaMay 19, 2026

@jamadeojamadeo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me

@DaleSeo

Copy link
Copy Markdown
Member

Thanks for your contribution, @fpoli! I'm merging it now!

@DaleSeo
DaleSeo merged commit 53e4410 into modelcontextprotocol:mainMay 28, 2026
18 checks passed
@github-actionsgithub-actionsBot mentioned this pull request May 28, 2026
jrmelsha added a commit to UserGeneratedLLC/rmcp-rust-sdk that referenced this pull request Jun 15, 2026
Brings in upstream v1.6.1..266f870 (15 commits): protocol-version
negotiation/init-mismatch fixes, input/outputSchema strip+validate
(modelcontextprotocol#856/modelcontextprotocol#860), tool-argument errors as tool results (modelcontextprotocol#894), OAuth issuer
validation + OIDC application_type + offline_access reauth, roots/
sampling/logging deprecation (SEP-2577), empty-2xx notification handling.
Conflict resolutions (fork changes preserved):
- handler/server/common.rs: kept both test blocks. Upstream's
validate_and_strip / schema_for_input layer composes on top of the
fork's ReplaceBoolSchemas normalization in schema_for_type.
- handler/server/router/tool.rs: combined upstream's
into_tool_argument_error dispatch with the anthropic-ext
normalize_call_tool_result post-processing (result kept mutable).
Restored .githooks/commit-msg, which upstream modelcontextprotocol#898 deleted incidentally
in an unrelated "progress demo" change; the hook gates our conventional-
commit workflow and skips merge commits.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-documentationDocumentation improvementsT-handlerHandler implementation changesT-macrosMacro changesT-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool listing returns unnecessary fields

4 participants

@fpoli@DaleSeo@alexhancock@jamadeo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: remove unnecessary fields from tools' inputSchema - #856

Merged
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847
May 28, 2026
Merged

fix: remove unnecessary fields from tools' inputSchema#856
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847

Conversation

@fpoli

@fpolifpoli commented May 19, 2026

Copy link
Copy Markdown
Contributor

This PR cleans up the inputSchema generation of MCP tools, removing the unnecessary top-level fields mentioned in #847.

In more detail, the PR adds a schema_for_input wrapper around schema_for_type. The wrapper prepares the inputSchema of macro-generated tool descriptions, removing the top-level title and description fields (i.e. the type name and doc of T in Parameters<T>).

Motivation and Context

See #847. To sum up, I think the top-level title and description fields are unnecessary:

  1. They are not useful. They describe a wrapper type (the T in Parameters<T>) that should not be leaked to the LLM. See these examples. What matters is the type and docs of the fields of T, which remain in the inputSchema and are not modified by this PR.
  2. The fields are not required by the MCP specification (schema). They add noise that can reach the model and consume context tokens.

How Has This Been Tested?

By adding a test_list_tools_result.rs, which compares the tool description against a reference description in a JSON file.

(No) Breaking Changes

The top-level title and description disappear from the inputSchema. This is not a breaking change because the fields are not part of the MCP specification.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Fixes#847.

@fpoli
fpoli requested a review from a team as a code ownerMay 19, 2026 13:05
@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes T-handler Handler implementation changes T-macros Macro changes T-model Model/data structure changes labels May 19, 2026
@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label May 19, 2026
@fpolifpoli changed the title fix: Remove unnecessary fields from tools' inputSchemafix: remove unnecessary fields from tools' inputSchemaMay 19, 2026

@jamadeojamadeo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me

@DaleSeo

Copy link
Copy Markdown
Member

Thanks for your contribution, @fpoli! I'm merging it now!

@DaleSeo
DaleSeo merged commit 53e4410 into modelcontextprotocol:mainMay 28, 2026
18 checks passed
@github-actionsgithub-actionsBot mentioned this pull request May 28, 2026
jrmelsha added a commit to UserGeneratedLLC/rmcp-rust-sdk that referenced this pull request Jun 15, 2026
Brings in upstream v1.6.1..266f870 (15 commits): protocol-version
negotiation/init-mismatch fixes, input/outputSchema strip+validate
(modelcontextprotocol#856/modelcontextprotocol#860), tool-argument errors as tool results (modelcontextprotocol#894), OAuth issuer
validation + OIDC application_type + offline_access reauth, roots/
sampling/logging deprecation (SEP-2577), empty-2xx notification handling.
Conflict resolutions (fork changes preserved):
- handler/server/common.rs: kept both test blocks. Upstream's
validate_and_strip / schema_for_input layer composes on top of the
fork's ReplaceBoolSchemas normalization in schema_for_type.
- handler/server/router/tool.rs: combined upstream's
into_tool_argument_error dispatch with the anthropic-ext
normalize_call_tool_result post-processing (result kept mutable).
Restored .githooks/commit-msg, which upstream modelcontextprotocol#898 deleted incidentally
in an unrelated "progress demo" change; the hook gates our conventional-
commit workflow and skips merge commits.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-documentationDocumentation improvementsT-handlerHandler implementation changesT-macrosMacro changesT-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool listing returns unnecessary fields

4 participants

@fpoli@DaleSeo@alexhancock@jamadeo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: remove unnecessary fields from tools' inputSchema - #856

Merged
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847
May 28, 2026
Merged

fix: remove unnecessary fields from tools' inputSchema#856
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847

Conversation

@fpoli

@fpolifpoli commented May 19, 2026

Copy link
Copy Markdown
Contributor

This PR cleans up the inputSchema generation of MCP tools, removing the unnecessary top-level fields mentioned in #847.

In more detail, the PR adds a schema_for_input wrapper around schema_for_type. The wrapper prepares the inputSchema of macro-generated tool descriptions, removing the top-level title and description fields (i.e. the type name and doc of T in Parameters<T>).

Motivation and Context

See #847. To sum up, I think the top-level title and description fields are unnecessary:

  1. They are not useful. They describe a wrapper type (the T in Parameters<T>) that should not be leaked to the LLM. See these examples. What matters is the type and docs of the fields of T, which remain in the inputSchema and are not modified by this PR.
  2. The fields are not required by the MCP specification (schema). They add noise that can reach the model and consume context tokens.

How Has This Been Tested?

By adding a test_list_tools_result.rs, which compares the tool description against a reference description in a JSON file.

(No) Breaking Changes

The top-level title and description disappear from the inputSchema. This is not a breaking change because the fields are not part of the MCP specification.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Fixes#847.

@fpoli
fpoli requested a review from a team as a code ownerMay 19, 2026 13:05
@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes T-handler Handler implementation changes T-macros Macro changes T-model Model/data structure changes labels May 19, 2026
@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label May 19, 2026
@fpolifpoli changed the title fix: Remove unnecessary fields from tools' inputSchemafix: remove unnecessary fields from tools' inputSchemaMay 19, 2026

@jamadeojamadeo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me

@DaleSeo

Copy link
Copy Markdown
Member

Thanks for your contribution, @fpoli! I'm merging it now!

@DaleSeo
DaleSeo merged commit 53e4410 into modelcontextprotocol:mainMay 28, 2026
18 checks passed
@github-actionsgithub-actionsBot mentioned this pull request May 28, 2026
jrmelsha added a commit to UserGeneratedLLC/rmcp-rust-sdk that referenced this pull request Jun 15, 2026
Brings in upstream v1.6.1..266f870 (15 commits): protocol-version
negotiation/init-mismatch fixes, input/outputSchema strip+validate
(modelcontextprotocol#856/modelcontextprotocol#860), tool-argument errors as tool results (modelcontextprotocol#894), OAuth issuer
validation + OIDC application_type + offline_access reauth, roots/
sampling/logging deprecation (SEP-2577), empty-2xx notification handling.
Conflict resolutions (fork changes preserved):
- handler/server/common.rs: kept both test blocks. Upstream's
validate_and_strip / schema_for_input layer composes on top of the
fork's ReplaceBoolSchemas normalization in schema_for_type.
- handler/server/router/tool.rs: combined upstream's
into_tool_argument_error dispatch with the anthropic-ext
normalize_call_tool_result post-processing (result kept mutable).
Restored .githooks/commit-msg, which upstream modelcontextprotocol#898 deleted incidentally
in an unrelated "progress demo" change; the hook gates our conventional-
commit workflow and skips merge commits.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-documentationDocumentation improvementsT-handlerHandler implementation changesT-macrosMacro changesT-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool listing returns unnecessary fields

4 participants

@fpoli@DaleSeo@alexhancock@jamadeo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: remove unnecessary fields from tools' inputSchema - #856

Merged
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847
May 28, 2026
Merged

fix: remove unnecessary fields from tools' inputSchema#856
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847

Conversation

@fpoli

@fpolifpoli commented May 19, 2026

Copy link
Copy Markdown
Contributor

This PR cleans up the inputSchema generation of MCP tools, removing the unnecessary top-level fields mentioned in #847.

In more detail, the PR adds a schema_for_input wrapper around schema_for_type. The wrapper prepares the inputSchema of macro-generated tool descriptions, removing the top-level title and description fields (i.e. the type name and doc of T in Parameters<T>).

Motivation and Context

See #847. To sum up, I think the top-level title and description fields are unnecessary:

  1. They are not useful. They describe a wrapper type (the T in Parameters<T>) that should not be leaked to the LLM. See these examples. What matters is the type and docs of the fields of T, which remain in the inputSchema and are not modified by this PR.
  2. The fields are not required by the MCP specification (schema). They add noise that can reach the model and consume context tokens.

How Has This Been Tested?

By adding a test_list_tools_result.rs, which compares the tool description against a reference description in a JSON file.

(No) Breaking Changes

The top-level title and description disappear from the inputSchema. This is not a breaking change because the fields are not part of the MCP specification.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Fixes#847.

@fpoli
fpoli requested a review from a team as a code ownerMay 19, 2026 13:05
@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes T-handler Handler implementation changes T-macros Macro changes T-model Model/data structure changes labels May 19, 2026
@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label May 19, 2026
@fpolifpoli changed the title fix: Remove unnecessary fields from tools' inputSchemafix: remove unnecessary fields from tools' inputSchemaMay 19, 2026

@jamadeojamadeo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me

@DaleSeo

Copy link
Copy Markdown
Member

Thanks for your contribution, @fpoli! I'm merging it now!

@DaleSeo
DaleSeo merged commit 53e4410 into modelcontextprotocol:mainMay 28, 2026
18 checks passed
@github-actionsgithub-actionsBot mentioned this pull request May 28, 2026
jrmelsha added a commit to UserGeneratedLLC/rmcp-rust-sdk that referenced this pull request Jun 15, 2026
Brings in upstream v1.6.1..266f870 (15 commits): protocol-version
negotiation/init-mismatch fixes, input/outputSchema strip+validate
(modelcontextprotocol#856/modelcontextprotocol#860), tool-argument errors as tool results (modelcontextprotocol#894), OAuth issuer
validation + OIDC application_type + offline_access reauth, roots/
sampling/logging deprecation (SEP-2577), empty-2xx notification handling.
Conflict resolutions (fork changes preserved):
- handler/server/common.rs: kept both test blocks. Upstream's
validate_and_strip / schema_for_input layer composes on top of the
fork's ReplaceBoolSchemas normalization in schema_for_type.
- handler/server/router/tool.rs: combined upstream's
into_tool_argument_error dispatch with the anthropic-ext
normalize_call_tool_result post-processing (result kept mutable).
Restored .githooks/commit-msg, which upstream modelcontextprotocol#898 deleted incidentally
in an unrelated "progress demo" change; the hook gates our conventional-
commit workflow and skips merge commits.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-documentationDocumentation improvementsT-handlerHandler implementation changesT-macrosMacro changesT-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool listing returns unnecessary fields

4 participants

@fpoli@DaleSeo@alexhancock@jamadeo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: remove unnecessary fields from tools' inputSchema - #856

Merged
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847
May 28, 2026
Merged

fix: remove unnecessary fields from tools' inputSchema#856
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847

Conversation

@fpoli

@fpolifpoli commented May 19, 2026

Copy link
Copy Markdown
Contributor

This PR cleans up the inputSchema generation of MCP tools, removing the unnecessary top-level fields mentioned in #847.

In more detail, the PR adds a schema_for_input wrapper around schema_for_type. The wrapper prepares the inputSchema of macro-generated tool descriptions, removing the top-level title and description fields (i.e. the type name and doc of T in Parameters<T>).

Motivation and Context

See #847. To sum up, I think the top-level title and description fields are unnecessary:

  1. They are not useful. They describe a wrapper type (the T in Parameters<T>) that should not be leaked to the LLM. See these examples. What matters is the type and docs of the fields of T, which remain in the inputSchema and are not modified by this PR.
  2. The fields are not required by the MCP specification (schema). They add noise that can reach the model and consume context tokens.

How Has This Been Tested?

By adding a test_list_tools_result.rs, which compares the tool description against a reference description in a JSON file.

(No) Breaking Changes

The top-level title and description disappear from the inputSchema. This is not a breaking change because the fields are not part of the MCP specification.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Fixes#847.

@fpoli
fpoli requested a review from a team as a code ownerMay 19, 2026 13:05
@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes T-handler Handler implementation changes T-macros Macro changes T-model Model/data structure changes labels May 19, 2026
@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label May 19, 2026
@fpolifpoli changed the title fix: Remove unnecessary fields from tools' inputSchemafix: remove unnecessary fields from tools' inputSchemaMay 19, 2026

@jamadeojamadeo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me

@DaleSeo

Copy link
Copy Markdown
Member

Thanks for your contribution, @fpoli! I'm merging it now!

@DaleSeo
DaleSeo merged commit 53e4410 into modelcontextprotocol:mainMay 28, 2026
18 checks passed
@github-actionsgithub-actionsBot mentioned this pull request May 28, 2026
jrmelsha added a commit to UserGeneratedLLC/rmcp-rust-sdk that referenced this pull request Jun 15, 2026
Brings in upstream v1.6.1..266f870 (15 commits): protocol-version
negotiation/init-mismatch fixes, input/outputSchema strip+validate
(modelcontextprotocol#856/modelcontextprotocol#860), tool-argument errors as tool results (modelcontextprotocol#894), OAuth issuer
validation + OIDC application_type + offline_access reauth, roots/
sampling/logging deprecation (SEP-2577), empty-2xx notification handling.
Conflict resolutions (fork changes preserved):
- handler/server/common.rs: kept both test blocks. Upstream's
validate_and_strip / schema_for_input layer composes on top of the
fork's ReplaceBoolSchemas normalization in schema_for_type.
- handler/server/router/tool.rs: combined upstream's
into_tool_argument_error dispatch with the anthropic-ext
normalize_call_tool_result post-processing (result kept mutable).
Restored .githooks/commit-msg, which upstream modelcontextprotocol#898 deleted incidentally
in an unrelated "progress demo" change; the hook gates our conventional-
commit workflow and skips merge commits.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-documentationDocumentation improvementsT-handlerHandler implementation changesT-macrosMacro changesT-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool listing returns unnecessary fields

4 participants

@fpoli@DaleSeo@alexhancock@jamadeo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: remove unnecessary fields from tools' inputSchema - #856

Merged
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847
May 28, 2026
Merged

fix: remove unnecessary fields from tools' inputSchema#856
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847

Conversation

@fpoli

@fpolifpoli commented May 19, 2026

Copy link
Copy Markdown
Contributor

This PR cleans up the inputSchema generation of MCP tools, removing the unnecessary top-level fields mentioned in #847.

In more detail, the PR adds a schema_for_input wrapper around schema_for_type. The wrapper prepares the inputSchema of macro-generated tool descriptions, removing the top-level title and description fields (i.e. the type name and doc of T in Parameters<T>).

Motivation and Context

See #847. To sum up, I think the top-level title and description fields are unnecessary:

  1. They are not useful. They describe a wrapper type (the T in Parameters<T>) that should not be leaked to the LLM. See these examples. What matters is the type and docs of the fields of T, which remain in the inputSchema and are not modified by this PR.
  2. The fields are not required by the MCP specification (schema). They add noise that can reach the model and consume context tokens.

How Has This Been Tested?

By adding a test_list_tools_result.rs, which compares the tool description against a reference description in a JSON file.

(No) Breaking Changes

The top-level title and description disappear from the inputSchema. This is not a breaking change because the fields are not part of the MCP specification.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Fixes#847.

@fpoli
fpoli requested a review from a team as a code ownerMay 19, 2026 13:05
@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes T-handler Handler implementation changes T-macros Macro changes T-model Model/data structure changes labels May 19, 2026
@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label May 19, 2026
@fpolifpoli changed the title fix: Remove unnecessary fields from tools' inputSchemafix: remove unnecessary fields from tools' inputSchemaMay 19, 2026

@jamadeojamadeo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me

@DaleSeo

Copy link
Copy Markdown
Member

Thanks for your contribution, @fpoli! I'm merging it now!

@DaleSeo
DaleSeo merged commit 53e4410 into modelcontextprotocol:mainMay 28, 2026
18 checks passed
@github-actionsgithub-actionsBot mentioned this pull request May 28, 2026
jrmelsha added a commit to UserGeneratedLLC/rmcp-rust-sdk that referenced this pull request Jun 15, 2026
Brings in upstream v1.6.1..266f870 (15 commits): protocol-version
negotiation/init-mismatch fixes, input/outputSchema strip+validate
(modelcontextprotocol#856/modelcontextprotocol#860), tool-argument errors as tool results (modelcontextprotocol#894), OAuth issuer
validation + OIDC application_type + offline_access reauth, roots/
sampling/logging deprecation (SEP-2577), empty-2xx notification handling.
Conflict resolutions (fork changes preserved):
- handler/server/common.rs: kept both test blocks. Upstream's
validate_and_strip / schema_for_input layer composes on top of the
fork's ReplaceBoolSchemas normalization in schema_for_type.
- handler/server/router/tool.rs: combined upstream's
into_tool_argument_error dispatch with the anthropic-ext
normalize_call_tool_result post-processing (result kept mutable).
Restored .githooks/commit-msg, which upstream modelcontextprotocol#898 deleted incidentally
in an unrelated "progress demo" change; the hook gates our conventional-
commit workflow and skips merge commits.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-documentationDocumentation improvementsT-handlerHandler implementation changesT-macrosMacro changesT-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool listing returns unnecessary fields

4 participants

@fpoli@DaleSeo@alexhancock@jamadeo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: remove unnecessary fields from tools' inputSchema - #856

Merged
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847
May 28, 2026
Merged

fix: remove unnecessary fields from tools' inputSchema#856
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847

Conversation

@fpoli

@fpolifpoli commented May 19, 2026

Copy link
Copy Markdown
Contributor

This PR cleans up the inputSchema generation of MCP tools, removing the unnecessary top-level fields mentioned in #847.

In more detail, the PR adds a schema_for_input wrapper around schema_for_type. The wrapper prepares the inputSchema of macro-generated tool descriptions, removing the top-level title and description fields (i.e. the type name and doc of T in Parameters<T>).

Motivation and Context

See #847. To sum up, I think the top-level title and description fields are unnecessary:

  1. They are not useful. They describe a wrapper type (the T in Parameters<T>) that should not be leaked to the LLM. See these examples. What matters is the type and docs of the fields of T, which remain in the inputSchema and are not modified by this PR.
  2. The fields are not required by the MCP specification (schema). They add noise that can reach the model and consume context tokens.

How Has This Been Tested?

By adding a test_list_tools_result.rs, which compares the tool description against a reference description in a JSON file.

(No) Breaking Changes

The top-level title and description disappear from the inputSchema. This is not a breaking change because the fields are not part of the MCP specification.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Fixes#847.

@fpoli
fpoli requested a review from a team as a code ownerMay 19, 2026 13:05
@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes T-handler Handler implementation changes T-macros Macro changes T-model Model/data structure changes labels May 19, 2026
@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label May 19, 2026
@fpolifpoli changed the title fix: Remove unnecessary fields from tools' inputSchemafix: remove unnecessary fields from tools' inputSchemaMay 19, 2026

@jamadeojamadeo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me

@DaleSeo

Copy link
Copy Markdown
Member

Thanks for your contribution, @fpoli! I'm merging it now!

@DaleSeo
DaleSeo merged commit 53e4410 into modelcontextprotocol:mainMay 28, 2026
18 checks passed
@github-actionsgithub-actionsBot mentioned this pull request May 28, 2026
jrmelsha added a commit to UserGeneratedLLC/rmcp-rust-sdk that referenced this pull request Jun 15, 2026
Brings in upstream v1.6.1..266f870 (15 commits): protocol-version
negotiation/init-mismatch fixes, input/outputSchema strip+validate
(modelcontextprotocol#856/modelcontextprotocol#860), tool-argument errors as tool results (modelcontextprotocol#894), OAuth issuer
validation + OIDC application_type + offline_access reauth, roots/
sampling/logging deprecation (SEP-2577), empty-2xx notification handling.
Conflict resolutions (fork changes preserved):
- handler/server/common.rs: kept both test blocks. Upstream's
validate_and_strip / schema_for_input layer composes on top of the
fork's ReplaceBoolSchemas normalization in schema_for_type.
- handler/server/router/tool.rs: combined upstream's
into_tool_argument_error dispatch with the anthropic-ext
normalize_call_tool_result post-processing (result kept mutable).
Restored .githooks/commit-msg, which upstream modelcontextprotocol#898 deleted incidentally
in an unrelated "progress demo" change; the hook gates our conventional-
commit workflow and skips merge commits.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-documentationDocumentation improvementsT-handlerHandler implementation changesT-macrosMacro changesT-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool listing returns unnecessary fields

4 participants

@fpoli@DaleSeo@alexhancock@jamadeo
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: remove unnecessary fields from tools' inputSchema - #856

Merged
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847
May 28, 2026
Merged

fix: remove unnecessary fields from tools' inputSchema#856
DaleSeo merged 1 commit into
modelcontextprotocol:mainfrom
fpoli:fpoli/issue-847

Conversation

@fpoli

@fpolifpoli commented May 19, 2026

Copy link
Copy Markdown
Contributor

This PR cleans up the inputSchema generation of MCP tools, removing the unnecessary top-level fields mentioned in #847.

In more detail, the PR adds a schema_for_input wrapper around schema_for_type. The wrapper prepares the inputSchema of macro-generated tool descriptions, removing the top-level title and description fields (i.e. the type name and doc of T in Parameters<T>).

Motivation and Context

See #847. To sum up, I think the top-level title and description fields are unnecessary:

  1. They are not useful. They describe a wrapper type (the T in Parameters<T>) that should not be leaked to the LLM. See these examples. What matters is the type and docs of the fields of T, which remain in the inputSchema and are not modified by this PR.
  2. The fields are not required by the MCP specification (schema). They add noise that can reach the model and consume context tokens.

How Has This Been Tested?

By adding a test_list_tools_result.rs, which compares the tool description against a reference description in a JSON file.

(No) Breaking Changes

The top-level title and description disappear from the inputSchema. This is not a breaking change because the fields are not part of the MCP specification.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Fixes#847.

@fpoli
fpoli requested a review from a team as a code ownerMay 19, 2026 13:05
@github-actionsgithub-actionsBot added T-test Testing related changes T-config Configuration file changes T-core Core library changes T-handler Handler implementation changes T-macros Macro changes T-model Model/data structure changes labels May 19, 2026
@github-actionsgithub-actionsBot added the T-documentation Documentation improvements label May 19, 2026
@fpolifpoli changed the title fix: Remove unnecessary fields from tools' inputSchemafix: remove unnecessary fields from tools' inputSchemaMay 19, 2026

@jamadeojamadeo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense to me

@DaleSeo

Copy link
Copy Markdown
Member

Thanks for your contribution, @fpoli! I'm merging it now!

@DaleSeo
DaleSeo merged commit 53e4410 into modelcontextprotocol:mainMay 28, 2026
18 checks passed
@github-actionsgithub-actionsBot mentioned this pull request May 28, 2026
jrmelsha added a commit to UserGeneratedLLC/rmcp-rust-sdk that referenced this pull request Jun 15, 2026
Brings in upstream v1.6.1..266f870 (15 commits): protocol-version
negotiation/init-mismatch fixes, input/outputSchema strip+validate
(modelcontextprotocol#856/modelcontextprotocol#860), tool-argument errors as tool results (modelcontextprotocol#894), OAuth issuer
validation + OIDC application_type + offline_access reauth, roots/
sampling/logging deprecation (SEP-2577), empty-2xx notification handling.
Conflict resolutions (fork changes preserved):
- handler/server/common.rs: kept both test blocks. Upstream's
validate_and_strip / schema_for_input layer composes on top of the
fork's ReplaceBoolSchemas normalization in schema_for_type.
- handler/server/router/tool.rs: combined upstream's
into_tool_argument_error dispatch with the anthropic-ext
normalize_call_tool_result post-processing (result kept mutable).
Restored .githooks/commit-msg, which upstream modelcontextprotocol#898 deleted incidentally
in an unrelated "progress demo" change; the hook gates our conventional-
commit workflow and skips merge commits.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T-configConfiguration file changesT-coreCore library changesT-documentationDocumentation improvementsT-handlerHandler implementation changesT-macrosMacro changesT-modelModel/data structure changesT-testTesting related changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tool listing returns unnecessary fields

4 participants

@fpoli@DaleSeo@alexhancock@jamadeo