fix(mcp): resolve case-variant scoped connects with the same alias-first priority as the exact name

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
yucheng 2026-09-30 10:18:19 +00:00
parent bc07570af8
commit 674356d3d8
2 changed files with 15 additions and 3 deletions

View file

@ -7200,9 +7200,19 @@ class MCPServerManager:
return None
def get_mcp_server_answering_to(self, name: str, client_ip: str | None = None) -> MCPServer | None:
"""The server a scoped ``/mcp/{name}`` connect resolves to: the alias-first exact lookup, then
the router's case-insensitive prefix match."""
return self.get_mcp_server_by_name(name, client_ip=client_ip) or next(
"""The server a scoped ``/mcp/{name}`` connect resolves to: alias, then server_name, then name, each
case-insensitive so ``/mcp/GH`` and ``/mcp/gh`` agree, then the router's prefix match."""
requested: Final = name.lower()
servers: Final = tuple(self.get_registry().values())
identifiers: Final[tuple[Callable[[MCPServer], str | None], ...]] = (
lambda server: server.alias,
lambda server: server.server_name,
lambda server: server.name,
)
for identifier in identifiers:
if (found := next((s for s in servers if (identifier(s) or "").lower() == requested), None)) is not None:
return found if self._is_server_accessible_from_ip(found, client_ip) else None
return next(
(
server
for server in self.get_filtered_registry(client_ip).values()

View file

@ -6225,6 +6225,8 @@ class TestMCPServerManager:
)
assert manager.get_mcp_server_answering_to("gh") is gh_public
assert manager.get_mcp_server_answering_to("GH") is gh_public
assert manager.get_mcp_server_answering_to("Gh_Public") is gh_public
assert manager.get_mcp_server_answering_to("gh-public-id") is gh_public
assert manager.get_mcp_server_answering_to("GH_PUBLIC") is gh_public
assert manager.get_mcp_server_answering_to("gh-id") is gh