mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-18 04:41:56 +00:00
fix: stop retrying initial MCP auth failures
This commit is contained in:
parent
1dd33988e2
commit
1247ff2dca
2 changed files with 44 additions and 0 deletions
|
|
@ -1592,6 +1592,40 @@ class TestReconnection:
|
|||
|
||||
asyncio.run(_test())
|
||||
|
||||
def test_initial_oauth_failure_does_not_retry(self):
|
||||
"""Initial OAuth failures stop immediately to avoid repeated browser prompts."""
|
||||
from tools.mcp_tool import MCPServerTask
|
||||
|
||||
run_count = 0
|
||||
target_server = None
|
||||
oauth_error = RuntimeError("Token exchange failed (400): Unknown client_id")
|
||||
|
||||
original_run_stdio = MCPServerTask._run_stdio
|
||||
|
||||
async def patched_run_stdio(self_srv, config):
|
||||
nonlocal run_count, target_server
|
||||
run_count += 1
|
||||
if target_server is not self_srv:
|
||||
return await original_run_stdio(self_srv, config)
|
||||
raise oauth_error
|
||||
|
||||
async def _test():
|
||||
nonlocal target_server
|
||||
server = MCPServerTask("oauth_srv")
|
||||
target_server = server
|
||||
|
||||
with patch.object(MCPServerTask, "_run_stdio", patched_run_stdio), \
|
||||
patch("tools.mcp_tool._is_auth_error", return_value=True), \
|
||||
patch("asyncio.sleep", new_callable=AsyncMock) as mock_sleep:
|
||||
await server.run({"command": "test"})
|
||||
|
||||
assert run_count == 1
|
||||
assert server._error is oauth_error
|
||||
assert server._ready.is_set()
|
||||
assert mock_sleep.await_count == 0
|
||||
|
||||
asyncio.run(_test())
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Configurable timeouts
|
||||
|
|
|
|||
|
|
@ -1499,6 +1499,16 @@ class MCPServerTask:
|
|||
# should not permanently kill the server.
|
||||
# (Ported from Kilo Code's MCP resilience fix.)
|
||||
if not self._ready.is_set():
|
||||
if _is_auth_error(exc):
|
||||
logger.warning(
|
||||
"MCP server '%s' failed initial OAuth authentication, "
|
||||
"not retrying automatically: %s",
|
||||
self.name, exc,
|
||||
)
|
||||
self._error = exc
|
||||
self._ready.set()
|
||||
return
|
||||
|
||||
initial_retries += 1
|
||||
if initial_retries > _MAX_INITIAL_CONNECT_RETRIES:
|
||||
logger.warning(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue