The breakthrough is so quiet that it is easy to miss. Around 2023, providers added a new piece to their inference APIs: when you call the model, you can hand it a list of tool definitions alongside the conversation. If the model decides a tool is needed, the response no longer mixes English and JSON. Instead, the response carries a separate, structured tool-call object — name, arguments — that the SDK exposes as a typed field.
This is a small change in shape and an enormous change in trust. The tool call is not text the model wrote; it is a decision the inference engine emitted in a place reserved for machine-readable instructions. The serializer guarantees the shape. The schema you provided guarantees the fields. The agentic loop becomes:
- You call the model with a user message and a tool list.
- The model returns either a normal text answer or a tool-call object — never both jammed into prose.
- If a tool was called, you execute it and feed the result back as a new message.
- You call the model again. It either calls another tool or finishes with text.
That is the entire loop. Every modern agent — Claude Code, Cursor, ChatGPT with browsing, your custom MCP-backed assistant — is some version of those four steps. Tool calling did not make the model smarter. It gave the model a clean, structured door to act through, and it gave you a clean, structured handle to attach your code to.
From here on the quest gets concrete: the schema you write, the loops you run, the way different providers shape their tool dialects, and how MCP scales the same idea so that a single server can be reused across every tool-calling client on earth.