跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

Sub-agent tool policy

The sub-agent tool restriction layer and how to narrow it with config

Tool policy

Sub-agents use the same profile and tool-policy pipeline as the parent or target agent first. After that, OpenClaw applies the sub-agent restriction layer.

When settled children resume a requester after sessions_yield, the continuation keeps the requester policy captured at spawn. The handoff must still belong to the current requester session and settled batch, and every child in that batch must carry the same verified requester policy. Conflicting or missing child policies leave the continuation under its ordinary restricted policy. Current tool restrictions and live revocation checks still apply at execution; the handoff does not grant additional tools or infer a sender identity.

An automatic completion turn for a requester on the Claude CLI backend keeps that same captured policy. The tools reach the CLI only through OpenClaw's policy-filtered MCP surface, so native CLI tools stay disabled for the turn and every inherited deny still applies. Other CLI backends, node-hosted Claude CLI sessions, and settle batches do not regain requester tools. Message-tool-only replies keep their existing source-bound message grant.

Sub-agents always lose gateway, agents_list, session_status, progress_card, cron, message, sessions_send, and the conversations_* tools regardless of depth or role (system-level/interactive tools, parent-owned progress cards, direct delivery surfaces, or tools the main agent should coordinate). This hard-deny layer is derived from the persisted sub-agent session envelope on every turn, including resumed and visible dashboard sessions; ordinary allow/alsoAllow entries cannot override it. Hidden launches also disable message before tool construction as defense in depth. Sub-agents at the configured depth cap additionally lose subagents, sessions_list, sessions_history, and sessions_spawn, so their communication stays on the announce chain.

sessions_history remains a bounded, redacted recall view here too — it is neither a raw transcript dump nor a prose-only rendering.

By default, sub-agents below depth 5 receive sessions_spawn, subagents, sessions_list, and sessions_history so they can manage their children.

Delegate tools to a coding agent

A front-door agent can remain unable to execute commands or edit files while handing implementation to a separately configured coding agent. Opt in for each target on the requesting agent:

{
  agents: {
    entries: {
      intake: {
        tools: { deny: ["exec", "process", "write", "edit", "apply_patch"] },
        subagents: {
          allowAgents: ["coder"],
          delegateToolsTo: ["coder"],
        },
      },
      coder: {},
    },
  },
}

delegateToolsTo is an operator-owned permission, not a sessions_spawn argument. It names exact configured target agents; it does not replace allowAgents or permit arbitrary targets. Without this grant, the existing caller tool ceiling is unchanged. The intake agent remains locally restricted.

The grant applies to native cross-agent handoffs and relaxes only the requesting agent's own tools.deny layer. Global, provider, sender, conversation, sandbox, and inherited restrictions are not delegation grants. Duplicate denials at those layers remain denied, and the target still applies its own current tool policy and the hard sub-agent restrictions. A restrictive inherited allowlist cannot be discarded to make a handoff work. An explicit grant that cannot be projected safely fails before creation instead of starting an unusable child. ACP retains its original inheritance and admission checks.

The initial handoff requires a Gateway-side native tool surface and local placement. Cloud-worker and CLI-mediated spawn surfaces cannot originate or propagate the exception. Supported CLI and plugin harness targets use OpenClaw-mediated tools, not an ambient native command surface, so grant revocation can be checked before effects. Backends that cannot enforce that projection refuse the run.

Same-agent native helpers of the coding target retain the grant and any additional restrictions. They cannot transfer it to a third agent. Completion back to the intake agent preserves the intake agent’s original tool snapshot. Removing the target grant or its allowAgents admission restores the original ceiling on subsequent preparation and rejects retained actions that depended on the grant before their effects. Already-started effects are not rolled back.

Existing sessions keep their recorded policy; adding this setting does not retroactively upgrade a previously created child.

Override via config

{
  agents: {
    defaults: {
      subagents: {
        maxConcurrent: 1,
      },
    },
  },
  tools: {
    subagents: {
      tools: {
        // deny wins
        deny: ["gateway", "cron"],
        // if allow is set, it becomes allow-only (deny still wins)
        // allow: ["read", "exec", "process"]
      },
    },
  },
}

tools.subagents.tools.allow is a final allow-only filter. It can narrow the already-resolved tool set, but it cannot add back a tool removed by tools.profile. For example, tools.profile: "coding" includes web_search/web_fetch but not the browser tool. To let coding-profile sub-agents use browser automation, add browser at the profile stage:

{
  tools: {
    profile: "coding",
    alsoAllow: ["browser"],
  },
}

Use per-agent agents.entries.*.tools.alsoAllow: ["browser"] when only one agent should get browser automation.