[v1.x backport] Allow servers / clients to advertise extensions in the capability object - #1811

Merged
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x
Mar 30, 2026
Merged

[v1.x backport] Allow servers / clients to advertise extensions in the capability object#1811
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x

Conversation

@localden

Copy link
Copy Markdown
Contributor

Backport of #1630 to the v1.x branch.

According to SEP-2133, the protocol supports extensions which can be advertised in the capabilities object. This PR adds this field to the v1.x SDK.

Motivation and Context

This enables extensions to build upon the typescript-sdk v1.x release line.

Adaptations from main

The v1.x branch has a flatter directory structure and different type primitives, so the following adaptations were made:

  • src/spec.types.ts (instead of packages/core/src/types/spec.types.ts): uses { [key: string]: object } to match the existing experimental field pattern, since JSONObject doesn't exist on v1.x
  • src/types.ts (instead of packages/core/src/types/types.ts): uses AssertObjectSchema to match the existing experimental field pattern, since JSONObjectSchema doesn't exist on v1.x
  • test/server/mcp.test.ts (instead of test/integration/test/server/mcp.test.ts): same tests, adapted to the v1.x test structure

How Has This Been Tested?

New tests pass (should register and advertise server extensions capability and should advertise client extensions capability to server).

Breaking Changes

No

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

…#1630)
Backport of #1630 to v1.x branch.
Adds the `extensions` field to `ClientCapabilities` and `ServerCapabilities`
to allow servers and clients to advertise extension support in the capability
object, per SEP-2133.
Adapted from the main branch implementation to use v1.x types:
- Uses `object` type in spec.types.ts (matching existing `experimental` field)
- Uses `AssertObjectSchema` in Zod schemas instead of `JSONObjectSchema`
:house: Remote-Dev: homespace
@localden
localden requested a review from a team as a code ownerMarch 29, 2026 07:43
@changeset-bot

changeset-botBot commented Mar 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2225fd1

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new

pkg-pr-newBot commented Mar 29, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@modelcontextprotocol/sdk@1811

commit: 2225fd1

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM, straightforward backport mirroring the existing experimental field pattern.

Extended reasoning...

Overview

This PR adds an optional extensions field to ClientCapabilities and ServerCapabilities in three files: src/spec.types.ts (TypeScript interfaces), src/types.ts (Zod schemas), and test/server/mcp.test.ts (two new test cases). It is a backport of #1630 to the v1.x branch.

Security risks

None. The change adds an optional field to capability negotiation objects. No auth, crypto, or permissions code is affected.

Level of scrutiny

Low scrutiny warranted. The new extensions field uses the exact same pattern as the existing experimental field ({ [key: string]: object } in the interface, z.record(z.string(), AssertObjectSchema).optional() in the Zod schema). This is a mechanical, pattern-following addition with no design ambiguity.

Other factors

  • Two tests cover both server-side and client-side extension capability advertisement.
  • No outstanding reviewer comments or prior reviews to address.
  • The changeset bot flagged a missing changeset, but that is a maintainer decision, not a code correctness issue.

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM — straightforward backport adding optional extensions field to capabilities, following the existing experimental field pattern exactly.

Extended reasoning...

Overview

This PR backports #1630 to the v1.x branch, adding an optional extensions field to both ClientCapabilities and ServerCapabilities. Four files are touched: the changeset, the TypeScript interface types (spec.types.ts), the Zod runtime schemas (types.ts), and a test file with two new integration tests.

Security risks

None. The change adds an optional field to capability advertisement interfaces. No auth, crypto, permissions, or user input handling is affected. The field type ({ [key: string]: object } / z.record(z.string(), AssertObjectSchema).optional()) is identical to the existing experimental field, so no new attack surface is introduced.

Level of scrutiny

Low scrutiny is appropriate. This is a mechanical, pattern-following addition of a single optional field to two interfaces/schemas. The implementation exactly mirrors the existing experimental field in both the TypeScript types and Zod schemas. The two new tests adequately verify the feature works for both server-side and client-side capability advertisement.

Other factors

  • No outstanding reviewer comments or unaddressed feedback.
  • The changeset is included and correctly marked as a minor version bump.
  • The PR follows the repository's existing conventions for capability fields.
  • Tests cover both directions (server advertising to client, client advertising to server).

@felixweinberger
felixweinberger merged commit 5608e78 into v1.xMar 30, 2026
10 checks passed
@felixweinberger
felixweinberger deleted the backport/extensions-capability-1.x branch March 30, 2026 10:43
@felixweinbergerfelixweinberger mentioned this pull request Mar 30, 2026
9 tasks
ContextVM-org added a commit to ContextVM/mcp-sdk that referenced this pull request Jun 12, 2026
Ported functional changes from upstream v1.x (17 commits behind,
v1.28.0 through v1.29.0+). Only retained-fork-surface changes
applied; auth, HTTP, and CI-only commits skipped.
Changes ported:
- stdio: ReadBuffer maxBufferSize limit (modelcontextprotocol#2239)
- stdio: windowsHide always on Win32, removed isElectron() (modelcontextprotocol#1640)
- stdio: try/catch error handling on read buffer overflow
- types: extensions capability on ClientCapabilities/ServerCapabilities (modelcontextprotocol#1811)
- types: size field on ResourceSchema (modelcontextprotocol#1575)
- zod-compat: prioritize zod issues with path formatting (modelcontextprotocol#1503)
- protocol: conditional abort controller cleanup (modelcontextprotocol#1462)
Intentionally kept:
- AuthInfo import from ./shared/auth-info.js (not reverted to auth/types.js)
- All removed transports, auth, and HTTP modules stay out
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

@localden@felixweinberger
, '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] Allow servers / clients to advertise extensions in the capability object - #1811

Merged
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x
Mar 30, 2026
Merged

[v1.x backport] Allow servers / clients to advertise extensions in the capability object#1811
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x

Conversation

@localden

Copy link
Copy Markdown
Contributor

Backport of #1630 to the v1.x branch.

According to SEP-2133, the protocol supports extensions which can be advertised in the capabilities object. This PR adds this field to the v1.x SDK.

Motivation and Context

This enables extensions to build upon the typescript-sdk v1.x release line.

Adaptations from main

The v1.x branch has a flatter directory structure and different type primitives, so the following adaptations were made:

  • src/spec.types.ts (instead of packages/core/src/types/spec.types.ts): uses { [key: string]: object } to match the existing experimental field pattern, since JSONObject doesn't exist on v1.x
  • src/types.ts (instead of packages/core/src/types/types.ts): uses AssertObjectSchema to match the existing experimental field pattern, since JSONObjectSchema doesn't exist on v1.x
  • test/server/mcp.test.ts (instead of test/integration/test/server/mcp.test.ts): same tests, adapted to the v1.x test structure

How Has This Been Tested?

New tests pass (should register and advertise server extensions capability and should advertise client extensions capability to server).

Breaking Changes

No

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

…#1630)
Backport of #1630 to v1.x branch.
Adds the `extensions` field to `ClientCapabilities` and `ServerCapabilities`
to allow servers and clients to advertise extension support in the capability
object, per SEP-2133.
Adapted from the main branch implementation to use v1.x types:
- Uses `object` type in spec.types.ts (matching existing `experimental` field)
- Uses `AssertObjectSchema` in Zod schemas instead of `JSONObjectSchema`
:house: Remote-Dev: homespace
@localden
localden requested a review from a team as a code ownerMarch 29, 2026 07:43
@changeset-bot

changeset-botBot commented Mar 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2225fd1

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new

pkg-pr-newBot commented Mar 29, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@modelcontextprotocol/sdk@1811

commit: 2225fd1

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM, straightforward backport mirroring the existing experimental field pattern.

Extended reasoning...

Overview

This PR adds an optional extensions field to ClientCapabilities and ServerCapabilities in three files: src/spec.types.ts (TypeScript interfaces), src/types.ts (Zod schemas), and test/server/mcp.test.ts (two new test cases). It is a backport of #1630 to the v1.x branch.

Security risks

None. The change adds an optional field to capability negotiation objects. No auth, crypto, or permissions code is affected.

Level of scrutiny

Low scrutiny warranted. The new extensions field uses the exact same pattern as the existing experimental field ({ [key: string]: object } in the interface, z.record(z.string(), AssertObjectSchema).optional() in the Zod schema). This is a mechanical, pattern-following addition with no design ambiguity.

Other factors

  • Two tests cover both server-side and client-side extension capability advertisement.
  • No outstanding reviewer comments or prior reviews to address.
  • The changeset bot flagged a missing changeset, but that is a maintainer decision, not a code correctness issue.

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM — straightforward backport adding optional extensions field to capabilities, following the existing experimental field pattern exactly.

Extended reasoning...

Overview

This PR backports #1630 to the v1.x branch, adding an optional extensions field to both ClientCapabilities and ServerCapabilities. Four files are touched: the changeset, the TypeScript interface types (spec.types.ts), the Zod runtime schemas (types.ts), and a test file with two new integration tests.

Security risks

None. The change adds an optional field to capability advertisement interfaces. No auth, crypto, permissions, or user input handling is affected. The field type ({ [key: string]: object } / z.record(z.string(), AssertObjectSchema).optional()) is identical to the existing experimental field, so no new attack surface is introduced.

Level of scrutiny

Low scrutiny is appropriate. This is a mechanical, pattern-following addition of a single optional field to two interfaces/schemas. The implementation exactly mirrors the existing experimental field in both the TypeScript types and Zod schemas. The two new tests adequately verify the feature works for both server-side and client-side capability advertisement.

Other factors

  • No outstanding reviewer comments or unaddressed feedback.
  • The changeset is included and correctly marked as a minor version bump.
  • The PR follows the repository's existing conventions for capability fields.
  • Tests cover both directions (server advertising to client, client advertising to server).

@felixweinberger
felixweinberger merged commit 5608e78 into v1.xMar 30, 2026
10 checks passed
@felixweinberger
felixweinberger deleted the backport/extensions-capability-1.x branch March 30, 2026 10:43
@felixweinbergerfelixweinberger mentioned this pull request Mar 30, 2026
9 tasks
ContextVM-org added a commit to ContextVM/mcp-sdk that referenced this pull request Jun 12, 2026
Ported functional changes from upstream v1.x (17 commits behind,
v1.28.0 through v1.29.0+). Only retained-fork-surface changes
applied; auth, HTTP, and CI-only commits skipped.
Changes ported:
- stdio: ReadBuffer maxBufferSize limit (modelcontextprotocol#2239)
- stdio: windowsHide always on Win32, removed isElectron() (modelcontextprotocol#1640)
- stdio: try/catch error handling on read buffer overflow
- types: extensions capability on ClientCapabilities/ServerCapabilities (modelcontextprotocol#1811)
- types: size field on ResourceSchema (modelcontextprotocol#1575)
- zod-compat: prioritize zod issues with path formatting (modelcontextprotocol#1503)
- protocol: conditional abort controller cleanup (modelcontextprotocol#1462)
Intentionally kept:
- AuthInfo import from ./shared/auth-info.js (not reverted to auth/types.js)
- All removed transports, auth, and HTTP modules stay out
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

@localden@felixweinberger
, '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] Allow servers / clients to advertise extensions in the capability object - #1811

Merged
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x
Mar 30, 2026
Merged

[v1.x backport] Allow servers / clients to advertise extensions in the capability object#1811
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x

Conversation

@localden

Copy link
Copy Markdown
Contributor

Backport of #1630 to the v1.x branch.

According to SEP-2133, the protocol supports extensions which can be advertised in the capabilities object. This PR adds this field to the v1.x SDK.

Motivation and Context

This enables extensions to build upon the typescript-sdk v1.x release line.

Adaptations from main

The v1.x branch has a flatter directory structure and different type primitives, so the following adaptations were made:

  • src/spec.types.ts (instead of packages/core/src/types/spec.types.ts): uses { [key: string]: object } to match the existing experimental field pattern, since JSONObject doesn't exist on v1.x
  • src/types.ts (instead of packages/core/src/types/types.ts): uses AssertObjectSchema to match the existing experimental field pattern, since JSONObjectSchema doesn't exist on v1.x
  • test/server/mcp.test.ts (instead of test/integration/test/server/mcp.test.ts): same tests, adapted to the v1.x test structure

How Has This Been Tested?

New tests pass (should register and advertise server extensions capability and should advertise client extensions capability to server).

Breaking Changes

No

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

…#1630)
Backport of #1630 to v1.x branch.
Adds the `extensions` field to `ClientCapabilities` and `ServerCapabilities`
to allow servers and clients to advertise extension support in the capability
object, per SEP-2133.
Adapted from the main branch implementation to use v1.x types:
- Uses `object` type in spec.types.ts (matching existing `experimental` field)
- Uses `AssertObjectSchema` in Zod schemas instead of `JSONObjectSchema`
:house: Remote-Dev: homespace
@localden
localden requested a review from a team as a code ownerMarch 29, 2026 07:43
@changeset-bot

changeset-botBot commented Mar 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2225fd1

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new

pkg-pr-newBot commented Mar 29, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@modelcontextprotocol/sdk@1811

commit: 2225fd1

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM, straightforward backport mirroring the existing experimental field pattern.

Extended reasoning...

Overview

This PR adds an optional extensions field to ClientCapabilities and ServerCapabilities in three files: src/spec.types.ts (TypeScript interfaces), src/types.ts (Zod schemas), and test/server/mcp.test.ts (two new test cases). It is a backport of #1630 to the v1.x branch.

Security risks

None. The change adds an optional field to capability negotiation objects. No auth, crypto, or permissions code is affected.

Level of scrutiny

Low scrutiny warranted. The new extensions field uses the exact same pattern as the existing experimental field ({ [key: string]: object } in the interface, z.record(z.string(), AssertObjectSchema).optional() in the Zod schema). This is a mechanical, pattern-following addition with no design ambiguity.

Other factors

  • Two tests cover both server-side and client-side extension capability advertisement.
  • No outstanding reviewer comments or prior reviews to address.
  • The changeset bot flagged a missing changeset, but that is a maintainer decision, not a code correctness issue.

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM — straightforward backport adding optional extensions field to capabilities, following the existing experimental field pattern exactly.

Extended reasoning...

Overview

This PR backports #1630 to the v1.x branch, adding an optional extensions field to both ClientCapabilities and ServerCapabilities. Four files are touched: the changeset, the TypeScript interface types (spec.types.ts), the Zod runtime schemas (types.ts), and a test file with two new integration tests.

Security risks

None. The change adds an optional field to capability advertisement interfaces. No auth, crypto, permissions, or user input handling is affected. The field type ({ [key: string]: object } / z.record(z.string(), AssertObjectSchema).optional()) is identical to the existing experimental field, so no new attack surface is introduced.

Level of scrutiny

Low scrutiny is appropriate. This is a mechanical, pattern-following addition of a single optional field to two interfaces/schemas. The implementation exactly mirrors the existing experimental field in both the TypeScript types and Zod schemas. The two new tests adequately verify the feature works for both server-side and client-side capability advertisement.

Other factors

  • No outstanding reviewer comments or unaddressed feedback.
  • The changeset is included and correctly marked as a minor version bump.
  • The PR follows the repository's existing conventions for capability fields.
  • Tests cover both directions (server advertising to client, client advertising to server).

@felixweinberger
felixweinberger merged commit 5608e78 into v1.xMar 30, 2026
10 checks passed
@felixweinberger
felixweinberger deleted the backport/extensions-capability-1.x branch March 30, 2026 10:43
@felixweinbergerfelixweinberger mentioned this pull request Mar 30, 2026
9 tasks
ContextVM-org added a commit to ContextVM/mcp-sdk that referenced this pull request Jun 12, 2026
Ported functional changes from upstream v1.x (17 commits behind,
v1.28.0 through v1.29.0+). Only retained-fork-surface changes
applied; auth, HTTP, and CI-only commits skipped.
Changes ported:
- stdio: ReadBuffer maxBufferSize limit (modelcontextprotocol#2239)
- stdio: windowsHide always on Win32, removed isElectron() (modelcontextprotocol#1640)
- stdio: try/catch error handling on read buffer overflow
- types: extensions capability on ClientCapabilities/ServerCapabilities (modelcontextprotocol#1811)
- types: size field on ResourceSchema (modelcontextprotocol#1575)
- zod-compat: prioritize zod issues with path formatting (modelcontextprotocol#1503)
- protocol: conditional abort controller cleanup (modelcontextprotocol#1462)
Intentionally kept:
- AuthInfo import from ./shared/auth-info.js (not reverted to auth/types.js)
- All removed transports, auth, and HTTP modules stay out
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

@localden@felixweinberger
, '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] Allow servers / clients to advertise extensions in the capability object - #1811

Merged
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x
Mar 30, 2026
Merged

[v1.x backport] Allow servers / clients to advertise extensions in the capability object#1811
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x

Conversation

@localden

Copy link
Copy Markdown
Contributor

Backport of #1630 to the v1.x branch.

According to SEP-2133, the protocol supports extensions which can be advertised in the capabilities object. This PR adds this field to the v1.x SDK.

Motivation and Context

This enables extensions to build upon the typescript-sdk v1.x release line.

Adaptations from main

The v1.x branch has a flatter directory structure and different type primitives, so the following adaptations were made:

  • src/spec.types.ts (instead of packages/core/src/types/spec.types.ts): uses { [key: string]: object } to match the existing experimental field pattern, since JSONObject doesn't exist on v1.x
  • src/types.ts (instead of packages/core/src/types/types.ts): uses AssertObjectSchema to match the existing experimental field pattern, since JSONObjectSchema doesn't exist on v1.x
  • test/server/mcp.test.ts (instead of test/integration/test/server/mcp.test.ts): same tests, adapted to the v1.x test structure

How Has This Been Tested?

New tests pass (should register and advertise server extensions capability and should advertise client extensions capability to server).

Breaking Changes

No

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

…#1630)
Backport of #1630 to v1.x branch.
Adds the `extensions` field to `ClientCapabilities` and `ServerCapabilities`
to allow servers and clients to advertise extension support in the capability
object, per SEP-2133.
Adapted from the main branch implementation to use v1.x types:
- Uses `object` type in spec.types.ts (matching existing `experimental` field)
- Uses `AssertObjectSchema` in Zod schemas instead of `JSONObjectSchema`
:house: Remote-Dev: homespace
@localden
localden requested a review from a team as a code ownerMarch 29, 2026 07:43
@changeset-bot

changeset-botBot commented Mar 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2225fd1

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new

pkg-pr-newBot commented Mar 29, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@modelcontextprotocol/sdk@1811

commit: 2225fd1

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM, straightforward backport mirroring the existing experimental field pattern.

Extended reasoning...

Overview

This PR adds an optional extensions field to ClientCapabilities and ServerCapabilities in three files: src/spec.types.ts (TypeScript interfaces), src/types.ts (Zod schemas), and test/server/mcp.test.ts (two new test cases). It is a backport of #1630 to the v1.x branch.

Security risks

None. The change adds an optional field to capability negotiation objects. No auth, crypto, or permissions code is affected.

Level of scrutiny

Low scrutiny warranted. The new extensions field uses the exact same pattern as the existing experimental field ({ [key: string]: object } in the interface, z.record(z.string(), AssertObjectSchema).optional() in the Zod schema). This is a mechanical, pattern-following addition with no design ambiguity.

Other factors

  • Two tests cover both server-side and client-side extension capability advertisement.
  • No outstanding reviewer comments or prior reviews to address.
  • The changeset bot flagged a missing changeset, but that is a maintainer decision, not a code correctness issue.

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM — straightforward backport adding optional extensions field to capabilities, following the existing experimental field pattern exactly.

Extended reasoning...

Overview

This PR backports #1630 to the v1.x branch, adding an optional extensions field to both ClientCapabilities and ServerCapabilities. Four files are touched: the changeset, the TypeScript interface types (spec.types.ts), the Zod runtime schemas (types.ts), and a test file with two new integration tests.

Security risks

None. The change adds an optional field to capability advertisement interfaces. No auth, crypto, permissions, or user input handling is affected. The field type ({ [key: string]: object } / z.record(z.string(), AssertObjectSchema).optional()) is identical to the existing experimental field, so no new attack surface is introduced.

Level of scrutiny

Low scrutiny is appropriate. This is a mechanical, pattern-following addition of a single optional field to two interfaces/schemas. The implementation exactly mirrors the existing experimental field in both the TypeScript types and Zod schemas. The two new tests adequately verify the feature works for both server-side and client-side capability advertisement.

Other factors

  • No outstanding reviewer comments or unaddressed feedback.
  • The changeset is included and correctly marked as a minor version bump.
  • The PR follows the repository's existing conventions for capability fields.
  • Tests cover both directions (server advertising to client, client advertising to server).

@felixweinberger
felixweinberger merged commit 5608e78 into v1.xMar 30, 2026
10 checks passed
@felixweinberger
felixweinberger deleted the backport/extensions-capability-1.x branch March 30, 2026 10:43
@felixweinbergerfelixweinberger mentioned this pull request Mar 30, 2026
9 tasks
ContextVM-org added a commit to ContextVM/mcp-sdk that referenced this pull request Jun 12, 2026
Ported functional changes from upstream v1.x (17 commits behind,
v1.28.0 through v1.29.0+). Only retained-fork-surface changes
applied; auth, HTTP, and CI-only commits skipped.
Changes ported:
- stdio: ReadBuffer maxBufferSize limit (modelcontextprotocol#2239)
- stdio: windowsHide always on Win32, removed isElectron() (modelcontextprotocol#1640)
- stdio: try/catch error handling on read buffer overflow
- types: extensions capability on ClientCapabilities/ServerCapabilities (modelcontextprotocol#1811)
- types: size field on ResourceSchema (modelcontextprotocol#1575)
- zod-compat: prioritize zod issues with path formatting (modelcontextprotocol#1503)
- protocol: conditional abort controller cleanup (modelcontextprotocol#1462)
Intentionally kept:
- AuthInfo import from ./shared/auth-info.js (not reverted to auth/types.js)
- All removed transports, auth, and HTTP modules stay out
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

@localden@felixweinberger
, '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] Allow servers / clients to advertise extensions in the capability object - #1811

Merged
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x
Mar 30, 2026
Merged

[v1.x backport] Allow servers / clients to advertise extensions in the capability object#1811
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x

Conversation

@localden

Copy link
Copy Markdown
Contributor

Backport of #1630 to the v1.x branch.

According to SEP-2133, the protocol supports extensions which can be advertised in the capabilities object. This PR adds this field to the v1.x SDK.

Motivation and Context

This enables extensions to build upon the typescript-sdk v1.x release line.

Adaptations from main

The v1.x branch has a flatter directory structure and different type primitives, so the following adaptations were made:

  • src/spec.types.ts (instead of packages/core/src/types/spec.types.ts): uses { [key: string]: object } to match the existing experimental field pattern, since JSONObject doesn't exist on v1.x
  • src/types.ts (instead of packages/core/src/types/types.ts): uses AssertObjectSchema to match the existing experimental field pattern, since JSONObjectSchema doesn't exist on v1.x
  • test/server/mcp.test.ts (instead of test/integration/test/server/mcp.test.ts): same tests, adapted to the v1.x test structure

How Has This Been Tested?

New tests pass (should register and advertise server extensions capability and should advertise client extensions capability to server).

Breaking Changes

No

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

…#1630)
Backport of #1630 to v1.x branch.
Adds the `extensions` field to `ClientCapabilities` and `ServerCapabilities`
to allow servers and clients to advertise extension support in the capability
object, per SEP-2133.
Adapted from the main branch implementation to use v1.x types:
- Uses `object` type in spec.types.ts (matching existing `experimental` field)
- Uses `AssertObjectSchema` in Zod schemas instead of `JSONObjectSchema`
:house: Remote-Dev: homespace
@localden
localden requested a review from a team as a code ownerMarch 29, 2026 07:43
@changeset-bot

changeset-botBot commented Mar 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2225fd1

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new

pkg-pr-newBot commented Mar 29, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@modelcontextprotocol/sdk@1811

commit: 2225fd1

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM, straightforward backport mirroring the existing experimental field pattern.

Extended reasoning...

Overview

This PR adds an optional extensions field to ClientCapabilities and ServerCapabilities in three files: src/spec.types.ts (TypeScript interfaces), src/types.ts (Zod schemas), and test/server/mcp.test.ts (two new test cases). It is a backport of #1630 to the v1.x branch.

Security risks

None. The change adds an optional field to capability negotiation objects. No auth, crypto, or permissions code is affected.

Level of scrutiny

Low scrutiny warranted. The new extensions field uses the exact same pattern as the existing experimental field ({ [key: string]: object } in the interface, z.record(z.string(), AssertObjectSchema).optional() in the Zod schema). This is a mechanical, pattern-following addition with no design ambiguity.

Other factors

  • Two tests cover both server-side and client-side extension capability advertisement.
  • No outstanding reviewer comments or prior reviews to address.
  • The changeset bot flagged a missing changeset, but that is a maintainer decision, not a code correctness issue.

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM — straightforward backport adding optional extensions field to capabilities, following the existing experimental field pattern exactly.

Extended reasoning...

Overview

This PR backports #1630 to the v1.x branch, adding an optional extensions field to both ClientCapabilities and ServerCapabilities. Four files are touched: the changeset, the TypeScript interface types (spec.types.ts), the Zod runtime schemas (types.ts), and a test file with two new integration tests.

Security risks

None. The change adds an optional field to capability advertisement interfaces. No auth, crypto, permissions, or user input handling is affected. The field type ({ [key: string]: object } / z.record(z.string(), AssertObjectSchema).optional()) is identical to the existing experimental field, so no new attack surface is introduced.

Level of scrutiny

Low scrutiny is appropriate. This is a mechanical, pattern-following addition of a single optional field to two interfaces/schemas. The implementation exactly mirrors the existing experimental field in both the TypeScript types and Zod schemas. The two new tests adequately verify the feature works for both server-side and client-side capability advertisement.

Other factors

  • No outstanding reviewer comments or unaddressed feedback.
  • The changeset is included and correctly marked as a minor version bump.
  • The PR follows the repository's existing conventions for capability fields.
  • Tests cover both directions (server advertising to client, client advertising to server).

@felixweinberger
felixweinberger merged commit 5608e78 into v1.xMar 30, 2026
10 checks passed
@felixweinberger
felixweinberger deleted the backport/extensions-capability-1.x branch March 30, 2026 10:43
@felixweinbergerfelixweinberger mentioned this pull request Mar 30, 2026
9 tasks
ContextVM-org added a commit to ContextVM/mcp-sdk that referenced this pull request Jun 12, 2026
Ported functional changes from upstream v1.x (17 commits behind,
v1.28.0 through v1.29.0+). Only retained-fork-surface changes
applied; auth, HTTP, and CI-only commits skipped.
Changes ported:
- stdio: ReadBuffer maxBufferSize limit (modelcontextprotocol#2239)
- stdio: windowsHide always on Win32, removed isElectron() (modelcontextprotocol#1640)
- stdio: try/catch error handling on read buffer overflow
- types: extensions capability on ClientCapabilities/ServerCapabilities (modelcontextprotocol#1811)
- types: size field on ResourceSchema (modelcontextprotocol#1575)
- zod-compat: prioritize zod issues with path formatting (modelcontextprotocol#1503)
- protocol: conditional abort controller cleanup (modelcontextprotocol#1462)
Intentionally kept:
- AuthInfo import from ./shared/auth-info.js (not reverted to auth/types.js)
- All removed transports, auth, and HTTP modules stay out
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

@localden@felixweinberger
, '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] Allow servers / clients to advertise extensions in the capability object - #1811

Merged
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x
Mar 30, 2026
Merged

[v1.x backport] Allow servers / clients to advertise extensions in the capability object#1811
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x

Conversation

@localden

Copy link
Copy Markdown
Contributor

Backport of #1630 to the v1.x branch.

According to SEP-2133, the protocol supports extensions which can be advertised in the capabilities object. This PR adds this field to the v1.x SDK.

Motivation and Context

This enables extensions to build upon the typescript-sdk v1.x release line.

Adaptations from main

The v1.x branch has a flatter directory structure and different type primitives, so the following adaptations were made:

  • src/spec.types.ts (instead of packages/core/src/types/spec.types.ts): uses { [key: string]: object } to match the existing experimental field pattern, since JSONObject doesn't exist on v1.x
  • src/types.ts (instead of packages/core/src/types/types.ts): uses AssertObjectSchema to match the existing experimental field pattern, since JSONObjectSchema doesn't exist on v1.x
  • test/server/mcp.test.ts (instead of test/integration/test/server/mcp.test.ts): same tests, adapted to the v1.x test structure

How Has This Been Tested?

New tests pass (should register and advertise server extensions capability and should advertise client extensions capability to server).

Breaking Changes

No

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

…#1630)
Backport of #1630 to v1.x branch.
Adds the `extensions` field to `ClientCapabilities` and `ServerCapabilities`
to allow servers and clients to advertise extension support in the capability
object, per SEP-2133.
Adapted from the main branch implementation to use v1.x types:
- Uses `object` type in spec.types.ts (matching existing `experimental` field)
- Uses `AssertObjectSchema` in Zod schemas instead of `JSONObjectSchema`
:house: Remote-Dev: homespace
@localden
localden requested a review from a team as a code ownerMarch 29, 2026 07:43
@changeset-bot

changeset-botBot commented Mar 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2225fd1

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new

pkg-pr-newBot commented Mar 29, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@modelcontextprotocol/sdk@1811

commit: 2225fd1

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM, straightforward backport mirroring the existing experimental field pattern.

Extended reasoning...

Overview

This PR adds an optional extensions field to ClientCapabilities and ServerCapabilities in three files: src/spec.types.ts (TypeScript interfaces), src/types.ts (Zod schemas), and test/server/mcp.test.ts (two new test cases). It is a backport of #1630 to the v1.x branch.

Security risks

None. The change adds an optional field to capability negotiation objects. No auth, crypto, or permissions code is affected.

Level of scrutiny

Low scrutiny warranted. The new extensions field uses the exact same pattern as the existing experimental field ({ [key: string]: object } in the interface, z.record(z.string(), AssertObjectSchema).optional() in the Zod schema). This is a mechanical, pattern-following addition with no design ambiguity.

Other factors

  • Two tests cover both server-side and client-side extension capability advertisement.
  • No outstanding reviewer comments or prior reviews to address.
  • The changeset bot flagged a missing changeset, but that is a maintainer decision, not a code correctness issue.

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM — straightforward backport adding optional extensions field to capabilities, following the existing experimental field pattern exactly.

Extended reasoning...

Overview

This PR backports #1630 to the v1.x branch, adding an optional extensions field to both ClientCapabilities and ServerCapabilities. Four files are touched: the changeset, the TypeScript interface types (spec.types.ts), the Zod runtime schemas (types.ts), and a test file with two new integration tests.

Security risks

None. The change adds an optional field to capability advertisement interfaces. No auth, crypto, permissions, or user input handling is affected. The field type ({ [key: string]: object } / z.record(z.string(), AssertObjectSchema).optional()) is identical to the existing experimental field, so no new attack surface is introduced.

Level of scrutiny

Low scrutiny is appropriate. This is a mechanical, pattern-following addition of a single optional field to two interfaces/schemas. The implementation exactly mirrors the existing experimental field in both the TypeScript types and Zod schemas. The two new tests adequately verify the feature works for both server-side and client-side capability advertisement.

Other factors

  • No outstanding reviewer comments or unaddressed feedback.
  • The changeset is included and correctly marked as a minor version bump.
  • The PR follows the repository's existing conventions for capability fields.
  • Tests cover both directions (server advertising to client, client advertising to server).

@felixweinberger
felixweinberger merged commit 5608e78 into v1.xMar 30, 2026
10 checks passed
@felixweinberger
felixweinberger deleted the backport/extensions-capability-1.x branch March 30, 2026 10:43
@felixweinbergerfelixweinberger mentioned this pull request Mar 30, 2026
9 tasks
ContextVM-org added a commit to ContextVM/mcp-sdk that referenced this pull request Jun 12, 2026
Ported functional changes from upstream v1.x (17 commits behind,
v1.28.0 through v1.29.0+). Only retained-fork-surface changes
applied; auth, HTTP, and CI-only commits skipped.
Changes ported:
- stdio: ReadBuffer maxBufferSize limit (modelcontextprotocol#2239)
- stdio: windowsHide always on Win32, removed isElectron() (modelcontextprotocol#1640)
- stdio: try/catch error handling on read buffer overflow
- types: extensions capability on ClientCapabilities/ServerCapabilities (modelcontextprotocol#1811)
- types: size field on ResourceSchema (modelcontextprotocol#1575)
- zod-compat: prioritize zod issues with path formatting (modelcontextprotocol#1503)
- protocol: conditional abort controller cleanup (modelcontextprotocol#1462)
Intentionally kept:
- AuthInfo import from ./shared/auth-info.js (not reverted to auth/types.js)
- All removed transports, auth, and HTTP modules stay out
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

@localden@felixweinberger
, '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] Allow servers / clients to advertise extensions in the capability object - #1811

Merged
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x
Mar 30, 2026
Merged

[v1.x backport] Allow servers / clients to advertise extensions in the capability object#1811
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x

Conversation

@localden

Copy link
Copy Markdown
Contributor

Backport of #1630 to the v1.x branch.

According to SEP-2133, the protocol supports extensions which can be advertised in the capabilities object. This PR adds this field to the v1.x SDK.

Motivation and Context

This enables extensions to build upon the typescript-sdk v1.x release line.

Adaptations from main

The v1.x branch has a flatter directory structure and different type primitives, so the following adaptations were made:

  • src/spec.types.ts (instead of packages/core/src/types/spec.types.ts): uses { [key: string]: object } to match the existing experimental field pattern, since JSONObject doesn't exist on v1.x
  • src/types.ts (instead of packages/core/src/types/types.ts): uses AssertObjectSchema to match the existing experimental field pattern, since JSONObjectSchema doesn't exist on v1.x
  • test/server/mcp.test.ts (instead of test/integration/test/server/mcp.test.ts): same tests, adapted to the v1.x test structure

How Has This Been Tested?

New tests pass (should register and advertise server extensions capability and should advertise client extensions capability to server).

Breaking Changes

No

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

…#1630)
Backport of #1630 to v1.x branch.
Adds the `extensions` field to `ClientCapabilities` and `ServerCapabilities`
to allow servers and clients to advertise extension support in the capability
object, per SEP-2133.
Adapted from the main branch implementation to use v1.x types:
- Uses `object` type in spec.types.ts (matching existing `experimental` field)
- Uses `AssertObjectSchema` in Zod schemas instead of `JSONObjectSchema`
:house: Remote-Dev: homespace
@localden
localden requested a review from a team as a code ownerMarch 29, 2026 07:43
@changeset-bot

changeset-botBot commented Mar 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2225fd1

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new

pkg-pr-newBot commented Mar 29, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@modelcontextprotocol/sdk@1811

commit: 2225fd1

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM, straightforward backport mirroring the existing experimental field pattern.

Extended reasoning...

Overview

This PR adds an optional extensions field to ClientCapabilities and ServerCapabilities in three files: src/spec.types.ts (TypeScript interfaces), src/types.ts (Zod schemas), and test/server/mcp.test.ts (two new test cases). It is a backport of #1630 to the v1.x branch.

Security risks

None. The change adds an optional field to capability negotiation objects. No auth, crypto, or permissions code is affected.

Level of scrutiny

Low scrutiny warranted. The new extensions field uses the exact same pattern as the existing experimental field ({ [key: string]: object } in the interface, z.record(z.string(), AssertObjectSchema).optional() in the Zod schema). This is a mechanical, pattern-following addition with no design ambiguity.

Other factors

  • Two tests cover both server-side and client-side extension capability advertisement.
  • No outstanding reviewer comments or prior reviews to address.
  • The changeset bot flagged a missing changeset, but that is a maintainer decision, not a code correctness issue.

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM — straightforward backport adding optional extensions field to capabilities, following the existing experimental field pattern exactly.

Extended reasoning...

Overview

This PR backports #1630 to the v1.x branch, adding an optional extensions field to both ClientCapabilities and ServerCapabilities. Four files are touched: the changeset, the TypeScript interface types (spec.types.ts), the Zod runtime schemas (types.ts), and a test file with two new integration tests.

Security risks

None. The change adds an optional field to capability advertisement interfaces. No auth, crypto, permissions, or user input handling is affected. The field type ({ [key: string]: object } / z.record(z.string(), AssertObjectSchema).optional()) is identical to the existing experimental field, so no new attack surface is introduced.

Level of scrutiny

Low scrutiny is appropriate. This is a mechanical, pattern-following addition of a single optional field to two interfaces/schemas. The implementation exactly mirrors the existing experimental field in both the TypeScript types and Zod schemas. The two new tests adequately verify the feature works for both server-side and client-side capability advertisement.

Other factors

  • No outstanding reviewer comments or unaddressed feedback.
  • The changeset is included and correctly marked as a minor version bump.
  • The PR follows the repository's existing conventions for capability fields.
  • Tests cover both directions (server advertising to client, client advertising to server).

@felixweinberger
felixweinberger merged commit 5608e78 into v1.xMar 30, 2026
10 checks passed
@felixweinberger
felixweinberger deleted the backport/extensions-capability-1.x branch March 30, 2026 10:43
@felixweinbergerfelixweinberger mentioned this pull request Mar 30, 2026
9 tasks
ContextVM-org added a commit to ContextVM/mcp-sdk that referenced this pull request Jun 12, 2026
Ported functional changes from upstream v1.x (17 commits behind,
v1.28.0 through v1.29.0+). Only retained-fork-surface changes
applied; auth, HTTP, and CI-only commits skipped.
Changes ported:
- stdio: ReadBuffer maxBufferSize limit (modelcontextprotocol#2239)
- stdio: windowsHide always on Win32, removed isElectron() (modelcontextprotocol#1640)
- stdio: try/catch error handling on read buffer overflow
- types: extensions capability on ClientCapabilities/ServerCapabilities (modelcontextprotocol#1811)
- types: size field on ResourceSchema (modelcontextprotocol#1575)
- zod-compat: prioritize zod issues with path formatting (modelcontextprotocol#1503)
- protocol: conditional abort controller cleanup (modelcontextprotocol#1462)
Intentionally kept:
- AuthInfo import from ./shared/auth-info.js (not reverted to auth/types.js)
- All removed transports, auth, and HTTP modules stay out
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

@localden@felixweinberger
, '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] Allow servers / clients to advertise extensions in the capability object - #1811

Merged
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x
Mar 30, 2026
Merged

[v1.x backport] Allow servers / clients to advertise extensions in the capability object#1811
felixweinberger merged 2 commits into
v1.xfrom
backport/extensions-capability-1.x

Conversation

@localden

Copy link
Copy Markdown
Contributor

Backport of #1630 to the v1.x branch.

According to SEP-2133, the protocol supports extensions which can be advertised in the capabilities object. This PR adds this field to the v1.x SDK.

Motivation and Context

This enables extensions to build upon the typescript-sdk v1.x release line.

Adaptations from main

The v1.x branch has a flatter directory structure and different type primitives, so the following adaptations were made:

  • src/spec.types.ts (instead of packages/core/src/types/spec.types.ts): uses { [key: string]: object } to match the existing experimental field pattern, since JSONObject doesn't exist on v1.x
  • src/types.ts (instead of packages/core/src/types/types.ts): uses AssertObjectSchema to match the existing experimental field pattern, since JSONObjectSchema doesn't exist on v1.x
  • test/server/mcp.test.ts (instead of test/integration/test/server/mcp.test.ts): same tests, adapted to the v1.x test structure

How Has This Been Tested?

New tests pass (should register and advertise server extensions capability and should advertise client extensions capability to server).

Breaking Changes

No

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

…#1630)
Backport of #1630 to v1.x branch.
Adds the `extensions` field to `ClientCapabilities` and `ServerCapabilities`
to allow servers and clients to advertise extension support in the capability
object, per SEP-2133.
Adapted from the main branch implementation to use v1.x types:
- Uses `object` type in spec.types.ts (matching existing `experimental` field)
- Uses `AssertObjectSchema` in Zod schemas instead of `JSONObjectSchema`
:house: Remote-Dev: homespace
@localden
localden requested a review from a team as a code ownerMarch 29, 2026 07:43
@changeset-bot

changeset-botBot commented Mar 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2225fd1

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

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

@pkg-pr-new

pkg-pr-newBot commented Mar 29, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@modelcontextprotocol/sdk@1811

commit: 2225fd1

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM, straightforward backport mirroring the existing experimental field pattern.

Extended reasoning...

Overview

This PR adds an optional extensions field to ClientCapabilities and ServerCapabilities in three files: src/spec.types.ts (TypeScript interfaces), src/types.ts (Zod schemas), and test/server/mcp.test.ts (two new test cases). It is a backport of #1630 to the v1.x branch.

Security risks

None. The change adds an optional field to capability negotiation objects. No auth, crypto, or permissions code is affected.

Level of scrutiny

Low scrutiny warranted. The new extensions field uses the exact same pattern as the existing experimental field ({ [key: string]: object } in the interface, z.record(z.string(), AssertObjectSchema).optional() in the Zod schema). This is a mechanical, pattern-following addition with no design ambiguity.

Other factors

  • Two tests cover both server-side and client-side extension capability advertisement.
  • No outstanding reviewer comments or prior reviews to address.
  • The changeset bot flagged a missing changeset, but that is a maintainer decision, not a code correctness issue.

@claudeclaudeBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM — straightforward backport adding optional extensions field to capabilities, following the existing experimental field pattern exactly.

Extended reasoning...

Overview

This PR backports #1630 to the v1.x branch, adding an optional extensions field to both ClientCapabilities and ServerCapabilities. Four files are touched: the changeset, the TypeScript interface types (spec.types.ts), the Zod runtime schemas (types.ts), and a test file with two new integration tests.

Security risks

None. The change adds an optional field to capability advertisement interfaces. No auth, crypto, permissions, or user input handling is affected. The field type ({ [key: string]: object } / z.record(z.string(), AssertObjectSchema).optional()) is identical to the existing experimental field, so no new attack surface is introduced.

Level of scrutiny

Low scrutiny is appropriate. This is a mechanical, pattern-following addition of a single optional field to two interfaces/schemas. The implementation exactly mirrors the existing experimental field in both the TypeScript types and Zod schemas. The two new tests adequately verify the feature works for both server-side and client-side capability advertisement.

Other factors

  • No outstanding reviewer comments or unaddressed feedback.
  • The changeset is included and correctly marked as a minor version bump.
  • The PR follows the repository's existing conventions for capability fields.
  • Tests cover both directions (server advertising to client, client advertising to server).

@felixweinberger
felixweinberger merged commit 5608e78 into v1.xMar 30, 2026
10 checks passed
@felixweinberger
felixweinberger deleted the backport/extensions-capability-1.x branch March 30, 2026 10:43
@felixweinbergerfelixweinberger mentioned this pull request Mar 30, 2026
9 tasks
ContextVM-org added a commit to ContextVM/mcp-sdk that referenced this pull request Jun 12, 2026
Ported functional changes from upstream v1.x (17 commits behind,
v1.28.0 through v1.29.0+). Only retained-fork-surface changes
applied; auth, HTTP, and CI-only commits skipped.
Changes ported:
- stdio: ReadBuffer maxBufferSize limit (modelcontextprotocol#2239)
- stdio: windowsHide always on Win32, removed isElectron() (modelcontextprotocol#1640)
- stdio: try/catch error handling on read buffer overflow
- types: extensions capability on ClientCapabilities/ServerCapabilities (modelcontextprotocol#1811)
- types: size field on ResourceSchema (modelcontextprotocol#1575)
- zod-compat: prioritize zod issues with path formatting (modelcontextprotocol#1503)
- protocol: conditional abort controller cleanup (modelcontextprotocol#1462)
Intentionally kept:
- AuthInfo import from ./shared/auth-info.js (not reverted to auth/types.js)
- All removed transports, auth, and HTTP modules stay out
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

@localden@felixweinberger