Agents, MCP and skillsLoading progress…

Structured outputs

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

Structured outputs

A schema can make the model's output well-shaped: parseable JSON with the right keys and types. It cannot make it true. Reading "Two blue mugs at 8.50 each" as quantity 3 passes every shape check. So validate in layers: parse, check shape, then check domain constraints and compare values with the source. Treat anything coming from tools or documents as data, never as new authority over your application.

source: "Two blue mugs at 8.50 each, ship to Lyon." model output: {"item":"blue mug","quantity":3,"unit_price":8.5}
quantity: unit price:
1. parses as JSON: yes 2. shape (types and ranges): pass 3. matches the source (quantity 2, price 8.5): quantity_mismatch implied total 25.5 correct total 17

Passing a schema proves only the shape. Quantity 3 for "two mugs" is valid JSON and still wrong, so check values against the source and treat tool output as data, not as new instructions.

Change the quantity and price and watch which check catches it.

Predict first. Can valid JSON contain an unsupported claim?

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.