flyto-core
Deterministic execution engine for AI agents. 412 MCP tools across 78 categories — browser, file, Docker, data, crypto, scheduling, and more.
flyto-core
A workflow engine with 412 built-in modules. Trace every step. Replay from any point.
pip install flyto-core[browser] && playwright install chromium
flyto recipe competitor-intel --url https://github.com/pricing
12 steps run. Screenshots captured. Performance metrics extracted. JSON report saved. Zero Python scripts.
What happens when step 8 fails?
With a shell script you re-run the whole thing — re-launch the browser, re-navigate, re-extract. With flyto-core, every step records its input, output, and timing into an execution trace. When step 8 fails, you replay from step 8 with the original context — the first 7 steps are instant.
flyto replay workflow-trace.json --from-step 8
This is the difference between a script and an engine.
Install
pip install flyto-core # Core engine + CLI + MCP server
pip install flyto-core[browser] # + browser automation (Playwright)
playwright install chromium # one-time browser setup
The 85-line problem
Here's what competitive pricing analysis looks like in Python:
Python — 85 lines
import asyncio, json, time
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto("https://competitor.com/pricing")
# Extract pricing
prices = await page.evaluate("""() => {
const cards = document.querySelectorAll(
'[class*="price"]'
);
return Array.from(cards).map(
c => c.textContent.trim()
);
}""")
# Desktop screenshot
await page.screenshot(
path="desktop.png", full_page=True
)
# Mobile
await page.set_viewport_size(
{"width": 390, "height": 844}
)
await page.screenshot(
path="mobile.png", full_page=True
)
# Performance
perf = await page.evaluate("""() => {
const nav = performance
.getEntriesByType('navigation')[0];
return {
ttfb: nav.responseStart,
loaded: nav.loadEventEnd
};
}""")
# Save report
report = {
"prices": prices,
"performance": perf,
}
with open("report.json", "w") as f:
json.dump(report, f, indent=2)
await browser.close()
asyncio.run(main())
flyto-core — 12 steps
name: Competitor Intel
steps:
- id: launch
module: browser.launch
- id: navigate
module: browser.goto
params: { url: "{{url}}" }
- id: prices
module: browser.evaluate
params:
script: |
JSON.stringify([
...document.querySelectorAll(
'[class*="price"]'
)
].map(e => e.textContent.trim()))
- id: desktop_shot
module: browser.screenshot
params: { path: desktop.png, full_page: true }
- id: mobile
module: browser.viewport
params: { width: 390, height: 844 }
- id: mobile_shot
module: browser.screenshot
params: { path: mobile.png, full_page: true }
- id: perf
module: browser.performance
- id: save
module: file.write
params:
path: report.json
content: "${prices.result}"
- id: close
module: browser.close
No trace. No replay. No timing. If step 5 fails, re-run everything.
Full trace. Replay from any step. Per-step timing. Every run is debuggable.
flyto recipe competitor-intel --url https://github.com/pricing
Step 1/12 browser.launch ✓ 420ms
Step 2/12 browser.goto ✓ 1,203ms
Step 3/12 browser.evaluate ✓ 89ms
Step 4/12 browser.screenshot ✓ 1,847ms → saved intel-desktop.png
Step 5/12 browser.viewport ✓ 12ms → 390×844
Step 6/12 browser.screenshot ✓ 1,621ms → saved intel-mobile.png
Step 7/12 browser.viewport ✓ 8ms → 1280×720
Step 8/12 browser.performance ✓ 5,012ms → Web Vitals captured
Step 9/12 browser.evaluate ✓ 45ms
Step 10/12 browser.evaluate ✓ 11ms
Step 11/12 file.write ✓ 3ms → saved intel-report.json
Step 12/12 browser.close ✓ 67ms
✓ Done in 10.3s — 12/12 steps passed
Output: intel-report.json (1,204 bytes)
Engine Features
This is what makes flyto-core an engine, not a script runner:
- Execution Trace — structured record of every step: input, output, timing, status
- Replay — re-execute from any step with the original (or modified) context
- Breakpoints — pause execution at any step, inspect state, resume
- Evidence Snapshots — full state before and after each step boundary
- Data Lineage — track data flow across steps, build dependency graphs
- Timeout Guard — configurable workflow-level and per-step timeout protection
412 Modules, 78 Categories
| Category | Count | Examples |
|---|---|---|
browser.* | 38 | launch, goto, click, extract, screenshot, fill forms, wait |
flow.* | 24 | switch, loop, branch, parallel, retry, circuit breaker, rate limit |
array.* | 15 | filter, sort, map, reduce, unique, chunk, flatten |
string.* | 11 | reverse, uppercase, split, replace, trim, slugify, template |
api.* | 11 | OpenAI, Anthropic, Gemini, Notion, Slack, Telegram |
object.* | 10 | keys, values, merge, pick, omit, get, set, flatten |
image.* | 9 | resize, convert, crop, rotate, watermark, OCR, compress |
data.* | 8 | json/xml/yaml/csv parse and generate |
file.* | 8 | read, write, copy, move, delete, exists, edit, diff |
stats.* | 8 | mean, median, percentile, correlation, standard deviation |
validate.* | 7 | email, url, json, phone, credit card |
docker.* | 6 | run, ps, logs, stop, build, inspect |
archive.* | 6 | zip create/extract, tar create/extract, gzip, gunzip |
math.* | 6 | calculate, round, ceil, floor, power, abs |
k8s.* | 5 | get_pods, apply, logs, scale, describe |
crypto.* | 4 | AES encrypt/decrypt, JWT create/verify |
network.* | 4 | ping, traceroute, whois, port scan |
pdf.* | 4 | parse, extract text, merge, compress |
aws.s3.* | 4 | upload, download, list, delete |
google.* | 4 | Gmail send/search, Calendar create/list events |
cache.* | 4 | get, set, delete, clear (memory + Redis) |
ssh.* | 3 | remote exec, SFTP upload, SFTP download |
git.* | 3 | clone, commit, diff |
sandbox.* | 3 | execute Python, Shell, JavaScript |
dns.* | 1 | DNS lookup (A, AAAA, MX, CNAME, TXT, NS) |
monitor.* | 1 | HTTP health check with SSL cert verification |
See the Full Module Catalog for every module, parameter, and description.
How is this different?
| Pain point | Shell scripts | n8n / Zapier | flyto-core |
|---|---|---|---|
| Step 8 fails, what now? | Re-run everything | Re-run from UI (partial) | flyto replay --from-step 8 |
| What happened at step 3? | Add print() | Check run log | Full trace: input, output, timing |
| Need browser + API + file I/O | 3 languages, glue code | Install 5 plugins | All built-in (412 modules) |
| Share with team | "Clone my repo" | Share org account ($$$) | pip install flyto-core |
| Run headless in CI | Fragile bash + puppeteer | Not designed for CI | flyto run workflow.yaml |
| Setup time | 30 min | SaaS signup + connect | pip install flyto-core |
How to Use
# Run a built-in recipe
flyto recipe site-audit --url https://example.com
# Run your own YAML workflow
flyto run my-workflow.yaml
# List all recipes
flyto recipes
pip install flyto-core
claude mcp add flyto-core -- python -m core.mcp_server
Or add to your MCP config:
{
"mcpServers": {
"flyto-core": {
"command": "python",
"args": ["-m", "core.mcp_server"]
}
}
}
Your AI gets all 412 modules as tools.
pip install flyto-core[api]
flyto serve
# ✓ flyto-core running on 127.0.0.1:8333
| Endpoint | Purpose |
|---|---|
POST /v1/workflow/run | Execute workflow with evidence + trace |
POST /v1/workflow/{id}/replay/{step} | Replay from any step |
POST /v1/execute | Execute a single module |
GET /v1/modules | Discover all modules |
POST /mcp | MCP Streamable HTTP transport |
import asyncio
from core.modules.registry import ModuleRegistry
async def main():
result = await ModuleRegistry.execute(
"string.reverse",
params={"text": "Hello"},
context={}
)
print(result) # {"ok": True, "data": {"result": "olleH"}}
asyncio.run(main())
30+ Built-in Recipes
No code required — every recipe is a YAML workflow template:
flyto recipes # List all recipes
# Audit & Testing
flyto recipe full-audit --url https://example.com
flyto recipe competitor-intel --url https://github.com/pricing
flyto recipe site-audit --url https://example.com
flyto recipe web-perf --url https://example.com
flyto recipe login-test --url https://myapp.com/login --username user --password pass --success_selector .dashboard
flyto recipe form-fill --url https://myapp.com/form --data '{"email":"test@example.com"}'
# Browser Automation
flyto recipe screenshot --url https://example.com
flyto recipe responsive-report --url https://example.com
flyto recipe page-to-pdf --url https://example.com
flyto recipe visual-snapshot --url https://example.com
flyto recipe webpage-archive --url https://example.com
flyto recipe scrape-page --url https://example.com --selector h1
flyto recipe scrape-links --url https://example.com
flyto recipe scrape-table --url https://en.wikipedia.org/wiki/YAML --selector .wikitable
flyto recipe stock-price --symbol AAPL
# Data & Image
flyto recipe ocr --input scan.png
flyto recipe csv-to-json --input data.csv
flyto recipe image-resize --input photo.jpg --width 800
flyto recipe image-convert --input photo.png --format webp
# Network & DevOps
flyto recipe port-scan --host example.com
flyto recipe whois --domain example.com
flyto recipe monitor-site --url https://myapp.com
flyto recipe docker-ps
flyto recipe git-changelog
# Integrations
flyto recipe scrape-to-slack --url https://example.com --selector h1 --webhook $SLACK_URL
flyto recipe github-issue --url https://example.com --owner me --repo my-app --title "Bug" --token $GITHUB_TOKEN
Each recipe is a YAML workflow template. Run flyto recipe <name> --help for full options.
See docs/RECIPES.md for full documentation.
Write Your Own Workflows
Recipes are just YAML files. Write your own:
name: price-monitor
steps:
- id: open
module: browser.launch
params: { headless: true }
- id: page
module: browser.goto
params: { url: "https://competitor.com/pricing" }
- id: prices
module: browser.evaluate
params:
script: |
JSON.stringify([...document.querySelectorAll('.price')].map(e => e.textContent))
- id: save
module: file.write
params: { path: "prices.json", content: "${prices.result}" }
- id: close
module: browser.close
flyto run price-monitor.yaml
Every run produces an execution trace and state snapshots. If step 3 fails, replay from step 3 — no re-running the whole thing.
For Module Authors
from core.modules.registry import register_module
from core.modules.schema import compose, presets
@register_module(
module_id='string.reverse',
version='1.0.0',
category='string',
label='Reverse String',
description='Reverse the characters in a string',
params_schema=compose(presets.INPUT_TEXT(required=True)),
output_schema={'result': {'type': 'string', 'description': 'Reversed string'}},
)
async def string_reverse(context):
text = str(context['params']['text'])
return {'ok': True, 'data': {'result': text[::-1]}}
See Module Specification for the complete guide.
Contributing
We welcome contributions! See CONTRIBUTING.md for guidelines.
Security
Report security vulnerabilities via security@flyto.dev. See SECURITY.md for our security policy.
License
Apache License 2.0 — free for personal and commercial use.
Related Servers
Scout Monitoring MCP
sponsorPut performance and error data directly in the hands of your AI assistant.
Alpha Vantage MCP Server
sponsorAccess financial market data: realtime & historical stock, ETF, options, forex, crypto, commodities, fundamentals, technical indicators, & more
MCP Memory Keeper
A server for persistent context management in Claude AI coding assistants, using a local SQLite database for storage.
Pulsar Edit MCP Server
An experimental MCP server to control the Pulsar editor, enabling LLM assistance for software development.
ts-morph Refactoring Tools
Refactor TypeScript and JavaScript codebases using ts-morph. Supports renaming symbols and files, moving symbols, and searching for references.
Tmux MCP Server
Provides persistent shell execution through tmux sessions.
Photon
A TypeScript framework that turns a single class into an MCP server, CLI tool, and web dashboard with a marketplace of 35 ready-made photons.
Unity MCP
Perform actions in the Unity Editor for game development using AI clients.
Facets Module
Create and manage Terraform modules for cloud-native infrastructure using the Facets.cloud FTF CLI.
Juspay MCP Tools
Interact with Juspay APIs for payment processing and merchant dashboard management.
MalwareAnalyzerMCP
Execute terminal commands for malware analysis. Requires Node.js 18 or higher.
AI Counsel
True deliberative consensus MCP server where AI models debate and refine positions across multiple rounds