# Build the Loop from Scratch — Agent Frameworks and MCP Basics

Source: https://www.geekswithgeeks.com/en/agent-frameworks-mcp/af-loop-from-scratch

> Write a minimal agent loop with the Anthropic Python SDK and a step limit.

## Fifty lines, no framework

The core of every framework is a loop: call the model, if it asked for tools run them and append the results, repeat until it answers in plain text. Writing it once yourself shows you exactly what frameworks automate.

## A minimal agent loop

`TOOLS` is the schema list and `run_tool` dispatches to your Python functions. The `range(10)` cap prevents an endless loop. Use the current model ID from your provider's docs.

```python
import anthropic
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Weather in Pune?"}]

for _ in range(10):                      # step limit
    resp = client.messages.create(
        model="claude-sonnet-5-5", max_tokens=1024,
        tools=TOOLS, messages=messages)
    messages.append({"role": "assistant", "content": resp.content})
    if resp.stop_reason != "tool_use":
        break                            # final answer
    results = [
        {"type": "tool_result", "tool_use_id": b.id,
         "content": run_tool(b.name, b.input)}
        for b in resp.content if b.type == "tool_use"
    ]
    messages.append({"role": "user", "content": results})

print(resp.content[0].text)
```

## Always keep a cap

Without a step limit, a confused model can call tools forever. Add limits for steps, time and money from the very first version.

**Quiz:** When does the loop in the example stop on success?

- [x] When stop_reason is not "tool_use"
- [ ] After exactly one call
- [ ] Never
- [ ] When the user closes the tab

*Answer:* When stop_reason is not "tool_use". A reply that is not a tool request is the model's final answer.
