Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions litellm/proxy/_experimental/mcp_server/mcp_server_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -892,6 +892,7 @@ async def build_mcp_server_from_table(
is_byok=bool(getattr(mcp_server, "is_byok", False)),
byok_description=getattr(mcp_server, "byok_description", None) or [],
byok_api_key_help_url=getattr(mcp_server, "byok_api_key_help_url", None),
source_url=getattr(mcp_server, "source_url", None),
# AWS SigV4 fields
aws_access_key_id=aws_creds.get("aws_access_key_id"),
aws_secret_access_key=aws_creds.get("aws_secret_access_key"),
Expand Down Expand Up @@ -3750,6 +3751,7 @@ def _build_mcp_server_table(self, server: MCPServer) -> LiteLLM_MCPServerTable:
is_byok=server.is_byok,
byok_description=server.byok_description,
byok_api_key_help_url=server.byok_api_key_help_url,
source_url=server.source_url,
instructions=server.instructions,
)

Expand Down
1 change: 1 addition & 0 deletions litellm/types/mcp_server/mcp_server_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class MCPServer(BaseModel):
is_byok: bool = False
byok_description: List[str] = []
byok_api_key_help_url: Optional[str] = None
source_url: Optional[str] = None
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
# OAuth2 flow type. Defaults to None (interactive / authorization_code).
Expand Down
3 changes: 3 additions & 0 deletions tests/mcp_tests/test_mcp_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -1505,6 +1505,7 @@ async def test_add_update_server_with_alias():
mock_mcp_server.created_at = None
mock_mcp_server.updated_at = None
mock_mcp_server.instructions = None
mock_mcp_server.source_url = None
mock_mcp_server.approval_status = "active"

# Add server to manager
Expand Down Expand Up @@ -1563,6 +1564,7 @@ async def test_add_update_server_without_alias():
mock_mcp_server.created_at = None
mock_mcp_server.updated_at = None
mock_mcp_server.instructions = None
mock_mcp_server.source_url = None
mock_mcp_server.approval_status = "active"

# Add server to manager
Expand Down Expand Up @@ -1622,6 +1624,7 @@ async def test_add_update_server_fallback_to_server_id():
mock_mcp_server.created_at = None
mock_mcp_server.updated_at = None
mock_mcp_server.instructions = None
mock_mcp_server.source_url = None
mock_mcp_server.approval_status = "active"
# Add server to manager
await test_manager.add_server(mock_mcp_server)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2888,6 +2888,31 @@ async def test_round_trip_timestamps_preserved(self):
assert rebuilt_table.created_at == created
assert rebuilt_table.updated_at == updated

@pytest.mark.asyncio
async def test_round_trip_source_url_preserved(self):
"""source_url survives the full round-trip: LiteLLM_MCPServerTable -> MCPServer -> LiteLLM_MCPServerTable.

Regression test: the list endpoint (GET /v1/mcp/server) builds its
response from the registry via this round-trip, so a dropped field
here surfaces as a null source_url in the list response even though
the value is stored in the DB.
"""
manager = MCPServerManager()

table_record = LiteLLM_MCPServerTable(
server_id="src-url-server",
server_name="src_url_server",
url="https://example.com/mcp",
transport=MCPTransport.http,
source_url="https://github.com/org/mcp-server",
)

mcp_server = await manager.build_mcp_server_from_table(table_record)
assert mcp_server.source_url == "https://github.com/org/mcp-server"

rebuilt_table = manager._build_mcp_server_table(mcp_server)
assert rebuilt_table.source_url == "https://github.com/org/mcp-server"


class TestInternalDelegatePkceWarningLog:
@pytest.mark.asyncio
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -857,6 +857,7 @@ async def test_build_mcp_server_from_table_with_sigv4_credentials(self):
table_record.byok_api_key_help_url = None
table_record.oauth2_flow = None
table_record.instructions = None
table_record.source_url = None

manager = MCPServerManager()

Expand Down Expand Up @@ -915,6 +916,7 @@ async def test_build_mcp_server_from_table_without_sigv4_credentials(self):
table_record.byok_api_key_help_url = None
table_record.oauth2_flow = None
table_record.instructions = None
table_record.source_url = None

manager = MCPServerManager()

Expand Down
Loading