Skip to main content
This page will cover connecting external MCP servers. Server definitions are a workspace resource, so they live once in the shared mcp.servers catalog of a layer-root settings.yaml (~/.ziro/settings.yaml or <project>/.ziro/settings.yaml), merged across layers with tokens interpolated. An agent’s own mcp section (was mcp_servers.yaml) is a selector over that catalog: enable / deny globs over catalog ids, plus an optional inline servers map for private servers. No enable means the agent connects nothing. Loaded servers register their tools under the server name as a namespace and enter the same progressive discovery surface as native tools, so the model finds them with search_tools and activates them with load_tools. A server that fails to connect is non-fatal: the rest of the session continues.
It will cover the four transports (stdio, sse, streamable_http, and websocket), OAuth acquisition and refresh including the device-code flow used when running headless, and the live MCP manager that holds one persistent session per server so repeat tool calls reuse an open connection instead of reconnecting. Finally it will cover the control panel: Ctrl+O or /mcp in the TUI opens a table of servers with state, transport, auth, and tool count, mapping connect, disconnect, and reconnect to the manager, with a tool peek and an OAuth prompt modal. In the REPL, /mcp [server] prints the same information as a table.
This page is in progress. Until it lands, the shipped mcp.servers catalog and the per-agent mcp selectors are the best worked examples. Legacy split mcp_servers.yaml files still resolve at each layer as an alternative to the mcp section. An untrusted project’s catalog is ignored wholesale.
See Tools for how MCP tools join the deferred discovery tier, Plugins for MCP servers surfaced by an installed plugin, and Configuration for how the mcp section resolves.