From 0970ef4ae026c38cab6d010a990b6c38635b982a Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Mon, 30 Dec 2024 10:04:19 -0800 Subject: [PATCH] Fix SSE server bug with uncaught TypeError --- .../servers/simple-prompt/mcp_simple_prompt/server.py | 9 +++------ .../simple-resource/mcp_simple_resource/server.py | 9 +++------ examples/servers/simple-tool/mcp_simple_tool/server.py | 9 +++------ src/mcp/server/fastmcp/server.py | 9 +++------ src/mcp/server/sse.py | 2 +- 5 files changed, 13 insertions(+), 25 deletions(-) diff --git a/examples/servers/simple-prompt/mcp_simple_prompt/server.py b/examples/servers/simple-prompt/mcp_simple_prompt/server.py index 8427b12..351099f 100644 --- a/examples/servers/simple-prompt/mcp_simple_prompt/server.py +++ b/examples/servers/simple-prompt/mcp_simple_prompt/server.py @@ -90,9 +90,9 @@ def main(port: int, transport: str) -> int: if transport == "sse": from mcp.server.sse import SseServerTransport from starlette.applications import Starlette - from starlette.routing import Route + from starlette.routing import Route, Mount - sse = SseServerTransport("/messages") + sse = SseServerTransport("/messages/") async def handle_sse(request): async with sse.connect_sse( @@ -102,14 +102,11 @@ def main(port: int, transport: str) -> int: streams[0], streams[1], app.create_initialization_options() ) - async def handle_messages(request): - await sse.handle_post_message(request.scope, request.receive, request._send) - starlette_app = Starlette( debug=True, routes=[ Route("/sse", endpoint=handle_sse), - Route("/messages", endpoint=handle_messages, methods=["POST"]), + Mount("/messages/", app=sse.handle_post_message) ], ) diff --git a/examples/servers/simple-resource/mcp_simple_resource/server.py b/examples/servers/simple-resource/mcp_simple_resource/server.py index 9864fc5..51f2933 100644 --- a/examples/servers/simple-resource/mcp_simple_resource/server.py +++ b/examples/servers/simple-resource/mcp_simple_resource/server.py @@ -47,9 +47,9 @@ def main(port: int, transport: str) -> int: if transport == "sse": from mcp.server.sse import SseServerTransport from starlette.applications import Starlette - from starlette.routing import Route + from starlette.routing import Route, Mount - sse = SseServerTransport("/messages") + sse = SseServerTransport("/messages/") async def handle_sse(request): async with sse.connect_sse( @@ -59,14 +59,11 @@ def main(port: int, transport: str) -> int: streams[0], streams[1], app.create_initialization_options() ) - async def handle_messages(request): - await sse.handle_post_message(request.scope, request.receive, request._send) - starlette_app = Starlette( debug=True, routes=[ Route("/sse", endpoint=handle_sse), - Route("/messages", endpoint=handle_messages, methods=["POST"]), + Mount("/messages/", app=sse.handle_post_message), ], ) diff --git a/examples/servers/simple-tool/mcp_simple_tool/server.py b/examples/servers/simple-tool/mcp_simple_tool/server.py index 79b0b8b..039af9e 100644 --- a/examples/servers/simple-tool/mcp_simple_tool/server.py +++ b/examples/servers/simple-tool/mcp_simple_tool/server.py @@ -60,9 +60,9 @@ def main(port: int, transport: str) -> int: if transport == "sse": from mcp.server.sse import SseServerTransport from starlette.applications import Starlette - from starlette.routing import Route + from starlette.routing import Route, Mount - sse = SseServerTransport("/messages") + sse = SseServerTransport("/messages/") async def handle_sse(request): async with sse.connect_sse( @@ -72,14 +72,11 @@ def main(port: int, transport: str) -> int: streams[0], streams[1], app.create_initialization_options() ) - async def handle_messages(request): - await sse.handle_post_message(request.scope, request.receive, request._send) - starlette_app = Starlette( debug=True, routes=[ Route("/sse", endpoint=handle_sse), - Route("/messages", endpoint=handle_messages, methods=["POST"]), + Mount("/messages/", app=sse.handle_post_message), ], ) diff --git a/src/mcp/server/fastmcp/server.py b/src/mcp/server/fastmcp/server.py index f090928..5b65707 100644 --- a/src/mcp/server/fastmcp/server.py +++ b/src/mcp/server/fastmcp/server.py @@ -423,9 +423,9 @@ class FastMCP: async def run_sse_async(self) -> None: """Run the server using SSE transport.""" from starlette.applications import Starlette - from starlette.routing import Route + from starlette.routing import Route, Mount - sse = SseServerTransport("/messages") + sse = SseServerTransport("/messages/") async def handle_sse(request): async with sse.connect_sse( @@ -437,14 +437,11 @@ class FastMCP: self._mcp_server.create_initialization_options(), ) - async def handle_messages(request): - await sse.handle_post_message(request.scope, request.receive, request._send) - starlette_app = Starlette( debug=self.settings.debug, routes=[ Route("/sse", endpoint=handle_sse), - Route("/messages", endpoint=handle_messages, methods=["POST"]), + Mount("/messages/", app=sse.handle_post_message), ], ) diff --git a/src/mcp/server/sse.py b/src/mcp/server/sse.py index 3062b32..0f50023 100644 --- a/src/mcp/server/sse.py +++ b/src/mcp/server/sse.py @@ -11,7 +11,7 @@ Example usage: # Create Starlette routes for SSE and message handling routes = [ Route("/sse", endpoint=handle_sse), - Route("/messages", endpoint=handle_messages, methods=["POST"]) + Mount("/messages", endpoint=handle_messages, methods=["POST"]) ] # Define handler functions