AnthropicClaude Certified Architect – Foundations2026-102.1 Design effective tool interfaces with clear descriptions and boundaries
Describe tools so selection becomes explicit
Completed by the knowledge check
Learning objective
Write tool descriptions that define purpose, expected inputs and outputs, examples, edge cases, and when to use alternative tools.
Core idea
As an architect exposing tools to Claude, you design the information from which the model chooses an operation. A description must answer a practical question: does this tool produce the evidence or effect this request needs, from the inputs available? A name such as analyze_document leaves that decision underspecified.
Claude determines when to call a tool from the user’s request and the tool’s description, and Anthropic calls detailed descriptions by far the most important factor in tool performance. The description explains intent and boundaries; the input schema describes the accepted argument structure. Neither can replace the other. A perfectly shaped call to the wrong operation still fails the user’s task.
Write the contract around a specific outcome. Explain what the tool does, what each parameter means, what it returns, and which nearby requests belong elsewhere. See 0.3 for required fields and nullability. Here the focus is making the choice and the meaning of those fields clear before execution.
How it works
Put the contract in the tool definition
For user-defined Messages API client tools, the request’s tools array carries name, description, and input_schema. The API constructs tool-use instructions from tool definitions, configuration, and the supplied system prompt. Descriptions therefore enter the model’s decision context; they are not merely documentation for your developers.
Use name for a recognizable operation and resource. Use description for its purpose, selection conditions, result meaning, and limitations. Use input_schema.properties and each property’s description to explain arguments. For example, document_id should mean the identifier of an ingested document, rather than an arbitrary filename, URL, or pasted body. That distinction belongs beside the parameter, not in an implementation comment Claude never receives.
A description needs enough detail to resolve likely confusion. Anthropic’s engineering guidance suggests describing the tool as you would to a new hire on your team, and spelling out what you might bring implicitly: specialized query formats, definitions of niche terminology, and relationships between underlying resources. The API documentation asks for at least three or four sentences, more for complex tools. That is guidance about coverage, not a guarantee attached to a sentence count; repeating “analyzes documents” four times adds nothing.
Define inputs and outputs together
Consider an illustrative application tool named extract_data_points. The following entry in tools defines its inputs and describes the application-owned result contract:
{
"name": "extract_data_points",
"description": "Extract requested fields from an ingested document. Accept only an ingested document identifier in document_id and field names in field_names, not a filename, URL, or pasted text. Return one record per field with its value, supporting passage, and page location. For example, use this tool for: Return the renewal date from the uploaded contract. If a field is absent, return a record marked missing rather than an inferred value. Use summarize_content for a narrative overview or verify_claim_against_source to compare a claim with source evidence.",
"input_schema": {
"type": "object",
"properties": {
"document_id": {
"type": "string",
"description": "Identifier returned by the application after ingestion"
},
"field_names": {
"type": "array",
"items": { "type": "string" },
"description": "Names of the fields to extract"
}
},
"required": ["document_id", "field_names"]
}
}Explain the output in description as well as implementing it in the tool. An input schema describes accepted arguments; it does not tell the model what evidence the result contains. If an absent field produces an explicit missing-value record, say so. If the tool returns only extracted values and never verifies a claim, say that too. These choices must match the application contract shown in the description.
Prefer parameter names that identify the resource precisely. Anthropic’s engineering guidance contrasts an ambiguous user parameter with user_id. The same principle distinguishes document_id from document, and claim_text from query.
Add examples that resolve ambiguity
Include a short request example in the description: use extract_data_points for “Return the renewal date from the uploaded contract.” Pair it with a contrasting request: use summarize_content for “Explain the contract’s main obligations.” The contrast teaches the decision the model must make, rather than only demonstrating valid syntax.
For complex input objects, the API also supports input_examples. These are argument objects, not complete conversations or natural-language requests. Each example must satisfy input_schema; an invalid example returns HTTP 400. Show a representative nested structure or format-sensitive value when the schema alone leaves realistic usage unclear.
The distinction matters when reviewing examples. A sentence in description explains when to select the tool. An object in input_examples explains how to supply its arguments. Keep both aligned with the operation implemented by your application. A schema-valid example that uses an unsupported identifier convention can still teach the wrong behavior.
input_examples is supported for user-defined client tools and Anthropic-schema client tools except the computer-use and browser-use client toolsets. It is not supported for server tools such as web search or code execution. Do not transfer that field to every tool integration because it appears in a custom-tool example.
Explain the edges and the alternative
An edge case should change the caller’s decision or interpretation. For the illustrative extraction tool, explain how it handles a missing field, conflicting values, or an unsupported document identifier. Avoid promising that the model can repair these conditions by guessing a value.
Name the alternative operation explicitly. “Does not summarize” is less helpful than “Use summarize_content for a narrative overview; this tool returns requested fields with source passages.” Likewise, explain that verify_claim_against_source compares a supplied claim with evidence rather than extracting every value in a document.
Keep tool responses focused on information needed for the next decision. Anthropic recommends high-signal fields and stable, meaningful identifiers rather than bloated results. If source attribution is necessary, include it in the actual response contract; a description that promises page locations cannot compensate for an implementation that omits them.
Key distinctions and trade-offs
Each element of the contract closes a specific gap in the selection decision:
| Element | What it tells Claude | Failure it prevents |
|---|---|---|
| Purpose and result | What the operation does and what evidence it returns | Selecting the tool for evidence it never produces |
| Input format | What each parameter identifies and how callers write it | Passing a filename where document_id expects an identifier |
| Example request | A request, in a user’s words, that should select the tool | Skipping the tool when a request does not echo its name |
| Edge case | What happens when a field is absent or an input is unsupported | Inferred values and repeated retries |
| Boundary | Which neighbouring operation handles the adjacent request, by name | Neighbouring tools both claiming one request |
Purpose versus format: description helps determine whether an operation is appropriate. input_schema defines the argument structure. Clear format constraints do not establish semantic suitability.
Limit versus failure contract: “Only ingested document identifiers are accepted” describes a boundary. “Unknown identifiers produce this result” describes what happens at that boundary. State both when they affect subsequent work.
Architecture / decision scenario
A structured-data extraction assistant receives uploaded contracts. It has the illustrative tools extract_data_points, summarize_content, and verify_claim_against_source. A user asks for the renewal date, a summary of obligations, and whether the contract permits cancellation without notice.
The architect gives extract_data_points an input contract using document_id and field_names. Its description promises field values with source locations, explains the application’s missing-field result, and includes the renewal-date example. The summary tool promises a narrative overview. The verification tool accepts claim_text and returns a comparison supported by passages. Each description names the other operations where their responsibilities divide.
The assistant can select all three operations for the compound request without treating a summary as proof of a claim. If the renewal date is absent, the defined missing-field result preserves that absence. If the user supplies a filename instead of an ingested identifier, the assistant must resolve the identifier according to the contract rather than invent one.
For a nested extraction request, the architect adds valid input_examples to the custom client tool definition. They inspect representative tool_use blocks and returned evidence to confirm that examples improve argument formation without blurring the three purposes. See 1.1.2 for the call-and-result history mechanics.
Common exam traps
- Using a one-line description that repeats the name without specifying the outcome.
- Treating the input schema as documentation of returned evidence.
- Supplying natural-language requests where
input_examplesexpects argument objects. - Explaining the happy path but leaving missing values and unsupported inputs ambiguous.
- Saying “use another tool” without naming the relevant alternative and selection condition.
- Assuming a descriptive promise validates or enforces the application’s output contract.
What to remember
A useful description defines purpose, inputs, outputs, examples, edge cases, and alternatives. Put argument structure in input_schema, meaning in descriptions, and representative valid objects in input_examples where supported. Make the documented contract match the implemented result.
Knowledge check
A structured-data extraction assistant exposes extract_data_points, whose input_schema fully defines document_id and field_names. When users ask whether a contract permits cancellation without notice, Claude calls this tool and treats the returned field values as a verdict on the claim. What should the architect change in the tool definition?
claim_text property to the input schema of extract_data_pointsextract_data_points to a name that mentions contractsinput_examples entry with a typical field_names arrayverify_claim_against_source . Adding a claim parameter widens the tool into a second job, a new name leaves the result as undefined as before, and argument examples teach how to fill fields, not when the tool applies.A team wants Claude to learn that “Return the renewal date from the uploaded contract” is a request for extract_data_points, while “Explain the contract’s main obligations” belongs to summarize_content. Where does this pair of examples belong?
input_examples , as two entries written in the user’s wordsfield_names property, beside its typeinput_examples holds argument objects that must validate against input_schema — a natural-language request there is the wrong kind of example — and a keyword rule in the system prompt creates a new word-to-tool association instead of describing the outcome.Claude selects extract_data_points correctly, and its description already explains each parameter in prose. Calls still arrive with the nested filters object built the wrong way and dates in the wrong format. Which addition targets this failure?
input_examples entries that show a correctly built filters objectinput_examples entry written as a sample conversation with a userinput_examples exists for. Each example is an argument object that must satisfy input_schema — an invalid one returns HTTP 400 — so a sample conversation is the wrong shape. Restating the purpose or adding selection examples addresses a decision Claude is already making correctly.When a requested field is absent from a contract, extract_data_points returns an empty list, and Claude fills the gap with a renewal date it infers from the contract term. The team wants absent fields preserved as absent. Which change achieves this?
References
- Anthropic, Define tools
- Anthropic, Tool use with Claude
- Anthropic, Writing effective tools for agents
- JSON Schema, Array