diff --git a/src/agents/mcp/manager.py b/src/agents/mcp/manager.py index 94df096d04..733e744363 100644 --- a/src/agents/mcp/manager.py +++ b/src/agents/mcp/manager.py @@ -200,7 +200,7 @@ def __init__( suppress_cancelled_error: bool = True, connect_in_parallel: bool = False, ) -> None: - self._all_servers = list(servers) + self._all_servers = self._unique_servers(servers) self._active_servers = list(self._all_servers) self.connect_timeout_seconds = connect_timeout_seconds self.cleanup_timeout_seconds = cleanup_timeout_seconds diff --git a/tests/mcp/test_mcp_server_manager_cleanup_state.py b/tests/mcp/test_mcp_server_manager_cleanup_state.py index bf6c82ef65..f411f464d8 100644 --- a/tests/mcp/test_mcp_server_manager_cleanup_state.py +++ b/tests/mcp/test_mcp_server_manager_cleanup_state.py @@ -29,6 +29,22 @@ async def test_cleanup_all_removes_cleaned_servers_from_active_servers() -> None assert server.connect.await_count == 2 +@pytest.mark.asyncio +async def test_manager_owns_repeated_server_instance_once() -> None: + server = cast(MCPServer, Mock(spec=MCPServer)) + server.connect = AsyncMock() + server.cleanup = AsyncMock() + + manager = MCPServerManager([server, server]) + + assert manager.all_servers == [server] + assert await manager.connect_all() == [server] + await manager.cleanup_all() + + server.connect.assert_awaited_once() + server.cleanup.assert_awaited_once() + + @pytest.mark.asyncio async def test_cleanup_all_refreshes_active_servers_when_cancellation_propagates() -> None: server = cast(MCPServer, Mock(spec=MCPServer))