Skip to content

Subagent configuration

Canonical TOML is the recommended format for repository-owned agents because it is explicit, strict, and easy to review.

Minimal OpenAI agent

Create:

text
.agents/agents/reviewer.toml
toml
name = "reviewer"
description = "Reviews workspace code without modifying files"
instructions = "Review the requested code and report concrete correctness, security, and maintainability issues."

model_provider = "openai"
model = "YOUR_OPENAI_MODEL"

allow_tools = ["filesystem/*"]

[mcp_servers.filesystem]
type = "stdio"
command = "tuls"
args = ["filesystem", ".", "--allow", "filesystem.read"]

Before starting tuls agents, make sure the provider credential exists in its environment:

bash
export OPENAI_API_KEY='...'
tuls agents . --allow agents.run

Minimal Anthropic agent

toml
name = "reviewer-anthropic"
description = "Reviews workspace code using Anthropic"
instructions = "Review the requested code. Do not modify files."

model_provider = "anthropic"
model = "YOUR_ANTHROPIC_MODEL"

allow_tools = ["filesystem/*"]

[mcp_servers.filesystem]
type = "stdio"
command = "tuls"
args = ["filesystem", ".", "--allow", "filesystem.read"]

Credential:

bash
export ANTHROPIC_API_KEY='...'

Canonical agent fields

FieldRequiredDefaultDescription
nameYesStable local agent identifier, 1–64 chars
descriptionYesCatalog description shown to the parent model, at most 4 KiB
instructionsTOML: yesSystem/task instructions; Markdown uses body text
model_providerYesopenai, anthropic, openrouter, or custom
modelYesProvider model identifier
base_urlCustom: yesprovider defaultProvider API prefix/root; rejected for first-class providers
env_keyCustom: yesprovider defaultEnvironment variable holding the API credential; rejected for first-class providers
wire_apiCustom: yesprovider defaultresponses or anthropic-messages; rejected for first-class providers
temperatureNoprovider default0..=2 for Responses, 0..=1 for Anthropic Messages
reasoning_effortNoprovider defaultWire-specific reasoning effort
max_turnsNo32Provider/tool loop limit, 1..=128
allow_toolsNoemptyExplicit child MCP grants; empty means no child tools
deny_toolsNoemptyExplicit child MCP denials; deny wins
skillsNoemptySkills injected into the agent's system context
mcp_serversNoemptyNamed stdio or HTTP child MCP servers

Strict validation

Unknown canonical fields are rejected.

Reasoning effort

For wire_api = "responses":

text
none
minimal
low
medium
high
xhigh

For wire_api = "anthropic-messages":

text
low
medium
high
xhigh
max

Only set what the model supports

tuls validates the wire-level vocabulary, while the upstream provider remains the authority on model-specific support.

Related

MIT licensed · built for MCP 2026-07-28