From 1952bfd8943f74fdf705378c049e203023ffaf16 Mon Sep 17 00:00:00 2001 From: Bar Nuri Date: Tue, 22 Apr 2025 09:59:36 +0300 Subject: [PATCH 1/2] sse-pass-http-req --- src/mcp/server/fastmcp/server.py | 10 ++++++++++ src/mcp/server/lowlevel/server.py | 5 ++++- src/mcp/types.py | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/mcp/server/fastmcp/server.py b/src/mcp/server/fastmcp/server.py index f3bb2586..ff2d8a57 100644 --- a/src/mcp/server/fastmcp/server.py +++ b/src/mcp/server/fastmcp/server.py @@ -491,6 +491,7 @@ async def handle_sse(request: Request) -> None: streams[0], streams[1], self._mcp_server.create_initialization_options(), + extra_metadata={"http_request": request}, ) return Starlette( @@ -501,6 +502,15 @@ async def handle_sse(request: Request) -> None: ], ) + def get_http_request(self) -> Request | None: + ctx = self.get_context() + if (ctx.request_context and + ctx.request_context.meta and + hasattr(ctx.request_context.meta, "extra_metadata")): + req: Request = ctx.request_context.meta.extra_metadata.get("http_request") # type: ignore + return req + return None + async def list_prompts(self) -> list[MCPPrompt]: """List all available prompts.""" prompts = self._prompt_manager.list_prompts() diff --git a/src/mcp/server/lowlevel/server.py b/src/mcp/server/lowlevel/server.py index dbaff305..a0211c56 100644 --- a/src/mcp/server/lowlevel/server.py +++ b/src/mcp/server/lowlevel/server.py @@ -479,6 +479,7 @@ async def run( # but also make tracing exceptions much easier during testing and when using # in-process servers. raise_exceptions: bool = False, + extra_metadata: dict[str, Any] | None = None, ): async with AsyncExitStack() as stack: lifespan_context = await stack.enter_async_context(self.lifespan(self)) @@ -489,7 +490,9 @@ async def run( async with anyio.create_task_group() as tg: async for message in session.incoming_messages: logger.debug(f"Received message: {message}") - + if (hasattr(message, "request_meta") and + getattr(message, "request_meta")): + message.request_meta.extra_metadata = extra_metadata # type: ignore tg.start_soon( self._handle_message, message, diff --git a/src/mcp/types.py b/src/mcp/types.py index bd71d51f..67f8f74b 100644 --- a/src/mcp/types.py +++ b/src/mcp/types.py @@ -41,6 +41,7 @@ class RequestParams(BaseModel): class Meta(BaseModel): progressToken: ProgressToken | None = None + extra_metadata: dict[str, Any] | None = None """ If specified, the caller requests out-of-band progress notifications for this request (as represented by notifications/progress). The value of this From dcf398c1f18f02aa4fbb3665a8e72049f729fed3 Mon Sep 17 00:00:00 2001 From: Bar Nuri Date: Thu, 24 Apr 2025 15:01:50 +0300 Subject: [PATCH 2/2] Update server.py --- src/mcp/server/lowlevel/server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mcp/server/lowlevel/server.py b/src/mcp/server/lowlevel/server.py index a0211c56..868aeb06 100644 --- a/src/mcp/server/lowlevel/server.py +++ b/src/mcp/server/lowlevel/server.py @@ -492,6 +492,7 @@ async def run( logger.debug(f"Received message: {message}") if (hasattr(message, "request_meta") and getattr(message, "request_meta")): + message.request_meta = message.request_meta or types.RequestParams.Meta() # type: ignore message.request_meta.extra_metadata = extra_metadata # type: ignore tg.start_soon( self._handle_message,