v2.0.0-preview.3
Pre-releaseThis preview reorganizes the Tasks feature into its own ModelContextProtocol.Extensions.Tasks package, keeping ModelContextProtocol.Core focused on the base protocol while a new generic request-handler and alternate-result surface lets the Tasks package layer on top. It also delivers correctness fixes to the draft 2026-07-28 protocol -- per-request client capabilities, negotiation boundaries, and the resultType discriminator -- plus Streamable HTTP client improvements (an empty-JSON-response fix and a new standalone GET-stream opt-out) and conformance-test consolidation.
Breaking Changes
Refer to the C# SDK Versioning documentation for details on versioning and breaking change policies.
- Tasks extracted into the new
ModelContextProtocol.Extensions.Taskspackage #1693- The Tasks API -- task result/notification types,
McpTaskStatus,IMcpTaskStore/InMemoryMcpTaskStore, thetasks/*request methods, and the clientGetTaskAsync/UpdateTaskAsync/CancelTaskAsync/CallToolRawAsyncmethods -- is removed fromModelContextProtocol.Coreand relocated to the newModelContextProtocol.Extensions.Taskspackage under theModelContextProtocol.Extensions.Tasksnamespace. - Core now exposes a task-agnostic
ResultOrAlternate<T>(replacingResultOrCreatedTask<T>) plus generic extension points --McpServerRequestHandler,McpServerOptions.RequestHandlers,McpServerHandlers.CallToolWithAlternateHandler,McpRequestFilters.CallToolWithAlternateFilters, andMcpServer.InterceptOutgoingRequests-- that the Tasks package builds on. - Migration: add a
PackageReferencetoModelContextProtocol.Extensions.Tasks; changeusing ModelContextProtocol.Protocol;tousing ModelContextProtocol.Extensions.Tasks;for task types; the task client/server APIs are now extension methods (McpTasksClientExtensions/McpTasksServerExtensions), and the task store is registered via the new builder extensions instead ofMcpServerOptions.TaskStore.
- The Tasks API -- task result/notification types,
Experimental APIs
To support extracting Tasks (#1693), ModelContextProtocol.Core gained a generic server-extension surface -- ResultOrAlternate<T>, McpServerRequestHandler, McpServerOptions.RequestHandlers, McpServerHandlers.CallToolWithAlternateHandler, McpRequestFilters.CallToolWithAlternateFilters, and McpServer.InterceptOutgoingRequests -- that lets extension packages such as ModelContextProtocol.Extensions.Tasks layer behavior onto the server pipeline. These APIs are annotated [Experimental] under diagnostic ID MCPEXP002.
This surface is still being designed: #1704 tracks composing these seams with the normal filter and subscription pipeline (typed custom RPCs, filter composition, and extension-defined subscriptions). Expect these low-level extensibility APIs to change and potentially remain [Experimental] through the 2.0.0 stable release.
What's Changed
- Fix request-scoped draft client capabilities #1685 by @PranavSenthilnathan (co-authored by @Copilot)
- Tighten draft protocol negotiation boundaries #1692 by @halter73 (co-authored by @Copilot)
- Fix missing resultType on complete result responses #1684 by @PranavSenthilnathan (co-authored by @Copilot)
- Ignore empty Streamable HTTP JSON responses #1626 by @jstar0
- Extract Tasks into the
ModelContextProtocol.Extensions.Tasksextension package #1693 by @jeffhandley (co-authored by @Copilot) - Add opt-out for Streamable HTTP standalone GET stream #1699 by @jstar0 (co-authored by @Copilot)
Test Improvements
- Re-enable http-custom-headers conformance scenario #1691 by @tarekgh
- Run stateful and stateless conformance endpoints in a single server process #1672 by @halter73 (co-authored by @Copilot)
Acknowledgements
- @jstar0 made their first contribution in #1626
- @cclabadmin submitted #1676 (resolved by #1684)
- @cclabadmin submitted #1680 (resolved by #1692)
- @DmitryLukyanov submitted #1132 (resolved by #1626)
- @KirillOsenkov submitted #1637 (resolved by #1699)
- @halter73 @tarekgh @PranavSenthilnathan @jeffhandley reviewed pull requests
Full Changelog: v2.0.0-preview.2...v2.0.0-preview.3