You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The HTTP+SSE transport was superseded by Streamable HTTP in the 2025-03-26
spec revision and is formally deprecated under SEP-2596. Mark every public
entry point with typing_extensions.deprecated so type checkers flag it and a
runtime MCPDeprecationWarning fires: sse_client, SseServerParameters,
SseServerTransport, MCPServer.sse_app / run_sse_async, and the
run(transport="sse") overload. Nested constructions suppress the inner
warning so callers see exactly one.
Also: mcp run --transport help text drops sse, python -m mcp.client
connects with Streamable HTTP, and the url_elicitation client snippet
moves to Streamable HTTP. Docs and migration guide updated.
No-Verification-Needed: user requested immediate push, verification explicitly waived
Copy file name to clipboardExpand all lines: docs/client/session-groups.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,7 +24,7 @@ Create a `ClientSessionGroup` and call **`connect_to_server`** once per server:
24
24
--8<--"docs_src/session_groups/tutorial003.py"
25
25
```
26
26
27
-
*`connect_to_server` takes transport parameters, not a server object: `StdioServerParameters` (from `mcp`) to launch a subprocess, or `StreamableHttpParameters`/ `SseServerParameters`(from `mcp.client.session_group`) for a server already listening on a URL.
27
+
*`connect_to_server` takes transport parameters, not a server object: `StdioServerParameters` (from `mcp`) to launch a subprocess, or `StreamableHttpParameters` (from `mcp.client.session_group`) for a server already listening on a URL. `SseServerParameters` is still accepted for a server on the deprecated HTTP+SSE transport, and warns.
28
28
*`group.tools` is a `dict[str, Tool]` of every connected server's tools. `group.resources` and `group.prompts` are the same shape.
29
29
*`group.call_tool(name, arguments)` looks the name up, finds the session that owns it, and forwards the call. You never say which server.
Copy file name to clipboardExpand all lines: docs/client/transports.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -102,7 +102,7 @@ Leaving the `async with` block also shuts the subprocess down: close stdin, wait
102
102
103
103
## SSE
104
104
105
-
`sse_client(url)`, from `mcp.client.sse`, is the HTTP transport that Streamable HTTP superseded. Wrap it the same way, `Client(sse_client("http://localhost:8000/sse"))`, to talk to a server that still speaks it, and don't build anything new on it.
105
+
`sse_client(url)`, from `mcp.client.sse`, is the HTTP transport that Streamable HTTP superseded, and it is now formally deprecated ([SEP-2596](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2596)): calling it emits `MCPDeprecationWarning` (see **[Deprecated features](../deprecated.md)**). Wrap it the same way, `Client(sse_client("http://localhost:8000/sse"))`, to talk to a server that still speaks it, and don't build anything new on it.
Copy file name to clipboardExpand all lines: docs/deprecated.md
+7-4Lines changed: 7 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Deprecated features
2
2
3
-
The 2026-07-28 spec retires five things. The SDK still implements every one of them, and every one of them now carries a **deprecation warning**.
3
+
The 2026-07-28 spec retires five things, and the spec's deprecation registry carries a sixth from earlier: the legacy HTTP+SSE transport. The SDK still implements every one of them, and every one of them now carries a **deprecation warning**.
4
4
5
5
The table below names each deprecated feature, why it is going away, and the replacement to build on.
6
6
@@ -13,18 +13,20 @@ The table below names each deprecated feature, why it is going away, and the rep
13
13
|**Protocol logging**: `ctx.log()`, `ctx.debug()`, `ctx.info()`, `ctx.warning()`, `ctx.error()`, `ctx.session.send_log_message()`, `client.set_logging_level()`| SEP-2577 retires the capability. Nothing in-protocol replaces it. | Ordinary `import logging` to stderr (see **[Logging](handlers/logging.md)**). |
14
14
|**`ping`**: `client.send_ping()`|**Removed** from the protocol, not merely deprecated. There is no `ping` method in 2026-07-28. | Nothing. It only works against a `mode="legacy"` connection. |
15
15
|**Client->server progress**: `client.send_progress_notification()`| 2026-07-28 makes progress server->client only. | Nothing to send. Your *server* reports progress with `ctx.report_progress()` (see **[Progress](handlers/progress.md)**). |
16
+
|**HTTP+SSE transport**: `sse_client()`, `SseServerParameters`, `mcp.sse_app()`, `mcp.run(transport="sse")`, `SseServerTransport`| Superseded by Streamable HTTP in the 2025-03-26 spec; [SEP-2596](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2596) formally classifies it as deprecated. | Streamable HTTP: `Client(url)` / `streamable_http_client()` on the client, `mcp.run(transport="streamable-http")` / `streamable_http_app()` on the server (see **[Running your server](run/index.md)** and **[Transports](client/transports.md)**). |
16
17
17
-
Three things fall out of that table:
18
+
Four things fall out of that table:
18
19
19
20
* Roots, sampling, and logging go together. One proposal, **SEP-2577**, deprecates all three capabilities at once.
20
21
* Sampling and roots share a deeper problem: they are places a **server** sends a **request** to the **client**. That whole direction is what 2026-07-28 replaces with **[Multi-round-trip requests](handlers/multi-round-trip.md)**. It is the standalone RPC methods (`sampling/createMessage`, `roots/list`, and push-style `elicitation/create`) that are gone; the `CreateMessageRequest` / `ListRootsRequest` / `ElicitRequest` payload types survive, embedded in `InputRequiredResult.input_requests`, and on the client they hit the same callbacks.
21
22
*`ping` is the odd one out. The protocol does not deprecate it, it removes it. The SDK method still warns (its message says *removed*, not *deprecated*) and calling it on a modern connection answers with *"Method not found"*.
23
+
* The transport is odd in the other direction: it is not part of the 2026-07-28 story at all. Streamable HTTP superseded HTTP+SSE back in 2025-03-26, and it has been the "don't build on it" transport ever since; SEP-2596's feature-lifecycle policy simply put it on the formal register. It is also the only row that is a transport rather than a capability, so it doesn't turn on the negotiated version: the same `streamable_http_app()` serves both eras of client (see **[Serving legacy clients](run/legacy-clients.md)**), and nothing needs SSE.
22
24
23
25
## Deprecated is advisory
24
26
25
27
Nothing breaks today.
26
28
27
-
Every method above keeps working against any session that negotiated **2025-11-25 or earlier**. Pin `mode="legacy"` on the client and you get exactly the pre-2026 behaviour. There are no wire changes and capability negotiation is unchanged.
29
+
Every method above keeps working against any session that negotiated **2025-11-25 or earlier**. Pin `mode="legacy"` on the client and you get exactly the pre-2026 behaviour. There are no wire changes and capability negotiation is unchanged. The transport row is simpler still: `sse_client()` and `sse_app()` do exactly what they always did, wire and all; they just warn when you call them.
28
30
29
31
What changes is that you get a visible warning the first time each one runs:
30
32
@@ -82,7 +84,8 @@ That is the whole API. There is no per-method switch, and you don't want one: th
82
84
## Recap
83
85
84
86
* The 2026-07-28 spec deprecates **roots**, server-initiated **sampling**, and protocol **logging** (all [SEP-2577](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2577)), restricts **progress** to server-to-client, and removes **`ping`**.
85
-
* The replacement column points you onward: **[Multi-round-trip requests](handlers/multi-round-trip.md)** for sampling and roots, **[Logging](handlers/logging.md)** for logging, **[Progress](handlers/progress.md)** for progress. `ping` needs nothing at all.
87
+
* The legacy **HTTP+SSE transport** is deprecated too ([SEP-2596](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2596)), superseded by Streamable HTTP since 2025-03-26.
88
+
* The replacement column points you onward: **[Multi-round-trip requests](handlers/multi-round-trip.md)** for sampling and roots, **[Logging](handlers/logging.md)** for logging, **[Progress](handlers/progress.md)** for progress, Streamable HTTP for the transport. `ping` needs nothing at all.
86
89
* Deprecated is advisory: no wire changes, everything keeps working against pre-2026 sessions, and you get a visible `MCPDeprecationWarning` (a `UserWarning`, so it is on by default).
87
90
* Sampling and roots additionally need a back-channel that a 2026-07-28 session does not have. On a modern connection they warn and then they raise.
88
91
*`warnings.filterwarnings("ignore", category=MCPDeprecationWarning)` silences the whole category; `"error::mcp.MCPDeprecationWarning"` in pytest turns it into a test failure.
Copy file name to clipboardExpand all lines: docs/migration.md
+11-1Lines changed: 11 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,6 +27,7 @@ Every section heading below names the API it affects, so searching this page for
27
27
| Lowlevel return value wrapping removed | bare list or dict returns fail result validation instead of being wrapped |[wrapping removed](#lowlevel-server-automatic-return-value-wrapping-removed)|
28
28
| Lowlevel tool exceptions no longer become `isError: true` results | clients raise a JSON-RPC error instead of seeing the error text |[tool exceptions](#lowlevel-server-tool-handler-exceptions-no-longer-become-calltoolresultis_errortrue)|
29
29
| Roots, Sampling, and Logging deprecated (SEP-2577) |`MCPDeprecationWarning` at call sites |[SEP-2577](#roots-sampling-and-logging-methods-deprecated-sep-2577)|
30
+
| HTTP+SSE transport deprecated (SEP-2596) |`MCPDeprecationWarning` from `sse_client`, `sse_app`, `run(transport="sse")`|[SEP-2596](#httpsse-transport-deprecated-sep-2596)|
30
31
31
32
### Find your area
32
33
@@ -41,7 +42,7 @@ Every section heading below names the API it affects, so searching this page for
41
42
| maintain OAuth client auth or a protected server |[OAuth and server auth](#oauth-and-server-auth)|
42
43
| relied on lenient handling of off-schema traffic, or assert on exact wire bytes |[Stricter protocol validation and wire behavior](#stricter-protocol-validation-and-wire-behavior)|
43
44
| test against in-memory server/client pairs |[Testing utilities](#testing-utilities)|
44
-
| use roots, sampling, logging, or client-to-server progress |[Deprecations](#deprecations)|
45
+
| use roots, sampling, logging, client-to-server progress, or the HTTP+SSE transport|[Deprecations](#deprecations)|
45
46
| operate servers that 2026-era clients will also connect to |[Notes for 2026-era connections](#notes-for-2026-era-connections)|
46
47
47
48
## Suggested migration order
@@ -2792,6 +2793,15 @@ The 2026-07-28 spec restricts `notifications/progress` to the server-to-client d
2792
2793
2793
2794
On the server side, prefer the new dispatcher-agnostic `ServerSession.report_progress(progress, total, message)` (and `Context.report_progress()` on `MCPServer`) over the raw `ServerSession.send_progress_notification(progress_token, …)`. `report_progress` encapsulates the "no-op when the caller did not request progress" rule and works on every dispatcher; the raw token-taking form remains for handlers that read `_meta.progressToken` directly.
2794
2795
2796
+
### HTTP+SSE transport deprecated (SEP-2596)
2797
+
2798
+
The legacy HTTP+SSE transport (a `GET` that opens an event stream, plus a separate `POST` message endpoint) was superseded by Streamable HTTP in protocol revision 2025-03-26, and the spec's feature-lifecycle policy ([SEP-2596](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2596)) now formally classifies it as Deprecated with Streamable HTTP as the migration path. The SDK still ships it, and every entry point now carries `typing_extensions.deprecated` and emits `mcp.MCPDeprecationWarning`:
2799
+
2800
+
- Client: `mcp.client.sse.sse_client()`, and `SseServerParameters` for `ClientSessionGroup.connect_to_server()`.
2801
+
- Server: `MCPServer.sse_app()`, `MCPServer.run_sse_async()`, `mcp.run(transport="sse")`, and the lowlevel `mcp.server.sse.SseServerTransport`.
2802
+
2803
+
Streamable HTTP is not deprecated: `streamable_http_client()` / `Client(url)` on the client, `streamable_http_app()` / `mcp.run(transport="streamable-http")` on the server. Migrate when you can; a deployment that must keep answering unmigrated SSE clients can keep serving `sse_app()` alongside the Streamable HTTP app and filter the warning as [above](#roots-sampling-and-logging-methods-deprecated-sep-2577). Two adjacent housekeeping changes: `mcp run --transport` now advertises `stdio` and `streamable-http` only, and `python -m mcp.client <url>` connects with Streamable HTTP (it previously used SSE for any `http(s)` URL).
2804
+
2795
2805
## Notes for 2026-era connections
2796
2806
2797
2807
Everything below this heading describes behavior that only activates on connections
0 commit comments