Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.agno.com/llms.txt

Use this file to discover all available pages before exploring further.

Anything with an MCP server plugs into Scout: Linear, GitHub, Notion, Postgres, Stripe, internal tools. Each server becomes one MCPContextProvider, exposes a query_mcp_<slug> tool on Scout, and runs behind a dedicated sub-agent so tool-name collisions across servers stay isolated. The full reference, including transport details and the Node-in-Docker gotcha, lives in the Scout repo: MCP_CONNECT.md.

Wire up a server

Add an MCPContextProvider entry to _create_mcp_providers() in scout/contexts.py. Secrets come from the process env via getenv(...).
MCPContextProvider(
    server_name="linear",
    transport="stdio",
    command="npx",
    args=["-y", "@linear/mcp"],
    env={"LINEAR_API_KEY": getenv("LINEAR_API_KEY", "")},
    model=default_model(),
)
Add the secret to .env, restart Scout, and the new tool shows up:
curl -sS http://localhost:8000/contexts | jq '.[] | select(.id | startswith("mcp_"))'
# { "id": "mcp_linear", "name": "linear", "ok": true, "detail": "mcp: linear (12 tools)" }

Constructor parameters

ParameterRequired forDescription
server_nameallDerives id=mcp_<server_name> and tool name query_mcp_<server_name>.
transportallOne of "stdio", "sse", "streamable-http".
commandstdioExecutable on PATH (npx, uvx, python, …).
argsstdio (optional)CLI args as list[str].
envstdio (optional)Env vars passed to the child process.
urlsse, streamable-httpServer URL.
headerssse, streamable-http (optional)HTTP headers.
timeout_secondsoptionalBounds initial connect and each MCP read. Default 30.
modeoptionalContextMode.default (sub-agent wrap) or ContextMode.tools (flatten onto Scout).

When to pick mode=tools vs mode=default

ModeWhat happensRight when
defaultScout → sub-agent → MCP. Two extra LLM hops, full namespace isolation.The server has many tools, cryptic names, or names that collide with another MCP server (e.g. search, create_issue).
toolsServer’s tools surface directly on Scout. No extra hops.The server has few, distinctively-named tools (e.g. get_current_time). Scout can route without help.
asetup() connects on startup regardless of mode. That’s required for tools mode to discover the server’s functions, and it keeps the MCP SDK’s anyio cancel scope on the same task that aclose() will exit on.

Node-based servers in Docker

command must be on PATH inside Scout’s runtime. The ship image bundles Python (uv, uvx, python), so Python MCP servers like uvx --from mcp-server-time mcp-server-time work out of the box. Node-based servers (npx @something/mcp) need Node installed in your deploy image. Add RUN apt-get install -y nodejs npm to the Dockerfile before shipping.

Build your own provider

If your source isn’t covered by an MCP server, write a ContextProvider directly. Four methods: status, astatus, query, aquery. Override aupdate if the source supports writes. The agno.context.web.provider module is a complete reference implementation.

Troubleshooting

SymptomLikely cause
/contexts/mcp_<slug>/status returns ok=falseServer unreachable, or initialize() errored. For stdio: check command is on PATH inside the container. For HTTP: curl the URL to confirm it’s live and your headers auth.
Tool calls fail but status is OKThe server declared a tool it doesn’t actually implement. Check MCPContextProvider logs.
Tool list looks staleCached at connect time. Restart Scout to re-discover.
For more, see MCP_CONNECT.md.

Next

Deploy Scout to Railway →