The Claude API multi-agent loop, without the framework A developer released an 80-line Python implementation of the Claude API multi-agent loop that exposes the tool-calling cycle without framework abstractions. The open-source project on GitHub includes example agents for research and code tasks, and is designed to be readable, modifiable, and production-ready. Most Claude API tutorials show a single tool call. Most frameworks hide the loop behind abstractions you can't read. This post shows the loop directly — what actually happens between "Claude requests a tool" and "Claude finishes." When you give Claude tools, a single API call isn't always enough. Claude decides whether to call a tool, you execute it, then you send the result back. Claude might call another tool, or it might answer. That cycle is the agent loop. user message ↓ Claude responds ↓ stop reason == "tool use"? → execute tools → back to Claude ↓ stop reason == "end turn" ↓ return final text The entire loop is in agent.py https://github.com/espanhol6/claude-multiagent-loop/blob/main/agent.py — about 80 lines. python def run agent system: str, user message: str, tools: list dict , tool handlers: dict str, Callable , max rounds: int = 10, - str: messages = {"role": "user", "content": user message} for round num in range max rounds : response = client.messages.create model=MODEL, max tokens=4096, system=system, tools=tools, messages=messages, messages.append {"role": "assistant", "content": response.content} if response.stop reason == "end turn": return extract text response.content if response.stop reason == "tool use": tool results = for block in response.content: if block.type == "tool use": result = call tool block, tool handlers tool results.append { "type": "tool result", "tool use id": block.id, "content": json.dumps result , } messages.append {"role": "user", "content": tool results} continue break return extract text response.content That's the core. The rest of the file is call tool dispatch to your Python function and extract text pull text blocks from the response . Define tools in Anthropic's schema format: TOOLS = { "name": "read file", "description": "Read the contents of a file.", "input schema": { "type": "object", "properties": { "path": {"type": "string", "description": "File path to read"}, }, "required": "path" , }, }, Define handlers as plain Python functions: php def read file path: str - dict: return {"content": Path path .read text } tool handlers = {"read file": read file} Run the agent: result = run agent system="You are a helpful assistant.", user message="What's in README.md?", tools=TOOLS, tool handlers=tool handlers, Frameworks aren't wrong. But when something breaks in production — and it will — you want to know exactly what message went to Claude and exactly what came back. Abstractions make that harder. This implementation is meant to be read, modified, and owned. The loop is visible. You can add logging, approval gates, retry logic, or conditional execution exactly where you need it. The repo includes: example research.py search and read page tools swap in your real implementations example code.py read file , write file , and list files toolsBoth run end-to-end with real Claude API calls. pip install anthropic export ANTHROPIC API KEY=sk-ant-... python example code.py The repo: github.com/espanhol6/claude-multiagent-loop https://github.com/espanhol6/claude-multiagent-loop This pattern is what I used as the foundation for Cluster OS Jarvis https://github.com/espanhol6 — a production multi-agent framework with SSE streaming, up to 6 tool-calling rounds, and cron-scheduled autonomous agents. The loop here is the simplified, standalone version. If you're building something with Claude and want to understand what's happening under the hood before adding abstractions, this is a good starting point. João Daniel Espanhol Miguel https://linkedin.com/in/jo%C3%A3o-espanhol-miguel — AI engineer, Lisbon. Also wrote about debugging a silent native crash in ctranslate2 + WinRT https://dev.to/espanhol/debugging-a-silent-native-crash-when-combining-faster-whisper-and-winrt-on-windows-2ik9 .