Tools

In a model-driven agent, tools are everything the agent can actually do — the model supplies the reasoning, the tools supply the capability. Strands makes defining them almost trivial (decorate a Python function) and plugs into MCP's large ecosystem, so equipping an agent well becomes the developer's main lever.

The agent loop needs tools for the model to act. This post covers tools in Strands: how you define them (a decorated Python function), the built-in tools and MCP ecosystem, and why — in a model-driven framework specifically — tool quality is the developer’s primary point of leverage. If the model drives, the tools are what it drives with.

Tools are decorated Python functions

Strands makes tool definition minimal, consistent with its whole philosophy: a tool is a Python function you decorate, and the SDK generates what the model needs from the function’s signature and docstring:

# Illustrative shape — see the Strands docs for exact API.
from strands import tool

@tool
def get_weather(city: str) -> str:
    """Get the current weather for a city."""
    return fetch_weather(city)   # your implementation

As with the other typed-function-as-tool frameworks (the Pydantic AI and LangChain tools posts), you don’t hand-write a JSON schema — Strands derives the tool’s interface from the type hints, and the docstring becomes the description the model uses to decide when to call it. So a Strands tool is just a well-typed, well-documented Python function registered with the agent. This minimalism matters: because the model drives, adding a capability should be as frictionless as writing a function, and it is.

The same tool-design disciplines from across the blog apply, and they matter more here because the model relies entirely on tool descriptions to plan:

Built-in tools and MCP

Beyond your own functions, Strands gives an agent capabilities two other ways:

The combination — trivial custom tools, built-in tools, and the MCP ecosystem — means equipping a Strands agent is largely assembling capabilities (some yours, many pre-built) rather than building each from scratch. For a model-driven agent, this is exactly what you want: a rich, easily-assembled toolset for the model to draw on.

Why tools are the developer’s main lever

Here’s the point specific to model-driven frameworks: because the model drives, tools are the developer’s primary lever on what the agent can accomplish. In a workflow-first framework, you shape the agent through the workflow you author; in Strands, you don’t author the workflow — so your leverage is elsewhere, and it’s mostly in the tools you provide (and the prompt). The model can only do what its tools let it do, and it chooses among tools based on their descriptions, so:

So in Strands, “programming the agent” is largely (a) writing the system prompt and (b) equipping it with good tools. The tools aren’t just a feature — they’re the main thing you control in a model-driven design, which is why this post matters more than a “tools” post would in a workflow-first framework. Equip the model well, and the model-driven approach flourishes; equip it poorly, and no amount of model capability compensates.

Tools and reliability

The tool layer is also where several reliability concerns live (detailed in the production post):

The theme: tools are the agent’s hands, and in a model-driven framework the model wields them autonomously — so giving it good, safe, well-described, observable tools is both the main lever of capability and a key locus of reliability. The next post covers the other swappable ingredient: the model providers behind the agent.

Key takeaways

Further reading

Sources & References