GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — SEP-3371: Consistent SDK extension points by sambhav · Pull Request #3371 · modelcontextprotocol/modelcontextprotocol

Conversation

@sambhav

@sambhav sambhav commented Sep 18, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

Read the rendered SEP

Summary

Bundling extension implementations into SDKs ties their maintenance and releases together. This SEP defines three public extension points so extension owners can publish independent packages and applications can compose them on one SDK:

  • Extension registration: declare capabilities and check local dependencies without depending on registration order. Dependencies must be satisfied by the configuration applicable when the extension runs, including where it varies by request. SDKs choose the representation and check timing; boolean predicates are sufficient.
  • Custom methods: register and send typed or validated requests and notifications. The checked extension path rejects method-name conflicts and type changes; existing application handler-replacement APIs can remain.
  • Middleware: compose behaviour around core and custom messages in both directions, including metadata, early returns, notifications, incremental streams, errors and language-native cleanup.

Each SDK chooses APIs that fit its language. Static middleware composition can satisfy ordering; runtime inspection is optional. Extensions may expose named insertion points without exposing every internal middleware step. Packaging and API stability follow each SDK's existing public API and versioning policies.

Requirements target protocol version 2026-07-28 and later. Tier 1 enforcement and conformance scenarios take effect with the first specification release after the SEP reaches Final; no separate deadline is introduced.

The SEP adds no wire fields or methods. It states the extension rules under which these hooks are sufficient and leaves extensions needing more responsible for their SDK compatibility. Conformance follows SEP-2484; a complete reference implementation is still needed. Appendices assess existing SDK APIs and extension needs and illustrate optional middleware composition designs.

Validation

  • Schema checks passed, including all 258 example validations.
  • Documentation formatting, MDX comment checks, SEP generation consistency and whitespace checks passed.
  • Synced the branch with main and regenerated the SEP page, index and navigation, including its short-link redirect.
  • Full npm run prep did not complete: this environment blocks the tsx CLI's IPC socket, and automatic approval review rejected a GitHub download used by the link-check dependency. Local checks used node --import tsx through a temporary dependency launcher; no tooling changes are included.
  • Examples remain illustrative, not a complete SDK implementation.

AI assistance

Codex assisted with drafting and editing the SEP, reviewing linked sources and comments, validating the changes, and drafting review replies, following my design decisions.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

felixweinberger reacted with eyes emoji
All reactions
  • 👀 1 reaction
@sambhav sambhav changed the title SEP: Consistent SDK extension points SEP-3371: Consistent SDK extension points Sep 18, 2026
@sambhav
sambhav force-pushed the sep-sdk-extension-points branch 7 times, most recently from d24f348 to 2aefeb1 Compare September 18, 2026 21:12
@sambhav
sambhav marked this pull request as ready for review September 21, 2026 14:46
@sambhav
sambhav requested review from a team as code owners September 21, 2026 14:46
@sambhav
sambhav requested review from KKonstantinov, Kludex, LucaButBoring, dsp-ant, felixweinberger, kurtisvg, mattzcarey, maxisbey, pcarleton and tzolov September 21, 2026 15:40
LucaButBoring
LucaButBoring reviewed Sep 21, 2026
View reviewed changes
Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

@sambhav
sambhav force-pushed the sep-sdk-extension-points branch 8 times, most recently from 123efe7 to 636756c Compare September 22, 2026 13:45
yarolegovich
yarolegovich approved these changes Oct 2, 2026
View reviewed changes
felixweinberger
felixweinberger previously approved these changes Oct 7, 2026
View reviewed changes
@sambhav
sambhav dismissed felixweinberger’s stale review via 1eb92f8 October 7, 2026 18:46
sambhav and others added 9 commits October 7, 2026 19:46
@sambhav
SEP-3371: Consistent SDK extension points
95ead97
@sambhav
SEP-3371: address review feedback
d32ef2c
@sambhav @claude
Simplify SEP-3371 and resolve conflicting requirements
69268e3
- Consolidate repeated rules into Conventions, General requirements, and Extension rules
- Registering a method fixes its name and types; behaviour changes go through middleware or existing replacement APIs
- Replace rollback atomicity with a no-partial-install rule
- Require middleware ordering control, leave the mechanism to SDKs
- Leave dependency check timing to SDKs, SHOULD check at startup
- Make packaging guidance a SHOULD; trim terminology and appendix notes

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015SKdZofPNU5AUcBGeV31is
@sambhav @claude
Drop request-local state requirement from SEP-3371
7f8036d
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015SKdZofPNU5AUcBGeV31is
@sambhav @claude
Remove redundant requirements from SEP-3371
f3cd85f
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015SKdZofPNU5AUcBGeV31is
@sambhav @claude
Address second round of SEP-3371 review
1f064a4
- Scope method-name and type rules to the extension registration path
- State requirements as outcomes; leave mechanisms to each SDK
- Drop the dependency matching rules; SDKs choose how dependencies are expressed
- Clarify sending-direction middleware, stream handling, and cleanup
- Allow any ordering mechanism; add optional named insertion points
- Add -32603 guidance for dependency checks during request handling
- Tie the Tier 1 requirement to the next spec release after Final
- Move Ruby to Tier 1 in Appendix A
- Add non-normative Appendix C with example stacking designs

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Hwbri51KtC2ugmjkNwKD7D
@sambhav
SEP-3371: clarify dependency checks for dynamic configuration
fc3e63d
@sambhav
SEP-3371: clarify pseudocode examples and demonstrate concrete behaviour
6000bd6
@sambhav @claude
SEP-3371: address Core Maintainers feedback on transport layer, disco…
cc87130
…verability, and SDK coverage

- Split middleware into JSON-RPC middleware (the default) and HTTP transport
  middleware for behaviour JSON-RPC cannot express, with context passed
  between layers. Typed per-method middleware is optional.
- Add transport hooks: HTTP routes and stdio launch configuration, so
  authorization extensions and Server Card can ship as packages, with a
  coverage table mapping their needs to requirements.
- Require SDKs to document supported extension points and expose them as a
  local set of identifiers versioned by defining SEP, with alternatives
  considered.
- Add the authorization extensions and Server Card to Appendix B, and
  Appendix D rating each requirement against TypeScript, Python, C#, Go,
  Rust, and Java, with gaps by SDK.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@sambhav

sambhav commented Oct 7, 2026

Copy link
Copy Markdown
Member Author

Updated after the Core Maintainers meeting, which asked for three things.

Transport-level middleware for auth and Server Card extensions. C# already layers it this way: ASP.NET Core middleware for HTTP and auth (AddMcp), then JSON-RPC message filters and typed request filters, with the HTTP user copied onto each message. The SEP now follows that model: JSON-RPC middleware is the default, HTTP transport middleware is for what it can't do (401/WWW-Authenticate, retry after a challenge), and new transport hooks cover HTTP routes (Server Card, /.well-known/oauth-protected-resource) and the stdio launch environment. Typed middleware is optional.

These were added after checking that SDKs already offer the underlying seams:

SDK Client: hook on every request, can retry Server: identity to handlers stdio env/args
TypeScript fetch middleware for GET, POST, DELETE bearer-shaped AuthInfo yes
Python httpx.Auth flow on the shared client headers only yes
C# injected HttpClient any ClaimsPrincipal yes
Go http.Client RoundTripper bearer only; context key unexported exec.Cmd
Rust wrap StreamableHttpClient (custom_headers, typed 401/403) request Parts Command
Java request customizer and authorization error handler context extractor yes

Every server can sit behind host-framework middleware, and none blocks a <mcp>/server-card route. What's left is mainly passing non-bearer identity to handlers (TypeScript, Python, Go) and letting extensions, not only the app, add stdio settings, which no SDK does yet.

Discoverable, versioned extension points. SDKs document the extension points they support and expose them as a local set, e.g. jsonrpc-middleware@sep-3371. Versioning by SEP keeps identifiers stable from first implementation; a spec date would start as @draft and be renamed at release. The Rationale compares this with integer and spec-date versioning.

Works across type systems. Appendix D rates every requirement for these six SDKs. None of the gaps comes from the language itself; each is a missing API, such as Rust's single on_custom_request or Java's internal handler map.

Still no wire changes. @felixweinberger, could you take another look? SDK maintainers: corrections to Appendix D for your SDK are welcome.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@sambhav
sambhav force-pushed the sep-sdk-extension-points branch from 1eb92f8 to cc87130 Compare October 7, 2026 18:51
kurtisvg
kurtisvg reviewed Oct 7, 2026
View reviewed changes
Comment thread seps/3371-sdk-extension-points.md

Server Card serves a document beneath the MCP endpoint, and authorization extensions serve protected resource metadata at well-known paths, both outside the MCP endpoint's JSON-RPC processing.

- SDKs **MUST** let applications and extensions serve additional HTTP routes, for any HTTP method including `OPTIONS`, with full control of status, headers, and body. Most SDKs mount the MCP endpoint in a host framework, and documented [host composition](#host-frameworks) that lets an extension package add its routes satisfies this.

@kurtisvg kurtisvg Oct 7, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Is this for the top level route only? or for any route?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@sambhav sambhav Oct 7, 2026

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Any route.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread seps/3371-sdk-extension-points.md
Server Card serves a document beneath the MCP endpoint, and authorization extensions serve protected resource metadata at well-known paths, both outside the MCP endpoint's JSON-RPC processing.

- SDKs **MUST** let applications and extensions serve additional HTTP routes, for any HTTP method including `OPTIONS`, with full control of status, headers, and body. Most SDKs mount the MCP endpoint in a host framework, and documented [host composition](#host-frameworks) that lets an extension package add its routes satisfies this.
- Routes **MUST** be possible both beneath the MCP endpoint path, such as `<mcp-endpoint>/server-card`, and at origin-level paths such as `/.well-known/oauth-protected-resource` and `/.well-known/ai-catalog.json`.

@kurtisvg kurtisvg Oct 7, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Does this apply just to .well-known or outside of it?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@sambhav sambhav Oct 7, 2026

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Any route as applicable

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
chr-hertel
chr-hertel reviewed Oct 7, 2026
View reviewed changes
Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

@roller100 roller100 mentioned this pull request Oct 8, 2026
Proposal for discussion: a lineage parent key in _meta, as a Financial Services extension modelcontextprotocol/financial-services-interest-group#16
Open
dsp-ant
dsp-ant reviewed Oct 8, 2026
View reviewed changes

@dsp-ant dsp-ant left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

I still believe we need some form of versioning that is independent from the protocol version. We are describing an API interface of a certain shape and guarantees. If that changes, we have no way to communicate to people which API interface version we support. I understand in general updating it will be tied to MCP release cadence because of conformance testing, however:

  1. In beta versions this is not clear.
  2. The MCP Spec version is tied to the MCP protocol and generally implies negotiation, which is not true for the API interface. I think reusing the version is confusing.

I would rather prefer if we have Extension API Interface version 1 that people can introspect at runtime via Extensions.InterfaceVersion. In the release notes of the SDK we can always refer to which Extension API Interface it implements. For example, if V1 and V2 is backwards compatible, an SDK might chose to ship v2 anytime before the next spec release. There is no way to communicate that an SDK supports a next generation interface in the current SEP.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md

```typescript
// Pseudocode: Handler is an invented message-stream interface.
function searchMiddleware(next: Handler): Handler {

@dsp-ant dsp-ant Oct 8, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

What's a handler here? The distinction between JSON-RPC middleware and a transport middleware is exactly in the type information about the middleware. I would have expected that a JSON-RPC Middleware will return some Request or Response JSON-RPC handler, where as a transport or middleware just has a general type T that represents a transport and has some associated interface that is dependent on the SDK that middleware can manipulate.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@sambhav sambhav Oct 10, 2026

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

The Handler in the example is illustrative; its shape depends on the language and SDK. By typed middleware I meant method-specific middleware, like tool calls, alongside arbitrary json rpc middleware. Both can be useful, and method-specific middleware stays a MAY.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md Outdated
Comment on lines +316 to +318
### 4. Transport hooks

Transport hooks let extensions add to a transport without wrapping message processing. They are not middleware: an HTTP route handles its own requests rather than calling the next layer, and a launch setting configures a process rather than intercepting messages. As with transport middleware, extensions use them only for behaviour that cannot be expressed on JSON-RPC messages.

@dsp-ant dsp-ant Oct 8, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

I am not sure I understand the need for transport hooks. I feel a transport hook is strictly a subset of a middleware.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@halter73 halter73 Oct 8, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

HTTP routing can be implemented through middleware, so “they are not middleware” is too categorical. Launch arguments and environment variables are configuration before a process starts. I'd describe routing and launch configuration as separate capabilities, without saying that routing cannot be implemented through middleware.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@sambhav sambhav Oct 10, 2026

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Agreed, routes can be implemented through middleware. Changed the wording to describe route contribution and launch configuration as separate capabilities.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@dsp-ant dsp-ant Oct 26, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

I think saying that frameworks must provide a way for routing and launch configuration is enough (to @halter73's point)

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
halter73
halter73 reviewed Oct 8, 2026
View reviewed changes

@halter73 halter73 left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

@dsp-ant, I'm not sure I see the value of cross-SDK interface versioning. Given that extensions already need compatible SDK package versions to access the concrete APIs, what code would use Extensions.InterfaceVersion to make a decision that package compatibility or individual feature detection cannot make?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread seps/3371-sdk-extension-points.md

Some methods produce more than one message. Middleware **MUST** be able to act on each message as it is produced or consumed, not only on a final result. Adding middleware **MUST NOT** change delivery order, cancellation, or error propagation, or force buffering of the whole stream. This covers protocol messages, not transport frames.

In the sending direction, middleware acts on an outgoing message before it is sent and on any messages returned by that operation. For a client request, this covers the outgoing request and the peer's response messages, including supported intermediate results. An outgoing notification has no response of its own. A notification emitted on a `subscriptions/listen` stream can be handled as a yielded message in the receiving chain for that request. A separate sending chain is not required when the receiving chain already covers those outbound messages. SDKs choose the API shape; the generator above illustrates receiving middleware, not a required signature for every direction.

@halter73 halter73 Oct 8, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

On stdio, a client cannot reliably associate deprecated logging notifications with a particular operation. Should these messages still be interceptable without request correlation, or can they be excluded from the required client-side middleware coverage?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread seps/3371-sdk-extension-points.md Outdated

#### Host frameworks

An SDK **MAY** meet the transport middleware and [transport hook](#4-transport-hooks) requirements through the host's HTTP stack, such as ASP.NET Core middleware and endpoints, Express or Hono, ASGI, `net/http` handlers and round trippers, Tower layers and routers, or servlet filters, if it exposes its HTTP handler and HTTP client as composable units and documents how to pass context into message processing. A dedicated MCP API is not required where the host's mechanism suffices, but an extension package **MUST** be able to contribute its transport middleware and hooks through the same registration as its other contributions or through documented host composition.

@halter73 halter73 Oct 8, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

The host-framework section permits contributions through documented host composition. Does an extension still need to declare every contribution in one SDK registration, or can its package configure SDK services/filters and host middleware/routes separately? I'd like normal host configuration and options validation to satisfy this, with setup failures preventing activation, rather than require a combined plugin registration framework.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@sambhav sambhav Oct 10, 2026

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Separate host composition makes sense; clarified that a package can configure those contributions separately. I'd still keep dependency declaration and verification as capabilities the SDK provides.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread seps/3371-sdk-extension-points.md Outdated
Comment on lines +316 to +318
### 4. Transport hooks

Transport hooks let extensions add to a transport without wrapping message processing. They are not middleware: an HTTP route handles its own requests rather than calling the next layer, and a launch setting configures a process rather than intercepting messages. As with transport middleware, extensions use them only for behaviour that cannot be expressed on JSON-RPC messages.

@halter73 halter73 Oct 8, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

HTTP routing can be implemented through middleware, so “they are not middleware” is too categorical. Launch arguments and environment variables are configuration before a process starts. I'd describe routing and launch configuration as separate capabilities, without saying that routing cannot be implemented through middleware.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread seps/3371-sdk-extension-points.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread seps/3371-sdk-extension-points.md

- A dependency **MUST NOT** be considered unmet solely because it was registered or enabled after the extension that requires it.
- An extension's handlers and middleware **MUST NOT** run unless its dependencies are satisfied by the local configuration applicable to that execution.
- SDKs choose when to check dependencies and **SHOULD** check before serving where possible. A configuration-time check is sufficient when the relevant configuration cannot change. Where it can change or vary by request, the SDK **MUST** ensure the dependencies remain satisfied before running the extension.

@halter73 halter73 Oct 8, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Can we add a concrete example where dependency validation must happen during execution rather than during configuration? The examples here seem satisfiable with startup validation. In C#, we'd prefer required DI services and options validation where those suffice, rather than introduce a parallel dependency system.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@sambhav sambhav Oct 10, 2026

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

One example is a mode selected from the peer's capabilities that needs another local extension. That dependency would be checked once the mode is selected, before it runs. These cases are fairly niche though; fixed dependencies can still be checked at startup.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
halter73
halter73 reviewed Oct 9, 2026
View reviewed changes
Comment thread seps/3371-sdk-extension-points.md Outdated
Extension packages and applications need to know which extension points an SDK supports before relying on them, both in documentation and in code.

- SDKs **MUST** document each extension point that they support, with the APIs that provide it and their ordering rules, in one place reachable from the SDK's main documentation.
- SDKs **MUST** expose, through a public API, the set of extension points in this SEP that they support, for each role, client and server, they implement. An identifier is included only if the SDK meets every requirement for that extension point in that role.

@halter73 halter73 Oct 9, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

What is the concrete use case for requiring runtime support introspection? An extension still needs an SDK-specific implementation and compatible SDK package versions to use these APIs. Could we use the standardized identifiers for documentation and conformance reporting while making the public introspection API optional?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@sambhav sambhav Oct 10, 2026

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

Made this optional. It was added in response to core maintainer feedback, but I'm fairly flexible here. @dsp-ant, did I capture your suggestion correctly? It would help to understand the use case for making it required.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@dsp-ant dsp-ant Oct 26, 2026

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

dynamic languages like Python might use that form of introspection to branch code to guarantee BC. E.g

match mcp.extension.version:
    case 2:
       mcp.extension.register(MyV2Extension())
    case 1:
       mcp.extension.register(MyV1Extension())

For me it just guarantees introspection.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@sambhav
sambhav force-pushed the sep-sdk-extension-points branch from a5320e6 to cc87130 Compare October 10, 2026 03:55
@sambhav
SEP-3371: clarify SDK extension requirements and composition
bca5ff1
@yarolegovich yarolegovich mentioned this pull request Oct 12, 2026
skills: add SEP-2640 protocol support modelcontextprotocol/go-sdk#1238
Open
@felixweinberger felixweinberger mentioned this pull request Oct 22, 2026
sep(SEP-3415): Events Extension #3415
Open
@sep-automation-bot

sep-automation-bot Bot commented Oct 26, 2026

Copy link
Copy Markdown

Maintainer Activity Check

Hi @felixweinberger!

You're assigned to this SEP but there hasn't been any activity from you in 18 days.

Please provide an update on:

  • Current status of your review/work
  • Any blockers or concerns
  • Expected timeline for next steps

If you're no longer able to sponsor this SEP, please let us know so we can find another maintainer.


This is an automated message from the SEP lifecycle bot.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@dsp-ant

dsp-ant commented Oct 26, 2026

Copy link
Copy Markdown
Member

@dsp-ant, I'm not sure I see the value of cross-SDK interface versioning. Given that extensions already need compatible SDK package versions to access the concrete APIs, what code would use Extensions.InterfaceVersion to make a decision that package compatibility or individual feature detection cannot make?

I see that. I am okay if it's purely something that's worth documenting

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@halter73 halter73 mentioned this pull request Oct 28, 2026
Support dependency-injected Skills catalogs and request services modelcontextprotocol/csharp-sdk#1969
Closed
@kingyewchoo kingyewchoo mentioned this pull request Nov 2, 2026
Outline for review: a tool-call audit record a regulator can verify (Regulatory audit & attestation) modelcontextprotocol/financial-services-interest-group#17
Open
@chr-hertel chr-hertel mentioned this pull request Nov 4, 2026
[Server] Answer server/discover with a request handler modelcontextprotocol/php-sdk#622
Merged
8 tasks done
@dsp-ant dsp-ant added the sdk-wg label Nov 6, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@koic koic koic left review comments
@kurtisvg kurtisvg kurtisvg left review comments
@dsp-ant dsp-ant dsp-ant left review comments
@maxisbey maxisbey maxisbey left review comments
@pja-ant pja-ant pja-ant left review comments
@felixweinberger felixweinberger felixweinberger left review comments
@KKonstantinov KKonstantinov Awaiting requested review from KKonstantinov
@pcarleton pcarleton Awaiting requested review from pcarleton
@tzolov tzolov Awaiting requested review from tzolov
@Kludex Kludex Awaiting requested review from Kludex
@mattzcarey mattzcarey Awaiting requested review from mattzcarey
@LucaButBoring LucaButBoring Awaiting requested review from LucaButBoring
+4 more reviewers
@halter73 halter73 halter73 left review comments
@chr-hertel chr-hertel chr-hertel left review comments
@DaleSeo DaleSeo DaleSeo left review comments
@yarolegovich yarolegovich yarolegovich approved these changes
Reviewers whose approvals may not affect merge requirements

At least 1 approving review is required to merge this pull request.

Uh oh!

There was an error while loading. Please reload this page.

Assignees

@felixweinberger felixweinberger

Labels

draft SEP proposal with a sponsor. sdk-wg SEP

Projects

SEP Review Pipeline
Status: No status

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

13 participants

@sambhav @dsp-ant @koic @halter73 @pcarleton @chr-hertel @felixweinberger @DaleSeo @yarolegovich @kurtisvg @LucaButBoring @maxisbey @pja-ant
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.