Treat per-server initialization cancellation as a connection failure instead of aborting overall startup, and suppress cleanup-time exception groups from half-open MCP sessions.
call_tool() and read_resource() access self._sessions[server_name]
directly, which raises a raw KeyError if the MCP server failed to
connect, disconnected, or was cleared by close()/reconnect_all().
Replace bare dict access with .get() and raise a descriptive
McpServerNotConnectedError that includes the server's failure detail.
Also wrap session.call_tool()/read_resource() to catch transport-level
errors (broken pipe, closed connection) and surface them as the same
exception type.
McpToolAdapter and ReadMcpResourceTool now catch this error and return
ToolResult(is_error=True) so the model receives a clean error message
instead of crashing the turn.