A tool's description is doing real work, not documentation for a human reader — it's the primary signal Claude uses to decide whether and when to call that tool over another, before it ever looks at the parameters. A vague description ("handles user requests") gives the model nothing to discriminate on; a specific one ("looks up a customer's order status by order ID; do not use for placing new orders") gives it a clear boundary, including an explicit negative case. The exam treats the description field as the single highest-leverage lever for fixing wrong-tool-selection bugs — before touching temperature, model choice, or prompt engineering elsewhere in the system.
JSON Schema mechanics of input_schema
Every tool's input_schema is a JSON Schema object: type: "object" at the top level, a properties map describing each field, and a required array naming which of those fields must be present. Each parameter benefits from the same specificity as the top-level description: a plain string named date invites format ambiguity; a description stating the expected format ("ISO 8601, e.g. 2026-08-28") removes it. Use enum whenever the valid values are a fixed, small set rather than free text — it doesn't just document the constraint, it narrows what the model can generate for that field in the first place. Nested object and array types are supported, but every extra level of nesting is another place a partially-specified generation can go wrong; prefer a flatter schema with clearly named fields over a deeply nested one that mirrors an internal data model.
Strict tool use guarantees the schema
Setting strict: true on a tool definition (a top-level field alongside name, description, and input_schema — not a tool_choice setting) guarantees that tool_use.input validates exactly against the schema. It requires additionalProperties: false and an accurate required array. Without strict, the schema is guidance the model usually follows; with it, malformed or missing-field tool calls become structurally impossible rather than merely unlikely.
Writing descriptions that change tool-selection behavior
Being prescriptive about when to call a tool, not just what it does, produces a measurable difference in whether the model reaches for it. "Get current weather for a location" describes the tool; "call this when the user asks about current conditions or the forecast for a specific place" gives Claude a trigger condition to match against the conversation. This matters more, not less, on newer Opus-tier models, which reach for tools more conservatively by default — a tool description without an explicit trigger condition is more likely to be skipped in favor of answering from the model's own knowledge, even when the tool would have produced a better answer. The same logic applies to negative cases: naming what a tool is not for ("do not use for placing new orders") is often more effective at preventing a specific miscall than any amount of positive-case detail on the correct tool.
Tool count, schema depth, and cognitive load
Every tool definition Claude sees consumes context and adds a candidate to choose between on every turn. A handful of tightly-scoped, clearly named tools (search_orders, create_order, cancel_order) outperforms one do-everything tool with a mode parameter (order_action with an action enum of search/create/cancel) for exactly the reason overlapping descriptions cause problems: the model has to do extra inference work to figure out which behavior you actually want, and that inference is where errors creep in. When a library of tools grows large (dozens to hundreds), the fix isn't cramming them all into every request — it's the tool search tool, which lets Claude discover relevant tools on demand instead of holding every schema in context simultaneously.
Common exam distractor
Two tools with overlapping, vaguely-worded descriptions is a common exam scenario for "why does the model keep calling the wrong tool" — the fix is tightening the descriptions to be mutually exclusive, not switching models, lowering temperature, or adding few-shot examples. A related distractor: blaming inconsistent tool selection on nondeterminism and reaching for a fixed seed or lower temperature. Sampling variance can make an ambiguous case flip between two plausible answers, but the underlying cause is still that the schema gave the model two equally-plausible options — fix the ambiguity, don't just narrow the sampling around it.
Testing and iterating on schemas
Because tool selection has some sampling variance, a single test call proving the "right" tool got picked doesn't prove the schema is fixed — and a single call proving the wrong tool got picked doesn't prove it's broken either. Run the same or similar prompts several times and look at the distribution, not one outcome. This matters most in exactly the boundary cases that motivate rewriting a description in the first place: a prompt that's genuinely ambiguous between two tools should ideally resolve to a clarifying question rather than a confident but wrong call, and testing across repetitions is how you tell the difference between "fixed" and "improved but still occasionally wrong."