[v1.x backport] Use correct schema for client sampling validation when tools are present - #1407

Merged
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x
Jan 20, 2026
Merged

[v1.x backport] Use correct schema for client sampling validation when tools are present#1407
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x

Conversation

@olaservo

Copy link
Copy Markdown
Member

Summary

Backport of #1347 to v1.x branch for inclusion in a v1.x.x point release.

Fix client-side sampling validation to use CreateMessageResultWithToolsSchema when tools are present in the request, preventing false validation failures for tool_use responses.

Motivation and Context

When a client sampling handler returns tool_use content formatted as an array, validation fails with "Invalid input: expected object, received array". This occurs because the client always validates against CreateMessageResultSchema regardless of whether tools were included in the request.

  • CreateMessageResultSchema expects single content blocks (text, image, or audio only)
  • CreateMessageResultWithToolsSchema supports array content with tool_use/tool_result blocks

This mirrors the server-side fix from PR #1156, which the client-side code missed.

Fixes#1346

How Has This Been Tested?

Added 5 new integration tests in test/client/index.test.ts:

  1. Array content with tool_use when request includes tools - Verifies handler can return [{ type: 'tool_use', ... }]
  2. Single content when request includes tools - Verifies backwards compatibility
  3. Single content when request has no tools - Verifies standard non-tool flow
  4. Reject array content when request has no tools - Ensures validation still enforces single content for non-tool requests
  5. Array content when request includes toolChoice - Verifies toolChoice also triggers the correct schema

All tests pass.

Breaking Changes

None

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

🦉 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

…sent
When a sampling request includes tools or toolChoice, the client now validates
the response against CreateMessageResultWithToolsSchema (which supports array
content with tool_use blocks) instead of always using CreateMessageResultSchema.
This fixes validation failures when client handlers return tool_use content
formatted as an array, which was incorrectly rejected with "Invalid input:
expected object, received array".
Fixesmodelcontextprotocol#1346
🦉 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@olaservo
olaservo requested a review from a team as a code ownerJanuary 19, 2026 17:31
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9a89eba

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/sdk@1407

commit: 9a89eba

@pcarletonpcarleton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thanks ola!!

@pcarleton
pcarleton merged commit 12ae856 into modelcontextprotocol:v1.xJan 20, 2026
6 checks passed
sgmakgg added a commit to boringstudio-org/mcp-gitea that referenced this pull request Mar 13, 2026
…#17)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@modelcontextprotocol/sdk](https://modelcontextprotocol.io) ([source](https://github.com/modelcontextprotocol/typescript-sdk)) | dependencies | patch | [`1.25.2` → `1.25.3`](https://renovatebot.com/diffs/npm/@modelcontextprotocol%2fsdk/1.25.2/1.25.3) |
---
### Release Notes
<details>
<summary>modelcontextprotocol/typescript-sdk (@&#8203;modelcontextprotocol/sdk)</summary>
### [`v1.25.3`](https://github.com/modelcontextprotocol/typescript-sdk/releases/tag/v1.25.3)
[Compare Source](modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3)
#### What's Changed
- \[v1.x backport] Use correct schema for client sampling validation when tools are present by [@&#8203;olaservo](https://github.com/olaservo) in [#&#8203;1407](modelcontextprotocol/typescript-sdk#1407)
- fix: prevent Hono from overriding global Response object (v1.x) by [@&#8203;mattzcarey](https://github.com/mattzcarey) in [#&#8203;1411](modelcontextprotocol/typescript-sdk#1411)
**Full Changelog**: <modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3>
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Co-authored-by: Renovate Bot <renovate@boringstudio.by>
Co-authored-by: ChubbChubbs <sgmakgg@gmail.com>
Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/17
Co-authored-by: boring-bot <bot@boringstudio.by>
Co-committed-by: boring-bot <bot@boringstudio.by>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@olaservo@pcarleton
, '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

[v1.x backport] Use correct schema for client sampling validation when tools are present - #1407

Merged
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x
Jan 20, 2026
Merged

[v1.x backport] Use correct schema for client sampling validation when tools are present#1407
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x

Conversation

@olaservo

Copy link
Copy Markdown
Member

Summary

Backport of #1347 to v1.x branch for inclusion in a v1.x.x point release.

Fix client-side sampling validation to use CreateMessageResultWithToolsSchema when tools are present in the request, preventing false validation failures for tool_use responses.

Motivation and Context

When a client sampling handler returns tool_use content formatted as an array, validation fails with "Invalid input: expected object, received array". This occurs because the client always validates against CreateMessageResultSchema regardless of whether tools were included in the request.

  • CreateMessageResultSchema expects single content blocks (text, image, or audio only)
  • CreateMessageResultWithToolsSchema supports array content with tool_use/tool_result blocks

This mirrors the server-side fix from PR #1156, which the client-side code missed.

Fixes#1346

How Has This Been Tested?

Added 5 new integration tests in test/client/index.test.ts:

  1. Array content with tool_use when request includes tools - Verifies handler can return [{ type: 'tool_use', ... }]
  2. Single content when request includes tools - Verifies backwards compatibility
  3. Single content when request has no tools - Verifies standard non-tool flow
  4. Reject array content when request has no tools - Ensures validation still enforces single content for non-tool requests
  5. Array content when request includes toolChoice - Verifies toolChoice also triggers the correct schema

All tests pass.

Breaking Changes

None

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

🦉 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

…sent
When a sampling request includes tools or toolChoice, the client now validates
the response against CreateMessageResultWithToolsSchema (which supports array
content with tool_use blocks) instead of always using CreateMessageResultSchema.
This fixes validation failures when client handlers return tool_use content
formatted as an array, which was incorrectly rejected with "Invalid input:
expected object, received array".
Fixesmodelcontextprotocol#1346
🦉 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@olaservo
olaservo requested a review from a team as a code ownerJanuary 19, 2026 17:31
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9a89eba

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/sdk@1407

commit: 9a89eba

@pcarletonpcarleton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thanks ola!!

@pcarleton
pcarleton merged commit 12ae856 into modelcontextprotocol:v1.xJan 20, 2026
6 checks passed
sgmakgg added a commit to boringstudio-org/mcp-gitea that referenced this pull request Mar 13, 2026
…#17)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@modelcontextprotocol/sdk](https://modelcontextprotocol.io) ([source](https://github.com/modelcontextprotocol/typescript-sdk)) | dependencies | patch | [`1.25.2` → `1.25.3`](https://renovatebot.com/diffs/npm/@modelcontextprotocol%2fsdk/1.25.2/1.25.3) |
---
### Release Notes
<details>
<summary>modelcontextprotocol/typescript-sdk (@&#8203;modelcontextprotocol/sdk)</summary>
### [`v1.25.3`](https://github.com/modelcontextprotocol/typescript-sdk/releases/tag/v1.25.3)
[Compare Source](modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3)
#### What's Changed
- \[v1.x backport] Use correct schema for client sampling validation when tools are present by [@&#8203;olaservo](https://github.com/olaservo) in [#&#8203;1407](modelcontextprotocol/typescript-sdk#1407)
- fix: prevent Hono from overriding global Response object (v1.x) by [@&#8203;mattzcarey](https://github.com/mattzcarey) in [#&#8203;1411](modelcontextprotocol/typescript-sdk#1411)
**Full Changelog**: <modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3>
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Co-authored-by: Renovate Bot <renovate@boringstudio.by>
Co-authored-by: ChubbChubbs <sgmakgg@gmail.com>
Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/17
Co-authored-by: boring-bot <bot@boringstudio.by>
Co-committed-by: boring-bot <bot@boringstudio.by>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@olaservo@pcarleton
, '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

[v1.x backport] Use correct schema for client sampling validation when tools are present - #1407

Merged
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x
Jan 20, 2026
Merged

[v1.x backport] Use correct schema for client sampling validation when tools are present#1407
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x

Conversation

@olaservo

Copy link
Copy Markdown
Member

Summary

Backport of #1347 to v1.x branch for inclusion in a v1.x.x point release.

Fix client-side sampling validation to use CreateMessageResultWithToolsSchema when tools are present in the request, preventing false validation failures for tool_use responses.

Motivation and Context

When a client sampling handler returns tool_use content formatted as an array, validation fails with "Invalid input: expected object, received array". This occurs because the client always validates against CreateMessageResultSchema regardless of whether tools were included in the request.

  • CreateMessageResultSchema expects single content blocks (text, image, or audio only)
  • CreateMessageResultWithToolsSchema supports array content with tool_use/tool_result blocks

This mirrors the server-side fix from PR #1156, which the client-side code missed.

Fixes#1346

How Has This Been Tested?

Added 5 new integration tests in test/client/index.test.ts:

  1. Array content with tool_use when request includes tools - Verifies handler can return [{ type: 'tool_use', ... }]
  2. Single content when request includes tools - Verifies backwards compatibility
  3. Single content when request has no tools - Verifies standard non-tool flow
  4. Reject array content when request has no tools - Ensures validation still enforces single content for non-tool requests
  5. Array content when request includes toolChoice - Verifies toolChoice also triggers the correct schema

All tests pass.

Breaking Changes

None

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

🦉 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

…sent
When a sampling request includes tools or toolChoice, the client now validates
the response against CreateMessageResultWithToolsSchema (which supports array
content with tool_use blocks) instead of always using CreateMessageResultSchema.
This fixes validation failures when client handlers return tool_use content
formatted as an array, which was incorrectly rejected with "Invalid input:
expected object, received array".
Fixesmodelcontextprotocol#1346
🦉 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@olaservo
olaservo requested a review from a team as a code ownerJanuary 19, 2026 17:31
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9a89eba

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/sdk@1407

commit: 9a89eba

@pcarletonpcarleton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thanks ola!!

@pcarleton
pcarleton merged commit 12ae856 into modelcontextprotocol:v1.xJan 20, 2026
6 checks passed
sgmakgg added a commit to boringstudio-org/mcp-gitea that referenced this pull request Mar 13, 2026
…#17)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@modelcontextprotocol/sdk](https://modelcontextprotocol.io) ([source](https://github.com/modelcontextprotocol/typescript-sdk)) | dependencies | patch | [`1.25.2` → `1.25.3`](https://renovatebot.com/diffs/npm/@modelcontextprotocol%2fsdk/1.25.2/1.25.3) |
---
### Release Notes
<details>
<summary>modelcontextprotocol/typescript-sdk (@&#8203;modelcontextprotocol/sdk)</summary>
### [`v1.25.3`](https://github.com/modelcontextprotocol/typescript-sdk/releases/tag/v1.25.3)
[Compare Source](modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3)
#### What's Changed
- \[v1.x backport] Use correct schema for client sampling validation when tools are present by [@&#8203;olaservo](https://github.com/olaservo) in [#&#8203;1407](modelcontextprotocol/typescript-sdk#1407)
- fix: prevent Hono from overriding global Response object (v1.x) by [@&#8203;mattzcarey](https://github.com/mattzcarey) in [#&#8203;1411](modelcontextprotocol/typescript-sdk#1411)
**Full Changelog**: <modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3>
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Co-authored-by: Renovate Bot <renovate@boringstudio.by>
Co-authored-by: ChubbChubbs <sgmakgg@gmail.com>
Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/17
Co-authored-by: boring-bot <bot@boringstudio.by>
Co-committed-by: boring-bot <bot@boringstudio.by>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@olaservo@pcarleton
, '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

[v1.x backport] Use correct schema for client sampling validation when tools are present - #1407

Merged
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x
Jan 20, 2026
Merged

[v1.x backport] Use correct schema for client sampling validation when tools are present#1407
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x

Conversation

@olaservo

Copy link
Copy Markdown
Member

Summary

Backport of #1347 to v1.x branch for inclusion in a v1.x.x point release.

Fix client-side sampling validation to use CreateMessageResultWithToolsSchema when tools are present in the request, preventing false validation failures for tool_use responses.

Motivation and Context

When a client sampling handler returns tool_use content formatted as an array, validation fails with "Invalid input: expected object, received array". This occurs because the client always validates against CreateMessageResultSchema regardless of whether tools were included in the request.

  • CreateMessageResultSchema expects single content blocks (text, image, or audio only)
  • CreateMessageResultWithToolsSchema supports array content with tool_use/tool_result blocks

This mirrors the server-side fix from PR #1156, which the client-side code missed.

Fixes#1346

How Has This Been Tested?

Added 5 new integration tests in test/client/index.test.ts:

  1. Array content with tool_use when request includes tools - Verifies handler can return [{ type: 'tool_use', ... }]
  2. Single content when request includes tools - Verifies backwards compatibility
  3. Single content when request has no tools - Verifies standard non-tool flow
  4. Reject array content when request has no tools - Ensures validation still enforces single content for non-tool requests
  5. Array content when request includes toolChoice - Verifies toolChoice also triggers the correct schema

All tests pass.

Breaking Changes

None

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

🦉 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

…sent
When a sampling request includes tools or toolChoice, the client now validates
the response against CreateMessageResultWithToolsSchema (which supports array
content with tool_use blocks) instead of always using CreateMessageResultSchema.
This fixes validation failures when client handlers return tool_use content
formatted as an array, which was incorrectly rejected with "Invalid input:
expected object, received array".
Fixesmodelcontextprotocol#1346
🦉 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@olaservo
olaservo requested a review from a team as a code ownerJanuary 19, 2026 17:31
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9a89eba

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/sdk@1407

commit: 9a89eba

@pcarletonpcarleton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thanks ola!!

@pcarleton
pcarleton merged commit 12ae856 into modelcontextprotocol:v1.xJan 20, 2026
6 checks passed
sgmakgg added a commit to boringstudio-org/mcp-gitea that referenced this pull request Mar 13, 2026
…#17)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@modelcontextprotocol/sdk](https://modelcontextprotocol.io) ([source](https://github.com/modelcontextprotocol/typescript-sdk)) | dependencies | patch | [`1.25.2` → `1.25.3`](https://renovatebot.com/diffs/npm/@modelcontextprotocol%2fsdk/1.25.2/1.25.3) |
---
### Release Notes
<details>
<summary>modelcontextprotocol/typescript-sdk (@&#8203;modelcontextprotocol/sdk)</summary>
### [`v1.25.3`](https://github.com/modelcontextprotocol/typescript-sdk/releases/tag/v1.25.3)
[Compare Source](modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3)
#### What's Changed
- \[v1.x backport] Use correct schema for client sampling validation when tools are present by [@&#8203;olaservo](https://github.com/olaservo) in [#&#8203;1407](modelcontextprotocol/typescript-sdk#1407)
- fix: prevent Hono from overriding global Response object (v1.x) by [@&#8203;mattzcarey](https://github.com/mattzcarey) in [#&#8203;1411](modelcontextprotocol/typescript-sdk#1411)
**Full Changelog**: <modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3>
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Co-authored-by: Renovate Bot <renovate@boringstudio.by>
Co-authored-by: ChubbChubbs <sgmakgg@gmail.com>
Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/17
Co-authored-by: boring-bot <bot@boringstudio.by>
Co-committed-by: boring-bot <bot@boringstudio.by>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@olaservo@pcarleton
, '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

[v1.x backport] Use correct schema for client sampling validation when tools are present - #1407

Merged
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x
Jan 20, 2026
Merged

[v1.x backport] Use correct schema for client sampling validation when tools are present#1407
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x

Conversation

@olaservo

Copy link
Copy Markdown
Member

Summary

Backport of #1347 to v1.x branch for inclusion in a v1.x.x point release.

Fix client-side sampling validation to use CreateMessageResultWithToolsSchema when tools are present in the request, preventing false validation failures for tool_use responses.

Motivation and Context

When a client sampling handler returns tool_use content formatted as an array, validation fails with "Invalid input: expected object, received array". This occurs because the client always validates against CreateMessageResultSchema regardless of whether tools were included in the request.

  • CreateMessageResultSchema expects single content blocks (text, image, or audio only)
  • CreateMessageResultWithToolsSchema supports array content with tool_use/tool_result blocks

This mirrors the server-side fix from PR #1156, which the client-side code missed.

Fixes#1346

How Has This Been Tested?

Added 5 new integration tests in test/client/index.test.ts:

  1. Array content with tool_use when request includes tools - Verifies handler can return [{ type: 'tool_use', ... }]
  2. Single content when request includes tools - Verifies backwards compatibility
  3. Single content when request has no tools - Verifies standard non-tool flow
  4. Reject array content when request has no tools - Ensures validation still enforces single content for non-tool requests
  5. Array content when request includes toolChoice - Verifies toolChoice also triggers the correct schema

All tests pass.

Breaking Changes

None

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

🦉 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

…sent
When a sampling request includes tools or toolChoice, the client now validates
the response against CreateMessageResultWithToolsSchema (which supports array
content with tool_use blocks) instead of always using CreateMessageResultSchema.
This fixes validation failures when client handlers return tool_use content
formatted as an array, which was incorrectly rejected with "Invalid input:
expected object, received array".
Fixesmodelcontextprotocol#1346
🦉 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@olaservo
olaservo requested a review from a team as a code ownerJanuary 19, 2026 17:31
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9a89eba

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/sdk@1407

commit: 9a89eba

@pcarletonpcarleton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thanks ola!!

@pcarleton
pcarleton merged commit 12ae856 into modelcontextprotocol:v1.xJan 20, 2026
6 checks passed
sgmakgg added a commit to boringstudio-org/mcp-gitea that referenced this pull request Mar 13, 2026
…#17)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@modelcontextprotocol/sdk](https://modelcontextprotocol.io) ([source](https://github.com/modelcontextprotocol/typescript-sdk)) | dependencies | patch | [`1.25.2` → `1.25.3`](https://renovatebot.com/diffs/npm/@modelcontextprotocol%2fsdk/1.25.2/1.25.3) |
---
### Release Notes
<details>
<summary>modelcontextprotocol/typescript-sdk (@&#8203;modelcontextprotocol/sdk)</summary>
### [`v1.25.3`](https://github.com/modelcontextprotocol/typescript-sdk/releases/tag/v1.25.3)
[Compare Source](modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3)
#### What's Changed
- \[v1.x backport] Use correct schema for client sampling validation when tools are present by [@&#8203;olaservo](https://github.com/olaservo) in [#&#8203;1407](modelcontextprotocol/typescript-sdk#1407)
- fix: prevent Hono from overriding global Response object (v1.x) by [@&#8203;mattzcarey](https://github.com/mattzcarey) in [#&#8203;1411](modelcontextprotocol/typescript-sdk#1411)
**Full Changelog**: <modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3>
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Co-authored-by: Renovate Bot <renovate@boringstudio.by>
Co-authored-by: ChubbChubbs <sgmakgg@gmail.com>
Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/17
Co-authored-by: boring-bot <bot@boringstudio.by>
Co-committed-by: boring-bot <bot@boringstudio.by>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@olaservo@pcarleton
, '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

[v1.x backport] Use correct schema for client sampling validation when tools are present - #1407

Merged
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x
Jan 20, 2026
Merged

[v1.x backport] Use correct schema for client sampling validation when tools are present#1407
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x

Conversation

@olaservo

Copy link
Copy Markdown
Member

Summary

Backport of #1347 to v1.x branch for inclusion in a v1.x.x point release.

Fix client-side sampling validation to use CreateMessageResultWithToolsSchema when tools are present in the request, preventing false validation failures for tool_use responses.

Motivation and Context

When a client sampling handler returns tool_use content formatted as an array, validation fails with "Invalid input: expected object, received array". This occurs because the client always validates against CreateMessageResultSchema regardless of whether tools were included in the request.

  • CreateMessageResultSchema expects single content blocks (text, image, or audio only)
  • CreateMessageResultWithToolsSchema supports array content with tool_use/tool_result blocks

This mirrors the server-side fix from PR #1156, which the client-side code missed.

Fixes#1346

How Has This Been Tested?

Added 5 new integration tests in test/client/index.test.ts:

  1. Array content with tool_use when request includes tools - Verifies handler can return [{ type: 'tool_use', ... }]
  2. Single content when request includes tools - Verifies backwards compatibility
  3. Single content when request has no tools - Verifies standard non-tool flow
  4. Reject array content when request has no tools - Ensures validation still enforces single content for non-tool requests
  5. Array content when request includes toolChoice - Verifies toolChoice also triggers the correct schema

All tests pass.

Breaking Changes

None

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

🦉 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

…sent
When a sampling request includes tools or toolChoice, the client now validates
the response against CreateMessageResultWithToolsSchema (which supports array
content with tool_use blocks) instead of always using CreateMessageResultSchema.
This fixes validation failures when client handlers return tool_use content
formatted as an array, which was incorrectly rejected with "Invalid input:
expected object, received array".
Fixesmodelcontextprotocol#1346
🦉 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@olaservo
olaservo requested a review from a team as a code ownerJanuary 19, 2026 17:31
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9a89eba

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/sdk@1407

commit: 9a89eba

@pcarletonpcarleton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thanks ola!!

@pcarleton
pcarleton merged commit 12ae856 into modelcontextprotocol:v1.xJan 20, 2026
6 checks passed
sgmakgg added a commit to boringstudio-org/mcp-gitea that referenced this pull request Mar 13, 2026
…#17)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@modelcontextprotocol/sdk](https://modelcontextprotocol.io) ([source](https://github.com/modelcontextprotocol/typescript-sdk)) | dependencies | patch | [`1.25.2` → `1.25.3`](https://renovatebot.com/diffs/npm/@modelcontextprotocol%2fsdk/1.25.2/1.25.3) |
---
### Release Notes
<details>
<summary>modelcontextprotocol/typescript-sdk (@&#8203;modelcontextprotocol/sdk)</summary>
### [`v1.25.3`](https://github.com/modelcontextprotocol/typescript-sdk/releases/tag/v1.25.3)
[Compare Source](modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3)
#### What's Changed
- \[v1.x backport] Use correct schema for client sampling validation when tools are present by [@&#8203;olaservo](https://github.com/olaservo) in [#&#8203;1407](modelcontextprotocol/typescript-sdk#1407)
- fix: prevent Hono from overriding global Response object (v1.x) by [@&#8203;mattzcarey](https://github.com/mattzcarey) in [#&#8203;1411](modelcontextprotocol/typescript-sdk#1411)
**Full Changelog**: <modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3>
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Co-authored-by: Renovate Bot <renovate@boringstudio.by>
Co-authored-by: ChubbChubbs <sgmakgg@gmail.com>
Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/17
Co-authored-by: boring-bot <bot@boringstudio.by>
Co-committed-by: boring-bot <bot@boringstudio.by>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@olaservo@pcarleton
, '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

[v1.x backport] Use correct schema for client sampling validation when tools are present - #1407

Merged
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x
Jan 20, 2026
Merged

[v1.x backport] Use correct schema for client sampling validation when tools are present#1407
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x

Conversation

@olaservo

Copy link
Copy Markdown
Member

Summary

Backport of #1347 to v1.x branch for inclusion in a v1.x.x point release.

Fix client-side sampling validation to use CreateMessageResultWithToolsSchema when tools are present in the request, preventing false validation failures for tool_use responses.

Motivation and Context

When a client sampling handler returns tool_use content formatted as an array, validation fails with "Invalid input: expected object, received array". This occurs because the client always validates against CreateMessageResultSchema regardless of whether tools were included in the request.

  • CreateMessageResultSchema expects single content blocks (text, image, or audio only)
  • CreateMessageResultWithToolsSchema supports array content with tool_use/tool_result blocks

This mirrors the server-side fix from PR #1156, which the client-side code missed.

Fixes#1346

How Has This Been Tested?

Added 5 new integration tests in test/client/index.test.ts:

  1. Array content with tool_use when request includes tools - Verifies handler can return [{ type: 'tool_use', ... }]
  2. Single content when request includes tools - Verifies backwards compatibility
  3. Single content when request has no tools - Verifies standard non-tool flow
  4. Reject array content when request has no tools - Ensures validation still enforces single content for non-tool requests
  5. Array content when request includes toolChoice - Verifies toolChoice also triggers the correct schema

All tests pass.

Breaking Changes

None

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

🦉 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

…sent
When a sampling request includes tools or toolChoice, the client now validates
the response against CreateMessageResultWithToolsSchema (which supports array
content with tool_use blocks) instead of always using CreateMessageResultSchema.
This fixes validation failures when client handlers return tool_use content
formatted as an array, which was incorrectly rejected with "Invalid input:
expected object, received array".
Fixesmodelcontextprotocol#1346
🦉 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@olaservo
olaservo requested a review from a team as a code ownerJanuary 19, 2026 17:31
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9a89eba

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/sdk@1407

commit: 9a89eba

@pcarletonpcarleton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thanks ola!!

@pcarleton
pcarleton merged commit 12ae856 into modelcontextprotocol:v1.xJan 20, 2026
6 checks passed
sgmakgg added a commit to boringstudio-org/mcp-gitea that referenced this pull request Mar 13, 2026
…#17)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@modelcontextprotocol/sdk](https://modelcontextprotocol.io) ([source](https://github.com/modelcontextprotocol/typescript-sdk)) | dependencies | patch | [`1.25.2` → `1.25.3`](https://renovatebot.com/diffs/npm/@modelcontextprotocol%2fsdk/1.25.2/1.25.3) |
---
### Release Notes
<details>
<summary>modelcontextprotocol/typescript-sdk (@&#8203;modelcontextprotocol/sdk)</summary>
### [`v1.25.3`](https://github.com/modelcontextprotocol/typescript-sdk/releases/tag/v1.25.3)
[Compare Source](modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3)
#### What's Changed
- \[v1.x backport] Use correct schema for client sampling validation when tools are present by [@&#8203;olaservo](https://github.com/olaservo) in [#&#8203;1407](modelcontextprotocol/typescript-sdk#1407)
- fix: prevent Hono from overriding global Response object (v1.x) by [@&#8203;mattzcarey](https://github.com/mattzcarey) in [#&#8203;1411](modelcontextprotocol/typescript-sdk#1411)
**Full Changelog**: <modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3>
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Co-authored-by: Renovate Bot <renovate@boringstudio.by>
Co-authored-by: ChubbChubbs <sgmakgg@gmail.com>
Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/17
Co-authored-by: boring-bot <bot@boringstudio.by>
Co-committed-by: boring-bot <bot@boringstudio.by>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@olaservo@pcarleton
, '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

[v1.x backport] Use correct schema for client sampling validation when tools are present - #1407

Merged
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x
Jan 20, 2026
Merged

[v1.x backport] Use correct schema for client sampling validation when tools are present#1407
pcarleton merged 1 commit into
modelcontextprotocol:v1.xfrom
olaservo:fix-sampling-with-tools-client-validation-v1x

Conversation

@olaservo

Copy link
Copy Markdown
Member

Summary

Backport of #1347 to v1.x branch for inclusion in a v1.x.x point release.

Fix client-side sampling validation to use CreateMessageResultWithToolsSchema when tools are present in the request, preventing false validation failures for tool_use responses.

Motivation and Context

When a client sampling handler returns tool_use content formatted as an array, validation fails with "Invalid input: expected object, received array". This occurs because the client always validates against CreateMessageResultSchema regardless of whether tools were included in the request.

  • CreateMessageResultSchema expects single content blocks (text, image, or audio only)
  • CreateMessageResultWithToolsSchema supports array content with tool_use/tool_result blocks

This mirrors the server-side fix from PR #1156, which the client-side code missed.

Fixes#1346

How Has This Been Tested?

Added 5 new integration tests in test/client/index.test.ts:

  1. Array content with tool_use when request includes tools - Verifies handler can return [{ type: 'tool_use', ... }]
  2. Single content when request includes tools - Verifies backwards compatibility
  3. Single content when request has no tools - Verifies standard non-tool flow
  4. Reject array content when request has no tools - Ensures validation still enforces single content for non-tool requests
  5. Array content when request includes toolChoice - Verifies toolChoice also triggers the correct schema

All tests pass.

Breaking Changes

None

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

🦉 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 noreply@anthropic.com

…sent
When a sampling request includes tools or toolChoice, the client now validates
the response against CreateMessageResultWithToolsSchema (which supports array
content with tool_use blocks) instead of always using CreateMessageResultSchema.
This fixes validation failures when client handlers return tool_use content
formatted as an array, which was incorrectly rejected with "Invalid input:
expected object, received array".
Fixesmodelcontextprotocol#1346
🦉 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@olaservo
olaservo requested a review from a team as a code ownerJanuary 19, 2026 17:31
@changeset-bot

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9a89eba

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/sdk@1407

commit: 9a89eba

@pcarletonpcarleton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

thanks ola!!

@pcarleton
pcarleton merged commit 12ae856 into modelcontextprotocol:v1.xJan 20, 2026
6 checks passed
sgmakgg added a commit to boringstudio-org/mcp-gitea that referenced this pull request Mar 13, 2026
…#17)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [@modelcontextprotocol/sdk](https://modelcontextprotocol.io) ([source](https://github.com/modelcontextprotocol/typescript-sdk)) | dependencies | patch | [`1.25.2` → `1.25.3`](https://renovatebot.com/diffs/npm/@modelcontextprotocol%2fsdk/1.25.2/1.25.3) |
---
### Release Notes
<details>
<summary>modelcontextprotocol/typescript-sdk (@&#8203;modelcontextprotocol/sdk)</summary>
### [`v1.25.3`](https://github.com/modelcontextprotocol/typescript-sdk/releases/tag/v1.25.3)
[Compare Source](modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3)
#### What's Changed
- \[v1.x backport] Use correct schema for client sampling validation when tools are present by [@&#8203;olaservo](https://github.com/olaservo) in [#&#8203;1407](modelcontextprotocol/typescript-sdk#1407)
- fix: prevent Hono from overriding global Response object (v1.x) by [@&#8203;mattzcarey](https://github.com/mattzcarey) in [#&#8203;1411](modelcontextprotocol/typescript-sdk#1411)
**Full Changelog**: <modelcontextprotocol/typescript-sdk@v1.25.2...v1.25.3>
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NC4zIiwidXBkYXRlZEluVmVyIjoiNDIuOTQuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Co-authored-by: Renovate Bot <renovate@boringstudio.by>
Co-authored-by: ChubbChubbs <sgmakgg@gmail.com>
Reviewed-on: https://git.boringstudio.by/BoringStudio/mcp-gitea/pulls/17
Co-authored-by: boring-bot <bot@boringstudio.by>
Co-committed-by: boring-bot <bot@boringstudio.by>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@olaservo@pcarleton