Two ways to give agents capabilities
MCP servers
Remote servers you connect by URL. Tools are discovered automatically at startup. The server can be in any language.
Python tools
Local Python functions. You write the implementation; the engine binds them to agents that declare them.
MCP servers
Declare a server by URL. The engine connects and discovers its tools automatically at startup.MCP connections are created once at startup, not per request. If a server is unreachable, the engine logs a warning and continues — local tools still work.
Tool tags
If your MCP server groups tools into categories, you can limit which tools an agent sees:X-MCP-Tool-Tag header during tool discovery. The server filters — the engine binds only what comes back. The LLM never sees the tags.
Multiple tags are sent comma-joined: X-MCP-Tool-Tag: orders,returns
Custom transport — if your server expects a different header or a query param, tool_tag_transport supports two types:
MCP auth
To add auth headers to outgoing MCP requests, use abefore_mcp_request hook. The token never appears in the YAML or in prompts. See Runtime Hooks.
Python tools
Declare a tool with a description. That description is what the LLM uses to decide whether to call it.Implementing a tool
Rungenerate (see Quickstart) to create stubs. Then fill in the logic:
Resolvers vs. tools
Both are Python code. The difference is when they run and who calls them.
Use a resolver for context the prompt always needs: current date, user name, account info.
Use a tool for actions the user may or may not need: look up an order, create a return, send a message.