From 08421862024e7f2bcfb489aa1a4b7ba8df51bae4 Mon Sep 17 00:00:00 2001 From: shivam Date: Thu, 12 Mar 2026 16:59:32 -0700 Subject: [PATCH] fix(mcp): preserve www-authenticate header on HTTPException, filter # from server name - Forward e.headers to JSONResponse in HTTPException handlers (handle_streamable_http_mcp, handle_sse_mcp) so OAuth2 www-authenticate header is preserved per RFC 9728 - Filter fragment identifier (#) from path segment when extracting server name to avoid misleading 404 Made-with: Cursor --- litellm/proxy/_experimental/mcp_server/server.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/litellm/proxy/_experimental/mcp_server/server.py b/litellm/proxy/_experimental/mcp_server/server.py index 92bbc54057a..01e31f7250d 100644 --- a/litellm/proxy/_experimental/mcp_server/server.py +++ b/litellm/proxy/_experimental/mcp_server/server.py @@ -2240,7 +2240,7 @@ if MCP_AVAILABLE: # Child app receives path like /undefined when mounted at /mcp # Extract first path segment as server name segments = path.strip("/").split("/") - if segments and segments[0] and "?" not in segments[0]: + if segments and segments[0] and "?" not in segments[0] and "#" not in segments[0]: mcp_servers_from_path = [segments[0]] return mcp_servers_from_path @@ -2464,9 +2464,11 @@ if MCP_AVAILABLE: content = {"error": detail} else: content = {"error": {"message": str(detail)}} + headers = dict(e.headers) if e.headers else {} error_response = JSONResponse( status_code=e.status_code, content=content, + headers=headers, ) await error_response(scope, receive, send) except Exception: @@ -2554,9 +2556,11 @@ if MCP_AVAILABLE: content = {"error": detail} else: content = {"error": {"message": str(detail)}} + headers = dict(e.headers) if e.headers else {} error_response = JSONResponse( status_code=e.status_code, content=content, + headers=headers, ) await error_response(scope, receive, send) except Exception: