In depth
An MCP tool is the primary primitive for agent action. A tool has three pieces of metadata: a unique name, a human-readable description (which the LLM reads to decide when to call it), and a JSON Schema for its input arguments.
Servers expose tools via `tools/list`, and the client queries this at initialization to build the LLM's tool manifest. When the LLM wants to act, it emits a tool call with the tool's name and arguments matching the schema. The server receives this, executes, and returns a result.
Tool descriptions matter enormously for LLM quality — a well-written description is the difference between the LLM calling the right tool at the right moment vs. ignoring it. Think of the description as documentation that the LLM will read every turn.
Tools can be annotated with hints: `readOnlyHint` (tool doesn't mutate state), `destructiveHint` (tool does), `idempotentHint` (safe to retry), and `openWorldHint` (tool interacts with external systems).