Agents, MCP and skillsLoading progress…

The tool-call loop

Trace a model-requested tool call through schema validation, execution and a returned observation.

The tool-call loop

The host runs a loop. It sends the conversation and the tool definitions; the model answers with text, or with one or more requested calls; the host validates each call, executes the allowed ones and returns the results; the model continues. The model only proposes. For "Which is warmer, Oslo or Cairo?" two lookups are needed: one at a time that is three model turns, but if both are requested together it is two.

Step 1 of 5
model (turn 1): requests get_weather({city: Oslo})
model turns until the answer: 3 tool executions: 2 each model turn is a separate request to the provider with its own latency and cost; the model never runs the tool, the host does
Step through both versions of the loop.

Predict first. Does the model itself necessarily perform the external operation?

Chapter context

A tool call is a structured request for the application to perform an operation. The model proposes arguments; the surrounding application decides whether the operation is valid and permitted and is responsible for executing it.

Chapter reference: math, worked example & code

This section belongs to the whole chapter, so it is the same on every lesson in it and may cover a different lesson's topic. The code for the experiment you just ran is inside the experiment itself.

Math and notation

A useful execution model is: requested operation + validated arguments + permission decision → execution result. Schema validation establishes a data-shape contract; authorization establishes whether this caller may perform this operation. Neither implies the other.

Worked example

A calculator tool requires numeric a and b and returns a+b. For a=2,b=3, its result is 5. If the request instead asks for an unknown field or omits b, reject or repair the request according to the contract before executing. A retry of this pure calculation is harmless; that does not establish the same property for a side-effecting tool.

Reference code

The following example uses the Python standard library and does not call a remote service.

def add(a,b):
    if type(a) not in (int,float) or type(b) not in (int,float):
        raise ValueError('numeric inputs required')
    return a+b
assert add(2,3) == 5
try:
    add('2',3)
except ValueError:
    pass
else:
    raise AssertionError('invalid input accepted')

Python examples are provided for study and local execution; this page does not execute Python.

Common mistakes

A model proposal is not permission. JSON schema shape validation is not business-rule validation. Tool outputs must not silently become trusted instructions.