Skip to content

SEP-2322: Multi Round-Trip Requests #2322

Merged
CaitieM20 merged 112 commits intomodelcontextprotocol:mainfrom
CaitieM20:merge
May 6, 2026
Merged

SEP-2322: Multi Round-Trip Requests #2322
CaitieM20 merged 112 commits intomodelcontextprotocol:mainfrom
CaitieM20:merge

Conversation

@CaitieM20
Copy link
Copy Markdown
Contributor

@CaitieM20 CaitieM20 commented Feb 28, 2026

This is a draft SEP for Multi Round-Trip Requests (MRTR) from the Transports Working Group. It is one of the changes discussed and planned at the December 2025 Core Maintainer Meetup. Exploring the Future of MCP Transports Blog

This SEP Is still in draft, Schema changes are proposed but not locked, documentation updates, conformance tests and additional work still to come, but its ready to move out of Transports Working Group and open up to broader feedback.

Authors: Mark D. Roth (@markdroth), Caitie McCaffrey (@CaitieM20), Gabriel Zimmerman (@gjz22)

Motivation and Context

See SEP for details.

How Has This Been Tested?

Conformance Tests: modelcontextprotocol/conformance#188

Breaking Changes

Yes, see SEP for details

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

Additional context

CaitieM20 and others added 30 commits February 20, 2026 10:36
…uestParams — now available on any

  client-initiated request, not just tool calls
   2. Added typed InputResponse = ElicitResult | CreateMessageResult — InputResponses values are now properly typed
  instead of { result: { [key: string]: unknown } }
   3. Updated examples — removed the extra result wrapper from TaskInputResponseRequest and
  TaskInputResponseRequestParams examples to match the new typed schema

  All checks pass: ✅ TypeScript compiles, ✅ JSON schema up to date, ✅ 140/140 examples valid.

Caitie Note: Need to take a look at task-input-response-params.json looks wrong on cursory inspection.
…itRequets these should only be sent as part of IncompleteResponse Objects now
…a JSONRPCIncompleteResultResponse and add examples
…pper in the SEP because InputRequests maps keys directly to the requests so the InputResponses now follows that pattern and there is no benefit to the added wrapper. The only argument for the wrapper would be if we wanted to carry error's alongside results but we do not in these cases. If there is an error the client would retry until the necessary information was retrieved and then send back to the server.
@LucaButBoring LucaButBoring mentioned this pull request Apr 29, 2026
9 tasks
@prezaei
Copy link
Copy Markdown

prezaei commented Apr 29, 2026

Conflict with SEP-2663 on isError: true handling

SEP-2322's edit to tasks.mdx says tool calls with isError: true SHOULD reach failed status. However, SEP-2663 (Tasks Extension, which supersedes the experimental tasks spec) explicitly states the opposite: "completed status... includes tool calls that returned results with isError: true", and that failed is reserved for JSON-RPC errors only.

Since SEP-2663 seems newer and specifically redesigns the failed vs completed semantics. Maybe the tasks.mdx edit in this PR should be updated to align?

@panyam
Copy link
Copy Markdown

panyam commented Apr 29, 2026

Conflict with SEP-2663 on isError: true handling

SEP-2322's edit to tasks.mdx says tool calls with isError: true SHOULD reach failed status. However, SEP-2663 (Tasks Extension, which supersedes the experimental tasks spec) explicitly states the opposite: "completed status... includes tool calls that returned results with isError: true", and that failed is reserved for JSON-RPC errors only.

Since SEP-2663 seems newer and specifically redesigns the failed vs completed semantics. Maybe the tasks.mdx edit in this PR should be updated to align?

Following up on this:

I started to implement both semantics (in an experimental go sdk) - in v1/experimental maps isError: true -> failed, while v2 (aligned with SEP-2663) maps it to completed. The 2663 semantics are cleaner: failed means "the protocol broke" (JSON-RPC error), completed means "the tool ran and gave you a result" (even if that result says isError: true).

Since 2663 supersedes the experimental tasks spec, would it make sense to either drop the tasks.mdx edit from this PR (let 2663 own the semantics), or align it with 2663 for the interim? That way implementations don't have conflicting guidance during the migration window.

@prezaei

This comment was marked as resolved.

Comment thread docs/specification/draft/client/elicitation.mdx Outdated
@CaitieM20
Copy link
Copy Markdown
Contributor Author

Conflict with SEP-2663 on isError: true handling

SEP-2322's edit to tasks.mdx says tool calls with isError: true SHOULD reach failed status. However, SEP-2663 (Tasks Extension, which supersedes the experimental tasks spec) explicitly states the opposite: "completed status... includes tool calls that returned results with isError: true", and that failed is reserved for JSON-RPC errors only.

Since SEP-2663 seems newer and specifically redesigns the failed vs completed semantics. Maybe the tasks.mdx edit in this PR should be updated to align?

All of these SEPs are still in progress, We are collaborating on order of check in to make sure we land the docs correctly. This SEP is planned to be checked in prior to SEP-2663, so we'll address the task specific doc changes in that one, while also pulling this out into an Extension

@CaitieM20 CaitieM20 requested review from kurtisvg and pja-ant May 5, 2026 00:59
* rename IncompleteResult to InputRequiredResult
Comment thread docs/seps/2322-MRTR.mdx
@prezaei
Copy link
Copy Markdown

prezaei commented May 5, 2026

ResultType discriminator value: "input_required" vs "incomplete"

This PR defines ResultType with the value "input_required" for MRTR responses. SEP-2663 (Tasks Extension, accepted with changes) defines the same union as "complete" | "incomplete" | "task" — using "incomplete" instead of "input_required" for the MRTR discriminator.

Both PRs are targeting the 2026-06-30 spec. Since this PR is planned to land first (@CaitieM20 confirmed), the value here becomes the initial definition that SEP-2663 either adopts or renames. But neither PR currently documents the transition — SEP-2663's ResultType union silently uses "incomplete" without noting that it replaces "input_required".

Could you align on which value to use? The choice seems straightforward (pick one, update the other), but landing both with different values for the same concept would create a window where SDKs implement against the wrong discriminator.

cc @CaitieM20 @LucaButBoring

@CaitieM20
Copy link
Copy Markdown
Contributor Author

CaitieM20 commented May 5, 2026

ResultType discriminator value: "input_required" vs "incomplete"

This PR defines ResultType with the value "input_required" for MRTR responses. SEP-2663 (Tasks Extension, accepted with changes) defines the same union as "complete" | "incomplete" | "task" — using "incomplete" instead of "input_required" for the MRTR discriminator.

Both PRs are targeting the 2026-06-30 spec. Since this PR is planned to land first (@CaitieM20 confirmed), the value here becomes the initial definition that SEP-2663 either adopts or renames. But neither PR currently documents the transition — SEP-2663's ResultType union silently uses "incomplete" without noting that it replaces "input_required".

Could you align on which value to use? The choice seems straightforward (pick one, update the other), but landing both with different values for the same concept would create a window where SDKs implement against the wrong discriminator.

cc @CaitieM20 @LucaButBoring

Hey @prezaei if you can give us til 5/15 to get all the in flight SEPs landed, vs open comments where they differ that'd be helpful. We are tracking all the issues and will make sure the Draft Specification and Schema is coherent when we cut an RC on 5/15.

@CaitieM20 CaitieM20 merged commit 77a4816 into modelcontextprotocol:main May 6, 2026
5 checks passed
@CaitieM20 CaitieM20 deleted the merge branch May 6, 2026 17:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accepted SEP accepted by core maintainers, but still requires final wording and reference implementation. roadmap/transport Roadmap: Transport Evolution & Scalability (incl. Server Cards) SEP transport Related to MCP transports

Projects

Status: Accepted

Development

Successfully merging this pull request may close these issues.