Multi-Agent Sandbox & Tools
このコンテンツはまだ日本語訳がありません。
Multi-Agent Sandbox & Tools Configuration
Section titled “Multi-Agent Sandbox & Tools Configuration”Overview
Section titled “Overview”Each agent in a multi-agent setup can now have its own:
- Sandbox configuration (
agents.list[].sandboxoverridesagents.defaults.sandbox) - Tool restrictions (
tools.allow/tools.deny, plusagents.list[].tools)
This allows you to run multiple agents with different security profiles:
- Personal assistant with full access
- Family/work agents with restricted tools
- Public-facing agents in sandboxes
setupCommand belongs under sandbox.docker (global or per-agent) and runs once
when the container is created.
Auth is per-agent: each agent reads from its own agentDir auth store at:
~/.coderclaw/agents/<agentId>/agent/auth-profiles.jsonCredentials are not shared between agents. Never reuse agentDir across agents.
If you want to share creds, copy auth-profiles.json into the other agent’s agentDir.
For how sandboxing behaves at runtime, see Sandboxing.
For debugging “why is this blocked?”, see Sandbox vs Tool Policy vs Elevated and coderclaw sandbox explain.
Configuration Examples
Section titled “Configuration Examples”Example 1: Personal + Restricted Family Agent
Section titled “Example 1: Personal + Restricted Family Agent”{ "agents": { "list": [ { "id": "main", "default": true, "name": "Personal Assistant", "workspace": "~/.coderclaw/workspace", "sandbox": { "mode": "off" } }, { "id": "family", "name": "Family Bot", "workspace": "~/.coderclaw/workspace-family", "sandbox": { "mode": "all", "scope": "agent" }, "tools": { "allow": ["read"], "deny": ["exec", "write", "edit", "apply_patch", "process", "browser"] } } ] }, "bindings": [ { "agentId": "family", "match": { "provider": "whatsapp", "accountId": "*", "peer": { "kind": "group", } } } ]}Result:
mainagent: Runs on host, full tool accessfamilyagent: Runs in Docker (one container per agent), onlyreadtool
Example 2: Work Agent with Shared Sandbox
Section titled “Example 2: Work Agent with Shared Sandbox”{ "agents": { "list": [ { "id": "personal", "workspace": "~/.coderclaw/workspace-personal", "sandbox": { "mode": "off" } }, { "id": "work", "workspace": "~/.coderclaw/workspace-work", "sandbox": { "mode": "all", "scope": "shared", "workspaceRoot": "/tmp/work-sandboxes" }, "tools": { "allow": ["read", "write", "apply_patch", "exec"], "deny": ["browser", "gateway", "discord"] } } ] }}Example 2b: Global coding profile + messaging-only agent
Section titled “Example 2b: Global coding profile + messaging-only agent”{ "tools": { "profile": "coding" }, "agents": { "list": [ { "id": "support", "tools": { "profile": "messaging", "allow": ["slack"] } } ] }}Result:
- default agents get coding tools
supportagent is messaging-only (+ Slack tool)
Example 3: Different Sandbox Modes per Agent
Section titled “Example 3: Different Sandbox Modes per Agent”{ "agents": { "defaults": { "sandbox": { "mode": "non-main", // Global default "scope": "session" } }, "list": [ { "id": "main", "workspace": "~/.coderclaw/workspace", "sandbox": { "mode": "off" // Override: main never sandboxed } }, { "id": "public", "workspace": "~/.coderclaw/workspace-public", "sandbox": { "mode": "all", // Override: public always sandboxed "scope": "agent" }, "tools": { "allow": ["read"], "deny": ["exec", "write", "edit", "apply_patch"] } } ] }}Configuration Precedence
Section titled “Configuration Precedence”When both global (agents.defaults.*) and agent-specific (agents.list[].*) configs exist:
Sandbox Config
Section titled “Sandbox Config”Agent-specific settings override global:
agents.list[].sandbox.mode > agents.defaults.sandbox.modeagents.list[].sandbox.scope > agents.defaults.sandbox.scopeagents.list[].sandbox.workspaceRoot > agents.defaults.sandbox.workspaceRootagents.list[].sandbox.workspaceAccess > agents.defaults.sandbox.workspaceAccessagents.list[].sandbox.docker.* > agents.defaults.sandbox.docker.*agents.list[].sandbox.browser.* > agents.defaults.sandbox.browser.*agents.list[].sandbox.prune.* > agents.defaults.sandbox.prune.*Notes:
agents.list[].sandbox.{docker,browser,prune}.*overridesagents.defaults.sandbox.{docker,browser,prune}.*for that agent (ignored when sandbox scope resolves to"shared").
Tool Restrictions
Section titled “Tool Restrictions”The filtering order is:
- Tool profile (
tools.profileoragents.list[].tools.profile) - Provider tool profile (
tools.byProvider[provider].profileoragents.list[].tools.byProvider[provider].profile) - Global tool policy (
tools.allow/tools.deny) - Provider tool policy (
tools.byProvider[provider].allow/deny) - Agent-specific tool policy (
agents.list[].tools.allow/deny) - Agent provider policy (
agents.list[].tools.byProvider[provider].allow/deny) - Sandbox tool policy (
tools.sandbox.toolsoragents.list[].tools.sandbox.tools) - 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.2).
Tool groups (shorthands)
Section titled “Tool groups (shorthands)”Tool policies (global, agent, sandbox) support group:* entries that expand to multiple concrete tools:
group:runtime:exec,bash,processgroup:fs:read,write,edit,apply_patchgroup:sessions:sessions_list,sessions_history,sessions_send,sessions_spawn,session_statusgroup:memory:memory_search,memory_getgroup:ui:browser,canvasgroup:automation:cron,gatewaygroup:messaging:messagegroup:nodes:nodesgroup:coderclaw: all built-in CoderClaw tools (excludes provider plugins)
Elevated Mode
Section titled “Elevated Mode”tools.elevated is the global baseline (sender-based allowlist). agents.list[].tools.elevated can further restrict elevated for specific agents (both must allow).
Mitigation patterns:
- Deny
execfor untrusted agents (agents.list[].tools.deny: ["exec"]) - Avoid allowlisting senders that route to restricted agents
- Disable elevated globally (
tools.elevated.enabled: false) if you only want sandboxed execution - Disable elevated per agent (
agents.list[].tools.elevated.enabled: false) for sensitive profiles
Migration from Single Agent
Section titled “Migration from Single Agent”Before (single agent):
{ "agents": { "defaults": { "workspace": "~/.coderclaw/workspace", "sandbox": { "mode": "non-main" } } }, "tools": { "sandbox": { "tools": { "allow": ["read", "write", "apply_patch", "exec"], "deny": [] } } }}After (multi-agent with different profiles):
{ "agents": { "list": [ { "id": "main", "default": true, "workspace": "~/.coderclaw/workspace", "sandbox": { "mode": "off" } } ] }}Legacy agent.* configs are migrated by coderclaw doctor; prefer agents.defaults + agents.list going forward.
Tool Restriction Examples
Section titled “Tool Restriction Examples”Read-only Agent
Section titled “Read-only Agent”{ "tools": { "allow": ["read"], "deny": ["exec", "write", "edit", "apply_patch", "process"] }}Safe Execution Agent (no file modifications)
Section titled “Safe Execution Agent (no file modifications)”{ "tools": { "allow": ["read", "exec", "process"], "deny": ["write", "edit", "apply_patch", "browser", "gateway"] }}Communication-only Agent
Section titled “Communication-only Agent”{ "tools": { "sessions": { "visibility": "tree" }, "allow": ["sessions_list", "sessions_send", "sessions_history", "session_status"], "deny": ["exec", "write", "edit", "apply_patch", "read", "browser"] }}Common Pitfall: “non-main”
Section titled “Common Pitfall: “non-main””agents.defaults.sandbox.mode: "non-main" is based on session.mainKey (default "main"),
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
Section titled “Testing”After configuring multi-agent sandbox and tools:
-
Check agent resolution:
coderclaw agents list --bindings -
Verify sandbox containers:
docker ps --filter "name=coderclaw-sbx-" -
Test tool restrictions:
- Send a message requiring restricted tools
- Verify the agent cannot use denied tools
-
Monitor logs:
tail -f "${CODERCLAW_STATE_DIR:-$HOME/.coderclaw}/logs/gateway.log" | grep -E "routing|sandbox|tools"
Troubleshooting
Section titled “Troubleshooting”Agent not sandboxed despite mode: "all"
Section titled “Agent not sandboxed despite mode: "all"”- Check if there’s a global
agents.defaults.sandbox.modethat overrides it - Agent-specific config takes precedence, so set
agents.list[].sandbox.mode: "all"
Tools still available despite deny list
Section titled “Tools still available despite deny list”- Check tool filtering order: global → agent → sandbox → subagent
- Each level can only further restrict, not grant back
- Verify with logs:
[tools] filtering tools for agent:${agentId}
Container not isolated per agent
Section titled “Container not isolated per agent”- Set
scope: "agent"in agent-specific sandbox config - Default is
"session"which creates one container per session