Skip to main content

agentsop-tool-scoping

Enhancement overlay for multi-agent / tool-using coder agents. Encodes the per-agent tool- scoping discipline that role-based frameworks (CrewAI, LangChain) document only as a passing best-practice: which agent gets which tool, and why blanket-sharing every tool to every agent is a correctness and blast-radius risk. Activates when an agent system has tools AND there is more than one agent (or one agent holding many tools). Treat a tool as a capability grant; scope by least-privilege. ENHANCE overlay — read alongside [[crewai]], [[agentsop-http-tool-wrapping]], [[agentsop-llm-tool-idempotency]]. Search keywords: which tools per agent, least-privilege agent, agent tool access, tool permissions, limit agent tools, scope tools to roles.overlay_type: enhancement

Source facts

Repository
agentsope/SkillAlchemy
Last source activity
May 20, 2026 at 14:58
Detected SKILL.md language
English
Stars
432
Forks
25

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
4 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
agentsop-tool-scoping
version
0.1.0
description
Enhancement overlay for multi-agent / tool-using coder agents. Encodes the per-agent tool- scoping discipline that role-based frameworks (CrewAI, LangChain) document only as a passing best-practice: which agent gets which tool, and why blanket-sharing every tool to every agent is a correctness and blast-radius risk. Activates when an agent system has tools AND there is more than one agent (or one agent holding many tools). Treat a tool as a capability grant; scope by least-privilege. ENHANCE overlay — read alongside [[crewai]], [[agentsop-http-tool-wrapping]], [[agentsop-llm-tool-idempotency]]. Search keywords: which tools per agent, least-privilege agent, agent tool access, tool permissions, limit agent tools, scope tools to roles.overlay_type: enhancement
enhances
["crewai","langchain","langgraph"]
# Tool Scoping · Per-Agent Tool Binding (Least-Privilege Discipline) > Overlay posture: the base frameworks ([[crewai]], LangChain, LangGraph) all > *define* tools and *bind* them, but treat scoping as a one-line "assign tools > to the agent that needs them" footnote. This overlay makes the rubric > first-class. Non-trivial claims cite inline against > `references/R1-source-evidence.md`. The lever the base skills under-surface: **tool definition and tool binding are two separate decisions.** You define a tool *once* (reusable class/function), but you *bind* it per-agent deliberately. The [[crewai]] SKILL states this in one clause — "tool 定义可复用;但每个 agent 只绑定其角色匹配的工具" `[crewai-sop §DC-3]` — and then moves on. Production failures (wrong-tool selection, an agent running a destructive op outside its role) come from skipping the binding decision and defaulting to "give everyone everything." --- ## 1. 何时激活 (When to Activate) Activate when **any** of these hold: - The system is **multi-agent** (CrewAI crew, LangGraph supervisor/swarm, AutoGen group) AND at least one agent holds ≥1 tool. - A **single agent holds many tools** (rule of thumb: ≥8 — see OP-4) and tool selection has started degrading (picks the wrong tool, or "tool-hops"). - You are **tempted to give all agents all tools** — `tools=[search, exec, db]` copy-pasted onto every `Agent(...)`, or one `bind_tools([...everything])` call reused for every node. This is the canonical trigger. - A tool has **side effects** (DB write, payment, email, `DELETE`, shell exec, outbound HTTP POST) and you are deciding who may hold it. - You are doing a **security / blast-radius review** of an agent system and need to answer "which agent can do what, and why." Do **not** activate for: a single agent with 1–3 read-only tools (scoping is trivial), or a stateless single LLM call with no tools. --- ## 2. 核心心智模型 (Core Mental Model) **A tool is a capability grant, not a convenience.** Binding a tool to an agent is the same act as granting a Unix process a syscall, a service an IAM role, or a container a Linux capability. The discipline is identical and ancient: **least-privilege — an agent should hold only the tools its role actually needs.** Three load-bearing consequences: 1. **Definition ≠ binding.** Define the tool once (a reusable `BaseTool` / function); decide the *binding* (which agents see it) separately and minimally. [[crewai]] says "write once, use everywhere" applies to the *definition* layer only; the *binding* layer is per-role `[crewai-sop §DC-3]`. 2. **Every bound tool is in the agent's selection space, and the model pays for it.** The LLM must reason over the full tool list on every turn. More tools = bigger schema in context = higher token cost AND lower selection accuracy. This is why a 20-tool agent picks wrong (OP-4, DC-2). 3. **Side-effectful tools change the blast radius of a misfire.** A read-only `search` tool on the wrong agent wastes tokens. A `run_sql` or `send_payment` tool on the wrong agent (or one with no guard) is a production incident. The LangGraph HITL discipline — "interrupt on irreversible, high-blast-radius actions only" — is the *runtime* half; tool scoping is the *design-time* half of the same risk-control `[langgraph-sop §Step5]`. The mental test before binding any tool to any agent: > "Does THIS role's goal require THIS capability to be exercised by THIS agent > autonomously? If a different agent could/should do it, don't bind it here." --- ## 3. SOP 工作流 (Standard Operating Procedure) A coder agent walks this top-down. Each phase has a gate. ### Phase 0 · Inventory the surface List every tool (name, side-effect class: `read` | `compute` | `write` | `destructive`) and every agent (name, one-verb role). If there is exactly one agent and ≤3 read tools — **stop, scoping is trivial.** ### Phase 1 · Map roles → minimal tool set For each agent, write its role as a single verb (research / analyze / write / review). Then, for each tool, ask the §2 test. Bind only on a "yes." - Default to the **empty set** and add tools, not the full set and remove them. - A "synthesis-only" agent (writer, reporter) often needs **zero** tools — it consumes upstream output `[crewai-sop §DC-3]`. Gate: if two agents end up with identical tool sets, ask whether they are really two roles or one (the [[crewai]] "split-vs-merge" question `[crewai-sop §DC-1]`). ### Phase 2 · Guard side-effectful tools Any tool classed `write` or `destructive`: - Bind it to **exactly one** agent (single funnel, auditable). - Pair it with a runtime guard: HITL `interrupt()` before the side effect in LangGraph `[langgraph-sop §Step5]`, or an approval/confirm step in CrewAI. - Make the underlying operation **idempotent** so a retry/re-run is a no-op — see [[agentsop-llm-tool-idempotency]] and [[agentsop-http-tool-wrapping]]. LangGraph's payment case (charged twice on resume) is exactly this failure `[langgraph-sop §Case4]`. ### Phase 3 · Enforce per-agent tool-count limit If any agent now holds **>8 tools**, selection accuracy degrades (OP-4). Options: split the role, group tools behind a router/sub-agent, or move read-only helpers into the prompt as context instead of tools. ### Phase 4 · Audit Produce a binding matrix (agents × tools). For each `write`/`destructive` cell, confirm there is exactly one owner and a guard. For each agent, confirm tool count ≤ limit. This matrix is the security artifact a reviewer reads. --- ## 4. 操作模型 (Operation Models) Format: **Trigger → Action → Output → Evidence**. ### OP-1 · Least-privilege role→tool mapping - **Trigger**: Assembling a multi-agent crew/graph with a shared tool pool. - **Action**: For each agent, start from `tools=[]`. Add a tool only when the role's goal *requires that agent* to exercise it. Reuse the tool *definition* across agents, but bind per-role. - **Output**: Each `Agent(tools=[...])` / per-node `bind_tools([...])` holds the minimal set; a binding matrix. - **Evidence**: `[crewai-sop §DC-3]` "每个 agent 只绑定其角色匹配的工具"; `[langgraph-sop §Step4]` topology binds tools to nodes, not globally. ### OP-2 · Side-effect tool guarding - **Trigger**: A tool performs a `write` or `destructive` operation. - **Action**: Bind it to one agent only. Add a runtime guard (HITL interrupt / human approval) before the effect, and make the op idempotent. - **Output**: A single-owner, guarded, idempotent side-effectful tool. - **Evidence**: `[langgraph-sop §Step5]` interrupt on irreversible only; `[langgraph-sop §Case4]` double-charge from unguarded side effect; cross-link [[agentsop-llm-tool-idempotency]], [[agentsop-http-tool-wrapping]]. ### OP-3 · Shared-registry vs per-agent binding decision - **Trigger**: You have a tool registry and N agents and must decide how to wire. - **Action**: Share at the **definition** layer (one registry of tool classes). Decide **binding** per-agent via OP-1. Never `tools=registry.all()` on every agent. - **Output**: One definition source, N minimal per-agent bindings. - **Evidence**: `[crewai-sop §DC-3]` definition-reuse vs binding-scope split. ### OP-4 · Per-agent tool-count limit - **Trigger**: An agent's tool list grows (≥8) or it starts mis-selecting tools. - **Action**: Cap tools per agent (~8 as a working ceiling). If over, split the role, introduce a routing sub-agent, or demote read-only tools to context. - **Output**: Every agent ≤ the ceiling; improved selection accuracy. - **Evidence**: too-many-tools degrades selection — same root cause as CrewAI's ">5 agents = coordination failure" scaling wall `[crewai-sop §6.1 AP-1]`; see DC-2. ### OP-5 · Zero-tool synthesis agents - **Trigger**: An agent only consumes upstream output (writer, reporter, judge). - **Action**: Bind **no tools**. Feed it context via task `context=[...]` (CrewAI) or state (LangGraph). - **Output**: A tool-free agent that cannot "wander" into capabilities. - **Evidence**: `[crewai-sop §DC-3]` "reporter=[] (纯综合)". ### OP-6 · Binding-matrix audit - **Trigger**: Pre-ship review, or security review of an agent system. - **Action**: Build an agents × tools matrix. Flag any `write`/`destructive` tool bound to >1 agent or lacking a guard; flag any agent over the count limit. - **Output**: A reviewable capability matrix + remediation list. - **Evidence**: Phase 4; mirrors least-privilege IAM review practice. ### OP-7 · Tighten scope as the fastest misuse fix - **Trigger**: An agent is observed using a tool outside its role (e.g. a researcher invoking a code executor). - **Action**: Remove the tool from that agent's binding (the whitelist tighten), rather than prompt-engineering "please don't use X." - **Output**: A structurally-prevented misuse instead of a hoped-for one. - **Evidence**: `[crewai-sop §DC-3]` "agent 跨工具滥用 → 收紧工具白名单是最快的 fix". --- ## 5. 困境决策案例 (Dilemma Cases) ### DC-1 · Shared tool registry vs per-agent tool sets **场景**: You have `web_search`, `code_executor`, `db_query` and three agents (researcher / analyst / reporter). The convenient move is `tools=[search, exec, db]` on all three. **两条路**: - **A. Blanket share** — every agent gets all three. Zero wiring thought. Problem: the researcher also calls `code_executor` to "just quickly compute," violating role separation; failures become un-localizable (who ran the bad query?); every agent pays the full 3-tool schema cost every turn. - **B. Per-role binding** — `researcher=[search]`, `analyst=[exec, db]`, `reporter=[]`. Clearer responsibilities, localizable errors, smaller per-turn schema `[crewai-sop §DC-3]`. **判断规则**: 1. Share at the **definition** layer (one `BaseTool` per tool — reuse is good). 2. Decide **binding** by OP-1: a tool is bound only if the role needs that agent to exercise it. 3. If you genuinely cannot say which single agent owns a `write` tool, your roles are under-specified — go back to role design `[crewai-sop §DC-1]`. **红线**: Never let "it's easier to share" be the binding rationale. Ease of wiring is not a capability requirement. **Evidence**: `[crewai-sop §DC-3]`, `[langgraph-sop §Step4]`. --- ### DC-2 · The 20-tool agent that picks the wrong tool **场景**: A single "do-everything" agent accumulates 20 tools over time. It now calls `delete_record` when the user asked to *read* a record, or burns turns hopping between near-duplicate tools (`search_v1`, `search_v2`, `lookup`). **陷阱**: The instinct is to "improve the prompt" so the model picks better. But the root cause is the **selection space is too large** — 20 tool schemas in context dilute attention and inflate token cost, exactly as ">5 agents" causes coordination collapse in CrewAI `[crewai-sop §6.1 AP-1]`. Prompt tweaks paper over a structural problem. **三条路**: - **A. Prompt-engineer the selection** — describe each tool more carefully. Helps marginally; does not fix the count. - **B. Split the agent by capability cluster** — research-agent (search tools), data-agent (db/exec tools), each ≤8 tools. Mirrors the CrewAI "split when one agent does two jobs" rule `[crewai-sop §DC-1]`. - **C. Router + scoped sub-agents** — a thin supervisor routes to a sub-agent whose small tool set matches the sub-task `[langgraph-sop §Step4]`. **判断规则**: 1. Tool count > ~8 → suspect the count, not the prompt (OP-4). 2. Duplicate/overlapping tools → consolidate definitions first. 3. Mixed read + destructive tools on one agent → split so destructive tools live on a single guarded owner (OP-2), shrinking the dangerous agent's surface. **红线**: A destructive tool on a 20-tool agent is the worst case — high mis-selection probability × high blast radius. Scope it out *first*. **Evidence**: `[crewai-sop §6.1 AP-1]`, `[langgraph-sop §Step4/§Case4]`. --- ### DC-3 · Should a destructive tool ever be shared across agents? **场景**: Two agents both "occasionally need" to write to the database. **判断规则**: 1. Default **no** — a `write`/`destructive` tool gets exactly one owning agent (single auditable funnel), per OP-2. 2. If two agents truly both need it, the write should usually be **extracted into a dedicated single-owner "writer" agent/node** that the others call — not duplicated. This is the supervisor-funnel argument applied to capabilities `[langgraph-sop §Step4]`. 3. Whichever agent owns it: guard with HITL/approval and idempotency ([[agentsop-llm-tool-idempotency]], [[agentsop-http-tool-wrapping]]). **红线**: Two agents holding the same unguarded destructive tool = two independent ways to cause the same irreversible incident, and an ambiguous audit trail. **Evidence**: `[langgraph-sop §Step5/§Case4]`, `[crewai-sop §DC-3]`. --- ## 6. 反模式与边界 (Anti-Patterns & Boundaries) | # | Anti-pattern | Symptom | Fix | |---|---|---|---| | AP-1 | **Blanket tool sharing** (`tools=[all]` on every agent) | role bleed, un-localizable failures, inflated token cost | per-role binding (OP-1, DC-1) | | AP-2 | **No guard on destructive tools** | double-charge / accidental delete on retry or mis-selection | single owner + HITL + idempotency (OP-2, [[agentsop-llm-tool-idempotency]]) | | AP-3 | **One mega-agent with 20 tools** | wrong-tool selection, tool-hopping, cost | cap ≤8, split or route (OP-4, DC-2) | | AP-4 | **Prompt-patching tool misuse** | "please don't use X" in backstory | remove the tool from the binding (OP-7) | | AP-5 | **Sharing the destructive tool itself** instead of the definition | two paths to the same incident | extract single-owner writer (DC-3) | | AP-6 | **Binding tools to synthesis agents** | writer/reporter "wanders" into search/exec | bind zero tools (OP-5) | **Boundaries — this overlay does NOT cover:** - *How* to implement a tool (ret, errors, HTTP wrapping) → [[agentsop-http-tool-wrapping]]. - *How* to make a tool safe to retry → [[agentsop-llm-tool-idempotency]]. - *Runtime* HITL gating mechanics → base LangGraph skill `[langgraph-sop §Step5]`. - Whether to use multi-agent at all → [[crewai]] / agent-topology selection. - This is a **design-time scoping rubric**, not a sandbox/permission *runtime*. --- ## 7. 跨框架对照 (Cross-Framework Mapping) The scoping decision is universal; only the binding syntax differs. | Framework | Define a tool | Bind per-agent (the scoping point) | Scoping notes | |---|---|---|---|
View on GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub