flyto-core

Deterministic execution engine for AI agents. 412 MCP tools across 78 categories — browser, file, Docker, data, crypto, scheduling, and more.

flyto-core

PyPI version License Python 3.9+

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

CategoryCountExamples
browser.*38launch, goto, click, extract, screenshot, fill forms, wait
flow.*24switch, loop, branch, parallel, retry, circuit breaker, rate limit
array.*15filter, sort, map, reduce, unique, chunk, flatten
string.*11reverse, uppercase, split, replace, trim, slugify, template
api.*11OpenAI, Anthropic, Gemini, Notion, Slack, Telegram
object.*10keys, values, merge, pick, omit, get, set, flatten
image.*9resize, convert, crop, rotate, watermark, OCR, compress
data.*8json/xml/yaml/csv parse and generate
file.*8read, write, copy, move, delete, exists, edit, diff
stats.*8mean, median, percentile, correlation, standard deviation
validate.*7email, url, json, phone, credit card
docker.*6run, ps, logs, stop, build, inspect
archive.*6zip create/extract, tar create/extract, gzip, gunzip
math.*6calculate, round, ceil, floor, power, abs
k8s.*5get_pods, apply, logs, scale, describe
crypto.*4AES encrypt/decrypt, JWT create/verify
network.*4ping, traceroute, whois, port scan
pdf.*4parse, extract text, merge, compress
aws.s3.*4upload, download, list, delete
google.*4Gmail send/search, Calendar create/list events
cache.*4get, set, delete, clear (memory + Redis)
ssh.*3remote exec, SFTP upload, SFTP download
git.*3clone, commit, diff
sandbox.*3execute Python, Shell, JavaScript
dns.*1DNS lookup (A, AAAA, MX, CNAME, TXT, NS)
monitor.*1HTTP health check with SSL cert verification

See the Full Module Catalog for every module, parameter, and description.


How is this different?

Pain pointShell scriptsn8n / Zapierflyto-core
Step 8 fails, what now?Re-run everythingRe-run from UI (partial)flyto replay --from-step 8
What happened at step 3?Add print()Check run logFull trace: input, output, timing
Need browser + API + file I/O3 languages, glue codeInstall 5 pluginsAll built-in (412 modules)
Share with team"Clone my repo"Share org account ($$$)pip install flyto-core
Run headless in CIFragile bash + puppeteerNot designed for CIflyto run workflow.yaml
Setup time30 minSaaS signup + connectpip 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
EndpointPurpose
POST /v1/workflow/runExecute workflow with evidence + trace
POST /v1/workflow/{id}/replay/{step}Replay from any step
POST /v1/executeExecute a single module
GET /v1/modulesDiscover all modules
POST /mcpMCP 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