config.toml in the working directory; override it with the CONFIG_PATH environment variable.
Environment Variable Interpolation
Any string value in the config can reference an environment variable using{{ env.VAR_NAME }}. An optional | default: 'value' fallback prevents a hard error when the variable is unset.
Root-Level Fields
[agent]
Defines the agent identity, system prompt, and behavioral settings.
Multiple Agents
CONFIG_PATH can point to a single TOML file or a directory of .toml files. When pointed at a directory, AURA loads every .toml file and serves each as a selectable agent:
alias (if set) or name. Clients discover available agents via GET /v1/models and select one by passing its identifier as the model field in chat completion requests — the same field tools like LibreChat, OpenWebUI, and CLI clients use to present a model picker.
Agent selection follows this order:
- If only one config is loaded, it is always used (the
modelfield is ignored). - Otherwise,
modelis matched first, thenDEFAULT_AGENTifmodelis absent. - Returns a 400 error if multiple configs are loaded and neither
modelnorDEFAULT_AGENTis supplied at all. - Returns a 404 error if a
modelorDEFAULT_AGENTvalue is supplied but matches no loaded config.
name and neither has an alias, loading fails with a validation error.
Hidden agents are excluded from GET /v1/models and the CLI’s /model list but remain fully accessible when a caller targets them by exact name or alias. Set hidden = true to hide agents that are in development, restricted to known callers, or should not appear in model pickers (LibreChat, OpenWebUI, etc.):
[agent.llm]
Configures the LLM provider. The provider field is a discriminant that selects the variant and its required fields.
Common Fields
These fields are available on all providers except where noted.provider = "openai"
provider = "anthropic"
provider = "bedrock"
Uses AWS credentials from the environment (AWS profile, IAM role, or environment variables). No API key field.
provider = "gemini"
provider = "ollama"
No API key required. Defaults to http://localhost:11434.
provider = "openrouter"
Access 300+ models through a single API key. Uses OpenRouter’s reasoning wire format (reasoning + reasoning_details). For other OpenAI-compatible APIs (Fireworks, Together), use provider = "openai" with base_url instead.
[mcp]
Configures Model Context Protocol (MCP) tool servers.
[mcp.servers.<name>]
Each server is a named entry under [mcp.servers]. The transport field selects the connection type.
Tool names are not namespaced by server. If two servers register a tool with the same name, registration overwrites the earlier entry — since registration order is not the same as config declaration order, which tool ends up callable is effectively arbitrary, not deterministically “first” or “last” in TOML order (#186).
transport = "http_streamable" (recommended)
Connects to an MCP server over HTTP using the current MCP streamable transport (post-2025-11-05).
transport = "sse"
Connects using the legacy SSE-based MCP protocol. Supports the same headers, headers_from_request, and scratchpad options as http_streamable.
transport = "stdio"
Spawns a local child process. Each agent request creates its own process instance.
cmd is a list where cmd[0] is the executable and cmd[1..] are fixed arguments that are part of the command (e.g. a script path). args are additional arguments appended after.
Static Headers
Add static headers to every request to an HTTP or SSE server:Header Forwarding (headers_from_request)
Forward headers from the incoming API request to the MCP server. The table maps outgoing header name → incoming request header name. Useful for per-user auth delegation.
headers_from_request is set, the forwarded header takes precedence over any matching static header from headers.
Per-Tool Scratchpad Thresholds
Override when a tool’s output gets intercepted by the scratchpad system. Keys are glob patterns matched against tool names; the most specific (longest) pattern wins.[agent.scratchpad]
Controls context window management. When enabled, large MCP tool outputs are saved to disk and replaced with a file pointer. The agent then uses eight exploration tools (head, slice, grep, schema, item_schema, get_in, iterate_over, read) to selectively read the data it needs. See Scratchpad for the full feature guide.
Requires memory_dir to be set at the root level and context_window to be set on [agent.llm]. Orchestration also accepts the legacy [orchestration.artifacts].memory_dir as a fallback when the top-level field is absent.
[agent.skills]
Points the agent at directories of on-demand skills. Skills follow the Agent Skills specification: each skill is a subdirectory containing a SKILL.md file with YAML frontmatter (name, description). The name must match the directory name and consist of lowercase alphanumerics and hyphens only (1–64 characters, no leading/trailing/consecutive hyphens). See Skills for the full feature guide.
load_skill tool is exposed to the agent that loads and executes skills on demand, along with a read_skill_file tool for fetching individual resource files from a skill’s directory.
[[vector_stores]]
Configures RAG (Retrieval-Augmented Generation) stores. Each entry creates a vector_search_<name> tool the agent can call. Multiple stores create multiple search tools.
type = "qdrant"
type = "in_memory"
type = "bedrock_kb"
Managed RAG — no embedding model needed. Uses AWS credentials.
Embedding Models
Used byin_memory and qdrant types.
[tools]
Enables built-in server-side tools.
[hitl]
Human-in-the-loop (HITL) approval gates let an agent ask for permission before running selected MCP tools. [hitl] is the enable bit — there is no separate enabled field; presence of the table turns it on, and route is required when it’s present. See HITL for the full route contracts, SSE lifecycle events, and current scope (single-agent vs. orchestration worker gating).
[hitl.route]
Tagged by mode: "conversational" or "webhook".
Session Store (Durable and Multi-Pod Deployments)
Unlike every other section on this page, the session store is not configured in TOML — it’s deployment infrastructure (one instance per server, not per-agent), so it’s configured only via environment variables. By default, cross-request session state (A2A tasks, parked HITL approvals) lives in process memory — correct for a single pod, the CLI, and local dev. Behind a load balancer with multiple replicas, configure a shared Redis/Valkey backend and every cross-request flow works no matter which pod serves each request: A2Amessage:send → poll → list → history-by-context, A2A subscribe/cancel against a task executing on another pod, and conversational HITL approvals resolved by a POST /v1/approvals/{id} that lands away from the pod that parked them.
/health reports the backend and its ping latency.
The Redis backend requires building with the session-store-redis cargo feature (cargo build --release --features aura-web-server/session-store-redis). The in-memory backend is always available. See the session storage design doc for the design and Helm packaging roadmap.
[orchestration]
Enables multi-agent orchestration mode. A coordinator agent decomposes user queries into tasks and delegates them to specialized worker agents for parallel execution.
The coordinator’s system prompt comes from [agent].system_prompt. Workers are defined in [orchestration.worker.<name>] sections.
Execution loop:
Plan: coordinator decomposes the request into a task DAG.Execute: dependency-ready tasks run in parallel waves on worker agents.Continue: coordinator consolidates worker outputs and routes to a final response, replan, or clarification.
[orchestration.timeouts]
[orchestration.artifacts]
Controls persistence and artifact promotion.
[orchestration.worker.<name>]
Defines a specialized worker. Worker names must be unique case-insensitively (to avoid filesystem collisions) and non-empty.
Per-Worker LLM Override
Workers inherit[agent.llm] by default. Provide [orchestration.worker.<name>.llm] to use a different model for a specific worker (e.g. a cheaper model for simple tasks).
Per-Worker Scratchpad Override
Per-Worker Skills Override
None (field absent) inherits [agent.skills]. An explicit empty list disables skills. A non-empty list replaces the agent’s skills entirely (no merging).

