A tool is a callable function a server exposes to the model. Each tool definition has a name, a human-and-model-readable description, an inputSchema (JSON Schema describing the arguments), and optionally an outputSchema, a title, and behavioral annotations.
Discovery and execution use two protocol methods. The client calls tools/list to get definitions and tools/call to execute one:
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "get_weather",
"arguments": { "city": "Berlin" }
}
}
The result contains a content array with text, image, audio, or resource blocks. It may also include structuredContent when the tool declares an output schema, plus an isError flag for failures. The host displays the result or returns it to the model.
Two details matter in practice. First, the model chooses tools based almost entirely on names and descriptions, so those are effectively prompt engineering. Second, if the server declares the listChanged capability it can push a notifications/tools/list_changed notification, after which the client re-fetches the list. Tool sets are dynamic, not fixed at startup.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓