Agents, MCP and skillsLoading progress…

Side effects and identity

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

Side effects and identity

Tools differ in what they change. A read can be repeated freely. A write (send an email) or a payment changes the world each time. If a send succeeds but the confirmation times out, a sensible model retries, and the email goes out twice. Give each logical request an identifier (an idempotency key) so the host recognises the repeat and ignores it, and gate irreversible actions behind approval.

Attempt 1 of 2
attempt 1: send_email([email protected], "Build") → email delivered, but the server never confirms: TIMEOUT
emails delivered: 2 ← a duplicate: the retry was not safe reads can be repeated freely; writes and payments need a request identifier that the host remembers
Toggle the timeout and the idempotency key.

Predict first. Can retrying a purchase tool accidentally buy twice?

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.