Conversation
MCP-004 covers the Python side; the TypeScript half was missing even though the pack ships TS rules (MCP-011, MCP-013). OpenAI (OAI-016, OAI-024) and the Vercel AI SDK (VAI-011) already use has_http_call_without_timeout for exactly this. The stall crosses the server's trust boundary rather than staying local: the connecting client waits on a JSON-RPC response that never arrives, and MCP gives it no way to cancel an in-flight tool call, so it is left to its own timeout, an abandoned request, or a hung session, with nothing in the response saying why. On a stdio server a handler parked on a dead socket is holding the single process that serves the connection.
|
Thanks @bradAGI. MCP-024 is clean against the schema: every required field is present, Severity The fixture mirror in trustabl/agent-reliability-analyzer#159 is byte identical to this block, so the two need to land together. The one piece still outstanding is a rationale doc in |
MCP-004 covers the Python side of network timeouts; the TypeScript half was missing, even though the pack ships TS rules (MCP-011, MCP-013). OpenAI (OAI-016, OAI-024) and the Vercel AI SDK (VAI-011) already use
has_http_call_without_timeoutfor exactly this.What makes the MCP case its own is that the stall crosses the server's trust boundary rather than staying local. The connecting client is waiting on a JSON-RPC response that never arrives — and MCP gives it no way to cancel an in-flight tool call, so it's left to its own timeout, an abandoned request, or a hung session, with nothing in the response saying why. The server author never sees the symptom; the client's users do.
On a stdio server it's worse than one slow tool: a single process serves the connection, so a handler parked on a dead socket is holding it.
Compounds with MCP-013 the same way VAI-011 compounds with VAI-003 — a handler that fetches a caller-controlled URL and can't time out can be steered at an internal host that never answers.
Verification — engine built at
main:Fire (bare
await fetch(...)in aserver.tool(...)handler):MCP-013, MCP-024Silent (
signal: AbortSignal.timeout(15_000)):MCP-013(MCP-013 is the pre-existing SSRF rule firing on the fixture's template-string URL — also the compounding case the explanation describes.)
No new predicates, so no
schema_versionbump.