5619595abc
Add tools() and onToolsChanged() to the MCPClient.Connection abstraction: list is capability-gated, paginated with cursor-dedup, and tolerates unresolvable outputSchemas via a per-page fallback. Tool listing is folded into connect so a listing failure marks the server failed rather than leaving it connected with a silently empty list. Cache MCP.Tool values per server, refresh on tools/list_changed notifications, and publish McpEvent.ToolsChanged. MCP.tools() aggregates the cached tools across all connected servers.