A declarative language for multi-agent AI workflows β compile to MCP tools, no code required.
Write complex multi-agent workflows in clean, readable .aflow
files. Each workflow becomes a tool in Claude Code via MCP β zero integration code. Assign different AI models to different agents, run iterative loops, and let agents collaborate with structured output.
workflow code_quality
description: "Iterative code review with writer, tester, and critic"
version: "1.0.0"
agents:
agent writer β model: "local-fast"
agent tester β model: "openrouter-smart"
agent critic β model: "claude-sonnet"
loop quality_gate
phases: [write, test, review]
repeat_while: review.verdict == "needs_work"
max_iterations: 5
done when: review.confidence >= 0.85
| Traditional (LangGraph, CrewAI) | AgentFlow DSL | |
|---|---|---|
| Define workflows | ||
| Python code (~40 lines boilerplate) | .aflow file (~20 lines) |
|
| Multi-model | ||
| Manual provider switching | Per-agent model aliases | |
| MCP integration | ||
| Write MCP server code | Automatic β each workflow = MCP tool | |
| Git-friendly | ||
| Code + config scattered | Single .aflow file |
|
| Reviewable | ||
| Need Python knowledge | Readable by anyone |
npm install -g @anhonestboy/agentflow
agentflow init
Interactive wizard: choose providers (Claude, OpenRouter, Ollama), configure model aliases, save API keys.
Create my-workflow.aflow
:
workflow blog_post
description: "Generate and refine a blog post"
version: "1.0.0"
agents:
agent researcher
mode: patient
must_produce:
- outline
- key_points
agent writer
mode: focused
must_produce:
- draft
- word_count: int
agent editor
mode: adversarial
must_produce:
- verdict
- suggestions
- confidence: float
phases:
phase research
agent: researcher
input: [trigger.topic]
output: [outline, key_points]
phase write
agent: writer
input: [research.outline, research.key_points]
output: [draft, word_count]
phase edit
agent: editor
input: [write.draft]
output: [verdict, suggestions, confidence]
loop revision_cycle
phases: [write, edit]
repeat_while: edit.verdict == "needs_work"
max_iterations: 3
on_each_iteration:
send_to: writer
payload: edit.suggestions
done when: edit.confidence >= 0.8 and edit.verdict == "approved"
agentflow check my-workflow.aflow # Validate
agentflow run my-workflow.aflow --input 'topic="AI in photography"'
agentflow mcp-config
Copy the JSON output to your Claude Code MCP settings. Your workflow is now a tool β call it directly from Claude Code.
| Provider | Status | Notes |
|---|---|---|
| Claude (Anthropic) | ||
| β | Native SDK, multi-round tool use | |
| OpenRouter | ||
| β | 315+ models, automatic provider routing | |
| Ollama | ||
| β | Local execution, no API key needed |
Configure model aliases for cost optimization β use cheap models for drafting, frontier models for review:
{
"models": {
"local-fast": { "provider": "ollama", "model": "qwen3:8b" },
"openrouter-smart": { "provider": "openrouter", "model": "google/gemini-2.5-flash" },
"claude-sonnet": { "provider": "claude", "model": "claude-sonnet-4-5" }
}
}
agentflow init # Interactive setup wizard
agentflow check <file> # Validate workflow + summary
agentflow run <file> --input 'β¦' # Execute with real LLMs
agentflow run <file> --mock # Execute with mock agents (no API key needed)
agentflow compile <file> # Compile to IR JSON
agentflow validate <file> # Validate only (no summary)
agentflow mcp-config # Print MCP server config for Claude Code
agentflow models # List configured models + connectivity
agentflow resume <file> --instance <uuid> # Resume interrupted workflow
agent <id>
model: "<alias>" # Model alias from config (default: "auto")
mode: <mode> # focused | adversarial | reliable | precise | strict | patient | objective
tools: [<name>, ...] # Built-in tools: file_write, file_read, shell_exec, test_runner
must_produce:
- <name> # Required output field (string)
- <name>: float # Typed output field
constraint: "<rule>" # Natural language constraint
phase <id>
agent: <agent_id>
input: [<ref>, ...] # trigger.field or phase_id.output
output: [<name>, ...]
inject_context: "<path>" # Optional: inject file content into agent context
timeout: 30min # For human_action_required phases
loop <id>
phases: [<phase_id>, ...]
repeat_while: <condition> # review.verdict == "needs_work"
max_iterations: <n>
on_each_iteration:
send_to: <agent_id>
payload: <ref> # Feedback to inject
on_max_exceeded:
escalate_to: <agent_id>
message: "<...>"
review.confidence >= 0.85
review.verdict == "approved" and review.confidence >= 0.85
not (review.verdict == "needs_work")
.aflow file
β
βΌ
Tokenizer βββΊ Parser βββΊ Compiler (AST β IR)
β
βββββββββββΌβββββββββββ
β Validator (S1-S10) β
βββββββββββ¬βββββββββββ
β
βββββββββββΌβββββββββββ
β WorkflowRunner β
β βββββββββββββββββ β
β β ExecutorResolverβ β
β β ββββββββββββββββ β
β β β Claude ββ β
β β β OpenRouter ββ β
β β β Ollama ββ β
β β ββββββββββββββββ β
β βββββββββββββββββ β
βββββββββββ¬βββββββββββ
β
βββββββββββΌβββββββββββ
β MCP Server β
β (stdio JSON-RPC) β
βββββββββββ¬βββββββββββ
β
Claude Code / Cursor
| File | Description |
|---|---|
examples/blog-post.aflow |
|
| Researcher β writer β editor with revision loop | |
examples/code-quality.aflow |
|
| Writer β tester β critic with quality gate loop | |
examples/code-quality-with-plan.aflow |
|
| Extended with planning phase | |
examples/custom-domain.aflow |
|
| 7-phase domain provisioning workflow |
git clone https://github.com/anhonestboy/agentflow.git
cd agentflow
npm install
npm run build
npm test # 92 tests, 6 suites
npm run dev -- check examples/code-quality.aflow
v1.1β VS Code extension (syntax highlighting, LSP)** v1.2**β Parallel phase execution** v1.3**β Workflow registry & sharing** v2.0**β Web visualizer, CI/CD integration
MIT β see LICENSE for details.