{"repo":"NousResearch/hermes-agent","public_id":"13383","display_label":"MCP session expiry and auto-reconnect handling","summary":"Multiple bug reports and fixes addressing MCP transport sessions that expire or terminate without automatic reconnection, particularly in gateway contexts. Work covers retry logic, circuit breaker behavior, and related OAuth session reconnect improvements.","subsystem":null,"counts":{"members":6,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":2,"merged_prs":1,"attempt_prs":3},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":19380},"resolution":{"state":"partially_resolved","by":"pr-19380"},"freshness":{"state":"verified","last_verified_at":"2026-05-03T22:23:34+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.29066666666666663},"fix_edges":[{"issue_number":18790,"pr_number":19380,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":13383,"title":"[Bug]: MCP server session expires during long-running gateway — no auto-reconnect","url":null,"state":"closed"},{"kind":"issue","number":18790,"title":"[Bug]: ERROR tools.mcp_tool: MCP tool playwright/browser_run_code call failed: Session terminated - From Gateway sessions","url":null,"state":"closed"},{"kind":"pr","number":13402,"title":"fix(mcp): auto-reconnect on expired session during tool call","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"e87a2100f","number":0},{"kind":"pr","value":"#13406","number":13406},{"kind":"pr","value":"#13383","number":13383},{"kind":"pr","value":"#13383","number":13383}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":13406,"title":"fix(mcp): auto-reconnect + retry once when the transport session expires (#13383)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#13383","number":13383}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":19232,"title":"fix(mcp): reconnect on terminated sessions","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#19380","number":19380}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":19380,"title":"fix(mcp): reconnect on terminated sessions","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["tests/tools/test_mcp_tool_session_expired.py","tools/mcp_tool.py"],"fix_hunks":[{"file":"tests/tools/test_mcp_tool_session_expired.py","hunks":["@@ -46,6 +46,13 @@ def test_is_session_expired_detects_session_not_found():\n     assert _is_session_expired_error(RuntimeError(\"Unknown session: abc123\")) is True\n \n \n+def test_is_session_expired_detects_session_terminated():\n+    \"\"\"Remote Playwright MCP reports transport loss as ``Session terminated``.\"\"\"\n+    from tools.mcp_tool import _is_session_expired_error\n+\n+    assert _is_session_expired_error(RuntimeError(\"Session terminated\")) is True\n+\n+\n def test_is_session_expired_is_case_insensitive():\n     \"\"\"Match uses lower-cased comparison so servers that emit the\n     message in different cases (SDK formatter quirks) still trigger.\"\"\""]},{"file":"tools/mcp_tool.py","hunks":["@@ -1667,6 +1667,7 @@ async def _recover():\n     \"session expired\",\n     \"session not found\",\n     \"unknown session\",\n+    \"session terminated\",\n )\n \n \n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}