MCP servers: plug in the outside world.
MCP (Model Context Protocol) is how external capabilities reach your agents — web research, SaaS integrations, retrieval systems, anything with an MCP server. It's also GoTo Agents' answer to "where's the big-corpus RAG?": attach one, don't hard-wire one.
Registering a server
Registrations are JSON, one file per server, keyed by the server's identity:
{
"firecrawl": {
"url": "https://mcp.firecrawl.dev/{FIRECRAWL_KEY}/sse",
"transport": "streamable_http"
}
}
Local stdio servers use command/args instead of
url; the transport is inferred where it can be. Standard
mcpServers-style JSON from other tools' documentation pastes in
and is normalized automatically.
Secrets stay out of config files
API keys never live in the registration. Placeholders —
{API_KEY}, ${VAR} — resolve at connect time
from the placeholder store, which keeps values encrypted at rest. Share a
workspace and the config travels; the secrets don't.
Scopes
Global servers are available to every workspace; workspace servers only inside their own walls. The usual scope chain applies, and workspace portability tracking flags any quiet dependency on a global server. Exposed tools surface to agents alongside built-in tools, gated by agent attachment like everything else.
Debugging
The MCP Debug page (Settings menu) shows each server's connection state and lets you test tool calls directly. Servers reconnect automatically on config changes, or manually from the workspace's MCP panel.
Beyond servers
A registration doesn't have to point at a live server at all — it can declare a capability surface whose calls route back to the caller, or a pure stub with no implementation. That's the novel half of the MCP story: Exposures & AIR.
Where it lives
core/mcp_manager.py— registration, normalization, scope resolution.core/mcp_client_manager.py— live connections and reconnection.core/mcp_tool_adapter.py— surfacing server tools to the runtime.core/placeholder_manager.py— placeholder and secret resolution.