One unreachable MCP server aborts every turn, on both transports #115

Closed
opened 2026-08-11 23:04:15 +00:00 by coilyco-ops · 0 comments
Member

MCPProvider.Open returns an error on the first server that fails to connect or fails ListTools (internal/community/mcp.go:75-78 and 83-86 at 3812935). That error propagates out of Complete (internal/community/proxy.go:219-224), so the whole turn fails.

The roster is all-or-nothing. One flaky or restarting MCP server takes Echo down for every turn, Discord and POST /v1/turn alike, including turns that would never have called that server's tools.

Fix

Track availability per server rather than per roster:

  • A server that fails to connect or list contributes no tools, and the turn proceeds with whatever the rest published.
  • Record the outage in telemetry as a distinct exception with the server name as a bounded attribute, so a persistently down surface is visible rather than inferred from a drop in tool calls.
  • Tell the model which surface is unavailable this turn, so it says so instead of claiming it tried and got nothing.
  • Fail the turn only when the roster is non-empty and every server is unreachable, which is a real capability outage rather than a partial one.

Interaction

The tool-name collision check in the same loop (mcp.go:93-96) should stay a hard error. A collision is a definition mistake that degrading past would hide, unlike a transport failure that is expected to be transient.

This gets easier once connections are long-lived and supervised rather than opened per turn, but it does not depend on that work and is worth doing first because it is the availability bug.

`MCPProvider.Open` returns an error on the first server that fails to connect or fails `ListTools` (`internal/community/mcp.go:75-78` and `83-86` at `3812935`). That error propagates out of `Complete` (`internal/community/proxy.go:219-224`), so the whole turn fails. The roster is all-or-nothing. One flaky or restarting MCP server takes Echo down for **every** turn, Discord and `POST /v1/turn` alike, including turns that would never have called that server's tools. ## Fix Track availability per server rather than per roster: * A server that fails to connect or list contributes no tools, and the turn proceeds with whatever the rest published. * Record the outage in telemetry as a distinct exception with the server name as a bounded attribute, so a persistently down surface is visible rather than inferred from a drop in tool calls. * Tell the model which surface is unavailable this turn, so it says so instead of claiming it tried and got nothing. * Fail the turn only when the roster is non-empty and **every** server is unreachable, which is a real capability outage rather than a partial one. ## Interaction The tool-name collision check in the same loop (`mcp.go:93-96`) should stay a hard error. A collision is a definition mistake that degrading past would hide, unlike a transport failure that is expected to be transient. This gets easier once connections are long-lived and supervised rather than opened per turn, but it does not depend on that work and is worth doing first because it is the availability bug.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo#115
No description provided.