Skip to content

SEP-2243 HTTP Standardization#2243

Merged
kurtisvg merged 33 commits into
modelcontextprotocol:mainfrom
mikekistler:mdk/http-standardization-sep
Apr 15, 2026
Merged

SEP-2243 HTTP Standardization#2243
kurtisvg merged 33 commits into
modelcontextprotocol:mainfrom
mikekistler:mdk/http-standardization-sep

Conversation

@mikekistler

Copy link
Copy Markdown
Contributor

Motivation and Context

This PR introduces a SEP for incorporating HTTP features into the HTTP Transport that support processing by "middle boxes" on the internet, for tasks like routing, tracing, and priorization.

How Has This Been Tested?

I have a reference implementation built on the C# SDK that illustrates the basic features in this SEP.

https://github.com/mikekistler/csharp-sdk/tree/mdk/http-standardization

Breaking Changes

All changes are gated by protocol version and thus not breaking.

Types of changes

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

Checklist

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

Additional context

This PR was previously reviewed in the Transports Working Group and updated to address their feedback.
It has been approved to proceed to review by the core maintainers.

@mikekistler mikekistler changed the title SEP-xxxx HTTP Standardization SEP-2243 HTTP Standardization Feb 13, 2026
Comment thread seps/2243-http-standardization.md

@SamMorrowDrums SamMorrowDrums left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This is cool, I’d consider splitting out the extension from this proposal and making it separate because I think there’s little to no controversy in the method based routing part of the proposal. Virtually all my questions/comments pertain to the extended part.

I say that as somebody with existing production use-cases for extension as I mention in a comment, where I'm currently double parsing json.

Comment thread seps/xxxx-http-standardization.md Outdated
Comment thread seps/2243-http-standardization.md
Comment thread seps/2243-http-standardization.md
Comment thread seps/2243-http-standardization.md
Comment thread seps/2243-http-standardization.md
Comment thread seps/2243-http-standardization.md
Comment thread seps/2243-http-standardization.md
Comment thread seps/xxxx-http-standardization.md Outdated
Comment thread seps/xxxx-http-standardization.md Outdated
Comment thread seps/2243-http-standardization.md
Comment thread seps/2243-http-standardization.md
Comment thread seps/xxxx-http-standardization.md Outdated
Comment thread seps/xxxx-http-standardization.md Outdated
Comment thread seps/2243-http-standardization.md
@CaitieM20

Copy link
Copy Markdown
Contributor

This was voted on by core maintainers on 2/19 as Accept with Changes.

@SamMorrowDrums SamMorrowDrums left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@mikekistler thanks for thoughtful changes, looking good to me!

kurtisvg
kurtisvg previously approved these changes Mar 2, 2026
Comment thread seps/2243-http-standardization.md
Comment thread seps/xxxx-http-standardization.md Outdated
@kurtisvg kurtisvg self-assigned this Mar 4, 2026
@sep-automation-bot sep-automation-bot Bot added draft SEP proposal with a sponsor. and removed proposal SEP proposal without a sponsor. labels Mar 4, 2026
@sep-automation-bot

Copy link
Copy Markdown

State Transition: proposal → draft

This SEP has been transitioned from proposal to draft.

@kurtisvg has been assigned as the sponsor for this SEP.


This is an automated message from the SEP lifecycle bot.

@SamMorrowDrums

Copy link
Copy Markdown
Contributor

@kurtisvg I tagged you to review #2355
and @mikekistler I think you'd find it interesting too, because in a sense this is something where it might go the other way:

  • we can add such a recommendation to http spec already
  • we can eventually look at communicating the same data in a different place (such as initialization) for other transports

This PR sets a precedent for JSON RPC duplication in headers, and in my mind it's not crazy to propose the other direction so we can lean into the http transport for stuff it is already good at we are not using.

Unlike auth, where there are complex reasons to keep it in the transport, i18n feels a simple case.

Curious if you agree or have thoughts?

@kurtisvg

Copy link
Copy Markdown
Contributor

Here are the final vote after discussion in 3/4 Core Maintainer's meeting:

  • SEP-2243: HTTP Standardization
    • Outcome: Accept
    • Votes: 🟢 7 | 🟡 0 | 🔴 0

@kurtisvg

Copy link
Copy Markdown
Contributor

/lgtm

@localden localden added final SEP finalized. and removed accepted SEP accepted by core maintainers, but still requires final wording and reference implementation. labels Apr 17, 2026
@mcp-virtual-tpm mcp-virtual-tpm Bot added this to the 2026-06-30-RC milestone Apr 17, 2026
@pja-ant pja-ant mentioned this pull request Apr 23, 2026
1 task
CaitieM20 pushed a commit to CaitieM20/modelcontextprotocol that referenced this pull request Apr 23, 2026
The SEP was merged in modelcontextprotocol#2243 with Status: Draft. Update to Final and
regenerate SEP docs (index, docs.json, mdx).
@maciej-kisiel

Copy link
Copy Markdown
Contributor

Hi, we're currently implementing this SEP in the Go SDK (modelcontextprotocol/go-sdk#915). I have two requests for clarification:

  1. This functionality is specific to the streamable transport. For this reason, I believe the SDKs should try to contain the logic in the streamable transport layer as much as possible. However, the spec defines filtering tools with incorrect x-mcp-header annotations in the general sections about tools. This prevents us from handling the filtering on the transport level, as according to the current text in the spec STDIO should also follow this process, even though the annotations have no effect in it. Should the wording be adjusted to make this functionality apply only to the streamable transport and not affect STDIO at all?

  2. It's not clearly stated in the spec that the x-mcp-header annotations should apply only to top-level properties in tool's arguments. I would propose to make it explicit, as the only place that suggests this is the intention is the planned conformance test that lists nested property annotation as an error scenario.

@mikekistler

Copy link
Copy Markdown
Contributor Author

Regarding x-mcp-header only applying to top-level properties, I don't think this restriction is intended so I think the fix is in the conformance tests, to not treat this as an error.

@markdroth markdroth mentioned this pull request May 5, 2026
9 tasks
@maciej-kisiel

Copy link
Copy Markdown
Contributor

And three more questions coming from implementation:

  1. Is it really required to support case insensitive matching of the =?base64? prefix? Again, it seems that the SEP body and specification changes do not suggest this (and header values are supposed to be case sensitive), but the conformance test description contains such case with a note that it should be accepted by the server.
  2. Both our and the C# implementation seem to make use of a tool schema cache that is filled when ListTools is called. I believe we should align on a cross-SDK approach what should happen if the tool being called is not in such cache (either ListTools was not called beforehand or stale information was used). Would returning an error in such case make sense? Quietly calling ListTools from within CallTool sounds like a bad idea and without the schema the client may not fulfill the MUST to send the headers.
  3. Numbers in tool arguments are supposed to be "Converted to decimal string representation" and servers are supposed "match the corresponding values in the request body" and "reject requests with a 400 Bad Request HTTP status if any validation fails". Number <-> string conversion is not as well defined as e.g. bool <-> string and some small differences are likely to appear. Should "42" and "42.0" be considered matching?

@mikekistler

Copy link
Copy Markdown
Contributor Author
  1. Is it really required to support case insensitive matching of the =?base64? prefix?

This also seems like a bug in the conformance test. I would say that should be case-sensitive matched only.

  1. what should happen ... if ListTools was not called beforehand

This is an interesting case! One possibility is that the SDK catch the error response and if the error is for missing headers only then issue the tools/list to get the inputSchema and then redrive the tools/call with the updated schema.

  1. Number <-> string conversion is not as well defined

Another interesting detail. I do you expect that the values will be compared as strings or as numbers? If as numbers, I wonder if "numerically equal within some precision", like 1E-6, would be sufficient.

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

Labels

final SEP finalized. roadmap/transport Roadmap: Transport Evolution & Scalability (incl. Server Cards) SEP

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.