fix: patch support for custom headers + auth in MCP connects (was getting a weird silent error)

Co-authored-by: jnjpng <jin@letta.com>
Co-authored-by: Jin Peng <jinjpeng@Jins-MacBook-Pro.local>
This commit is contained in:
Charles Packer
2025-08-21 13:42:19 -07:00
committed by GitHub
parent be3e562087
commit 86f7e2036d
2 changed files with 32 additions and 8 deletions

View File

@@ -148,9 +148,21 @@ class SSEServerConfig(BaseServerConfig):
custom_headers: Optional[dict[str, str]] = Field(None, description="Custom HTTP headers to include with SSE requests")
def resolve_token(self) -> Optional[str]:
if self.auth_token and self.auth_token.startswith(f"{MCP_AUTH_TOKEN_BEARER_PREFIX} "):
return self.auth_token[len(f"{MCP_AUTH_TOKEN_BEARER_PREFIX} ") :]
return self.auth_token
"""
Extract token for storage if auth_header/auth_token are provided
and not already in custom_headers.
Returns:
The resolved token (without Bearer prefix) if it should be stored separately, None otherwise
"""
if self.auth_token and self.auth_header:
# Check if custom_headers already has the auth header
if not self.custom_headers or self.auth_header not in self.custom_headers:
# Strip Bearer prefix if present
if self.auth_token.startswith(f"{MCP_AUTH_TOKEN_BEARER_PREFIX} "):
return self.auth_token[len(f"{MCP_AUTH_TOKEN_BEARER_PREFIX} ") :]
return self.auth_token
return None
def resolve_environment_variables(self, environment_variables: Optional[Dict[str, str]] = None) -> None:
if self.auth_token and super().is_templated_tool_variable(self.auth_token):
@@ -217,9 +229,21 @@ class StreamableHTTPServerConfig(BaseServerConfig):
custom_headers: Optional[dict[str, str]] = Field(None, description="Custom HTTP headers to include with streamable HTTP requests")
def resolve_token(self) -> Optional[str]:
if self.auth_token and self.auth_token.startswith(f"{MCP_AUTH_TOKEN_BEARER_PREFIX} "):
return self.auth_token[len(f"{MCP_AUTH_TOKEN_BEARER_PREFIX} ") :]
return self.auth_token
"""
Extract token for storage if auth_header/auth_token are provided
and not already in custom_headers.
Returns:
The resolved token (without Bearer prefix) if it should be stored separately, None otherwise
"""
if self.auth_token and self.auth_header:
# Check if custom_headers already has the auth header
if not self.custom_headers or self.auth_header not in self.custom_headers:
# Strip Bearer prefix if present
if self.auth_token.startswith(f"{MCP_AUTH_TOKEN_BEARER_PREFIX} "):
return self.auth_token[len(f"{MCP_AUTH_TOKEN_BEARER_PREFIX} ") :]
return self.auth_token
return None
def resolve_environment_variables(self, environment_variables: Optional[Dict[str, str]] = None) -> None:
if self.auth_token and super().is_templated_tool_variable(self.auth_token):

View File

@@ -547,7 +547,7 @@ async def add_mcp_server_to_config(
server_name=request.server_name,
server_type=request.type,
server_url=request.server_url,
token=request.resolve_token() if not request.custom_headers else None,
token=request.resolve_token(),
custom_headers=request.custom_headers,
)
elif isinstance(request, StreamableHTTPServerConfig):
@@ -555,7 +555,7 @@ async def add_mcp_server_to_config(
server_name=request.server_name,
server_type=request.type,
server_url=request.server_url,
token=request.resolve_token() if not request.custom_headers else None,
token=request.resolve_token(),
custom_headers=request.custom_headers,
)