From 4dc2b7be0f1d4cbbbb7a723e182d7292d5d9c02c Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 17 Jul 2026 01:46:59 -0700 Subject: [PATCH] fix(mcp): preserve concurrent OAuth manager refresh --- hermes_cli/web_server.py | 1 - tests/tools/test_mcp_oauth_manager.py | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index e2dce9451df9..8dee6cce9ec4 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -11425,7 +11425,6 @@ def _run_dashboard_mcp_oauth(flow, cfg: dict) -> None: reconnect_mcp_server(flow.server_name) except Exception: - manager.evict(flow.server_name, hermes_home=flow.hermes_home) storage.restore(backup, only_if_absent=True) manager.restore_entry( flow.server_name, diff --git a/tests/tools/test_mcp_oauth_manager.py b/tests/tools/test_mcp_oauth_manager.py index 3c47239f6f2d..cfefbadeb214 100644 --- a/tests/tools/test_mcp_oauth_manager.py +++ b/tests/tools/test_mcp_oauth_manager.py @@ -88,6 +88,22 @@ def test_manager_can_restore_removed_entry_after_failed_reauth(tmp_path, monkeyp assert manager.get_or_build_provider("shared", "https://mcp.example", {}) is provider + +def test_manager_restore_entry_preserves_newer_concurrent_entry(tmp_path, monkeypatch): + from tools.mcp_oauth_manager import MCPOAuthManager + + monkeypatch.setenv("HERMES_HOME", str(tmp_path)) + _set_interactive_stdin(monkeypatch) + manager = MCPOAuthManager() + old_provider = manager.get_or_build_provider("shared", "https://old.example", {}) + old_entry = manager.remove("shared") + new_provider = manager.get_or_build_provider("shared", "https://new.example", {}) + + manager.restore_entry("shared", old_entry) + + assert manager.get_or_build_provider("shared", "https://new.example", {}) is new_provider + assert new_provider is not old_provider + pytest.importorskip( "mcp.client.auth.oauth2", reason="MCP SDK 1.26.0+ required for OAuth support",