diff --git a/src/mcp/client/sse.py b/src/mcp/client/sse.py index 7b66b5c1b..1d770e110 100644 --- a/src/mcp/client/sse.py +++ b/src/mcp/client/sse.py @@ -1,4 +1,5 @@ import logging +import warnings from collections.abc import Callable from contextlib import asynccontextmanager from typing import Any @@ -37,7 +38,11 @@ async def sse_client( auth: httpx.Auth | None = None, on_session_created: Callable[[str], None] | None = None, ): - """Client transport for SSE. + """Client transport for SSE (Deprecated). + + .. deprecated:: + The HTTP+SSE transport is deprecated. Use `streamable_http_client` with + `StreamableHTTPTransport` instead for connecting to MCP servers. `sse_read_timeout` determines how long (in seconds) the client will wait for a new event before disconnecting. All other HTTP operations are controlled by `timeout`. @@ -154,4 +159,10 @@ async def post_writer(endpoint_url: str): tg.start_soon(post_writer, endpoint_url) yield read_stream, write_stream - tg.cancel_scope.cancel() + tg.cancel_scope.cancel() + + warnings.warn( + "sse_client is deprecated. Use streamable_http_client with StreamableHTTPTransport instead.", + DeprecationWarning, + stacklevel=2, + ) diff --git a/src/mcp/server/mcpserver/server.py b/src/mcp/server/mcpserver/server.py index 2a7a58117..654672b8d 100644 --- a/src/mcp/server/mcpserver/server.py +++ b/src/mcp/server/mcpserver/server.py @@ -854,7 +854,19 @@ async def run_sse_async( # pragma: no cover message_path: str = "/messages/", transport_security: TransportSecuritySettings | None = None, ) -> None: - """Run the server using SSE transport.""" + """Run the server using SSE transport (Deprecated). + + .. deprecated:: + The HTTP+SSE transport is deprecated. Use `run_streamable_http_async` instead. + """ + import warnings + + warnings.warn( + "run_sse_async is deprecated. Use run_streamable_http_async instead.", + DeprecationWarning, + stacklevel=2, + ) + import uvicorn starlette_app = self.sse_app( @@ -915,7 +927,18 @@ def sse_app( transport_security: TransportSecuritySettings | None = None, host: str = "127.0.0.1", ) -> Starlette: - """Return an instance of the SSE server app.""" + """Return an instance of the SSE server app (Deprecated). + + .. deprecated:: + The HTTP+SSE transport is deprecated. Use `streamable_http_app` instead. + """ + import warnings + + warnings.warn( + "sse_app is deprecated. Use streamable_http_app instead.", + DeprecationWarning, + stacklevel=2, + ) # Auto-enable DNS rebinding protection for localhost (IPv4 and IPv6) if transport_security is None and host in ("127.0.0.1", "localhost", "::1"): transport_security = TransportSecuritySettings( diff --git a/src/mcp/server/sse.py b/src/mcp/server/sse.py index 9dcee67f7..18e1cde81 100644 --- a/src/mcp/server/sse.py +++ b/src/mcp/server/sse.py @@ -1,4 +1,7 @@ -"""SSE Server Transport Module +"""SSE Server Transport Module (Deprecated) + +.. deprecated:: + The HTTP+SSE transport is deprecated. Use `StreamableHTTPTransport` instead. This module implements a Server-Sent Events (SSE) transport layer for MCP servers. @@ -37,6 +40,7 @@ async def handle_sse(request): """ import logging +import warnings from contextlib import asynccontextmanager from typing import Any from urllib.parse import quote @@ -61,7 +65,13 @@ async def handle_sse(request): class SseServerTransport: - """SSE server transport for MCP. This class provides two ASGI applications, + """SSE server transport for MCP (Deprecated). + + .. deprecated:: + The HTTP+SSE transport is deprecated. Use `StreamableHTTPTransport` instead + for new MCP server implementations. + + This class provides two ASGI applications, suitable for use with a framework like Starlette and a server like Hypercorn: 1. connect_sse() is an ASGI application which receives incoming GET requests, @@ -79,6 +89,9 @@ def __init__(self, endpoint: str, security_settings: TransportSecuritySettings | """Creates a new SSE server transport, which will direct the client to POST messages to the relative path given. + .. deprecated:: + The HTTP+SSE transport is deprecated. Use `StreamableHTTPTransport` instead. + Args: endpoint: A relative path where messages should be posted (e.g., "/messages/"). @@ -99,6 +112,12 @@ def __init__(self, endpoint: str, security_settings: TransportSecuritySettings | super().__init__() + warnings.warn( + "SseServerTransport is deprecated. Use StreamableHTTPTransport instead.", + DeprecationWarning, + stacklevel=2, + ) + # Validate that endpoint is a relative path and not a full URL if "://" in endpoint or endpoint.startswith("//") or "?" in endpoint or "#" in endpoint: raise ValueError(