Skip to main content
Each agent in a multi-agent setup can override the global sandbox and tool policy. This page covers per-agent configuration, precedence rules, and examples.

Sandboxing

Backends and modes — full sandbox reference.

Sandbox vs tool policy vs elevated

Debug “why is this blocked?”

Elevated mode

Elevated exec for trusted senders.
Auth is scoped by agent: each agent has its own agentDir auth store in ~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite. Never reuse agentDir across agents. Agents can read through to the default/main agent’s auth profiles when they do not have a local profile, but OAuth refresh tokens are not cloned into secondary agent stores. If you copy credentials manually, copy only portable static api_key or token profiles.

Configuration examples

Result:
  • main agent: runs on host, full tool access.
  • family agent: runs in Docker (one container per agent), only read and current-conversation message sends.
Result:
  • default agents get coding tools.
  • support agent is messaging-only (+ Slack tool).

Configuration precedence

When both global (agents.defaults.*) and agent-specific (agents.list[].*) configs exist:

Sandbox config

Agent-specific settings override global:
agents.list[].sandbox.{docker,browser,prune}.* overrides agents.defaults.sandbox.{docker,browser,prune}.* for that agent (ignored when sandbox scope resolves to "shared").

Tool restrictions

The filtering order is:
1

Tool profile

tools.profile or agents.list[].tools.profile.
2

Provider tool profile

tools.byProvider[provider].profile or agents.list[].tools.byProvider[provider].profile.
3

Global tool policy

tools.allow / tools.deny.
4

Provider tool policy

tools.byProvider[provider].allow/deny.
5

Agent-specific tool policy

agents.list[].tools.allow/deny.
6

Agent provider policy

agents.list[].tools.byProvider[provider].allow/deny.
7

Sandbox tool policy

tools.sandbox.tools or agents.list[].tools.sandbox.tools.
8

Subagent tool policy

tools.subagents.tools, if applicable.
  • Each level can further restrict tools, but cannot grant back denied tools from earlier levels.
  • If agents.list[].tools.sandbox.tools is set, it replaces tools.sandbox.tools for that agent.
  • If agents.list[].tools.profile is set, it overrides tools.profile for that agent.
  • Provider tool keys accept either provider (e.g. google-antigravity) or provider/model (e.g. openai/gpt-5.4).
If any explicit allowlist in that chain leaves the run with no callable tools, OpenClaw stops before submitting the prompt to the model. This is intentional: an agent configured with a missing tool such as agents.list[].tools.allow: ["query_db"] should fail loudly until the plugin that registers query_db is enabled, not continue as a text-only agent.
Tool policies support group:* shorthands that expand to multiple tools. See Tool groups for the full list. Per-agent elevated overrides (agents.list[].tools.elevated) can further restrict elevated exec for specific agents. See Elevated mode for details.

Migration from single agent

Legacy agents.defaults.*/agents.list[].* config keys (such as sandbox.perSession, agentRuntime, embeddedPi) are migrated by openclaw doctor; prefer agents.defaults + agents.list going forward.

Tool restriction examples


Common pitfall: “non-main”

agents.defaults.sandbox.mode: "non-main" checks the session key against the main session key (always "main"; session.mainKey is not user-configurable, and OpenClaw warns and ignores any other value), not the agent id. Group/channel sessions always get their own keys, so they are treated as non-main and will be sandboxed. If you want an agent to never sandbox, set agents.list[].sandbox.mode: "off".

Testing

After configuring multi-agent sandbox and tools:
1

Check agent resolution

2

Verify sandbox containers

3

Test tool restrictions

  • Send a message requiring restricted tools.
  • Verify the agent cannot use denied tools.
4

Monitor logs


Troubleshooting

  • Check if there’s a global agents.defaults.sandbox.mode that overrides it.
  • Agent-specific config takes precedence, so set agents.list[].sandbox.mode: "all".
  • Check the full filtering order: profile → provider profile → global policy → provider policy → agent policy → agent provider policy → sandbox → subagent.
  • Each level can only further restrict, not grant back.
  • See Sandbox vs tool policy vs elevated for step-by-step debugging.
  • Default scope is "agent" (one container per agent id).
  • Set scope: "session" for one container per session, or scope: "shared" to reuse one container across agents.