Tool Interfaces
Structured action: name, description, schema. Function calling, MCP, bash, grep. The model stops describing work and starts requesting it.
Tools give the model a way to act. This is the moment the agent stops being a talker: instead of describing the work, it requests it — as a structured action the harness can execute.
The contract
A tool has a name, a description, and a schema for its arguments — sometimes an output schema too. The model's side of the contract is a decision: "I should call this tool, with these arguments." The harness's side is everything after that.
{
"name": "run_tests",
"description": "Run the project test suite, optionally scoped to a path",
"input_schema": {
"type": "object",
"properties": {
"path": { "type": "string", "description": "Test file or directory" },
"watch": { "type": "boolean", "default": false }
}
}
}
That schema is doing real harness work. It constrains what the model can express, catches malformed requests before they execute, and gives the description — which is really a tiny instruction — a place to teach the model when this tool is appropriate.
You're using this primitive whenever you touch:
- Function calling / tool use — the raw API mechanism from every model provider
- MCP (Model Context Protocol) — a standard way for any service to expose its tools to any agent; the reason the ecosystem exploded
- The built-ins — bash, grep, find, file read/write in coding agents
Choosing an action is not the same as performing it safely
Say the model correctly decides: run the test command. Immediately, harder questions appear — and none of them are the model's to answer:
- Where? On your laptop? In a container? A cloud sandbox?
- With what? Network access? Secrets? Write access to the whole repo?
- And the output — tools fail, return messy text, or partial data. Web pages can carry prompt injection. How much do we trust what comes back?
The model chose a valid tool with valid arguments — but the operational question of where this runs and under what boundaries belongs to a different layer entirely.