The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Chromeflow listing page.
Let your AI coding agent (Claude Code or Codex CLI) drive your real Chrome — clicks, fills forms, grabs API keys, writes them to .env.
Install · Tools · Website · Security
The problem: Playwright, Browser Use, and Puppeteer launch a fresh empty browser every time — no cookies, no sessions, no 2FA. Your AI agent gets stuck at the first login screen.
Chromeflow: drives your actual Chrome, where you're already logged into Stripe, AWS, Supabase, Canvas, GitHub. The agent automates what it can (clicks, fills, uploads, captures keys) and pauses for anything that needs you (passwords, 2FA, payment). One MCP server, 30 browser tools, works with both Claude Code and Codex CLI.
Battle-tested: shaped by 400+ hours of real agentic browser work before public release — every gnarly edge case (React Selects, isTrusted-gated forms, shadow-DOM clicks, page-CSP fetches, silent redirects, cookie leaks, 0×0 hidden elements) is in the error-handling recipes. Not a weekend hackathon project.
Existing browser automation tools (Playwright, Browser Use, Puppeteer) launch a fresh, empty browser — no cookies, no sessions, no extensions. Every time they start, you're logged out of everything and can't handle 2FA.
Chromeflow works in your actual Chrome browser, where you're already logged into Stripe, AWS, Supabase, and everything else. Claude automates what it can (clicking buttons, filling forms, uploading files) and pauses for anything that needs you (passwords, 2FA, payment details).
| Chromeflow | Playwright / Browser Use | |
|---|---|---|
| Browser | Your real Chrome (sessions intact) | Fresh instance, logged out of everything |
| Auth / 2FA | Already handled — pauses when needed | Can't handle — blocks completely |
| Page understanding | DOM queries (fast, cheap, reliable) | Screenshots + vision model (slow, expensive) |
| Human-in-the-loop | Highlights, pauses on sensitive input | Fully autonomous, no interaction |
| Integration | MCP server for Claude Code & Codex CLI | Standalone, not agent-aware |
| Credential capture | Reads API keys → writes to .env | Not designed for this |
Tested end-to-end against the live platform before every release. Procedures live in tests/antibot/platforms/; the validated-against page at chromeflow.run/validated auto-updates from tests/antibot/last-run.json on each run.
| Platform | What's validated | Status |
|---|---|---|
| CDP click expands faceplate-* composer (PointerEvent isPrimary=true) | 🟢 Working (2026-05-25) | |
type_text lands multi-paragraph text in Lexical with <p> structure preserved | 🟢 Working (2026-05-25) | |
type_text lands isTrusted=true CDP keys in Lexical | 🟢 Working (2026-05-25) | |
click_element("Start a post") + type_text into Quill editor | 🟢 Working (2026-05-25) | |
Click composer trigger + type_text into Lexical modal | 🟢 Working (2026-05-25) | |
fill_input via React-aware native value setter | 🟢 Working (2026-05-25) | |
click_element(in_dialog=true) scopes uniquely to the open dialog | 🟢 Working (2026-05-25) | |
find_text pierces Stencil closed shadow roots via chrome.dom API | 🟢 Working (2026-05-25) | |
type_text lands in contenteditable; auto-recovery on silent-drop | 🟢 Working (2026-05-25) |
Submit handoff (by design). Reddit, X, LinkedIn, Facebook, Instagram all gate their submit buttons on a real isTrusted human gesture as part of their anti-bot stack. Chromeflow lands the typing path (which is what an agent actually needs) and then uses highlight_region + wait_for_click so the user clicks Submit themselves.
Why this is the moat. Playwright, Puppeteer, browser-use, crawl4ai all launch a fresh logged-out browser. They can't see your sessions, and the isTrusted-strict checks on these platforms reject their vanilla CDP clicks. Chromeflow runs in your real logged-in Chrome with a humanlike bezier + PointerEvent isPrimary=true click sequence; the validated-against table above shows what that gets you in practice. See /validated for the side-by-side comparison.
Chromeflow is two things that work together:
open_page, click_element, fill_form, set_file_input, get_page_text, write_to_env, etc.)Claude drives the flow. You only touch the browser for things that genuinely need you — login, passwords, payment details, personal choices.
1. Install the plugin (one-time, machine-wide):
Run these inside Claude Code. The plugin registers the MCP server, pre-approves Chromeflow tools, and ships the usage skill — no per-project setup needed.
2. Install the Chrome extension (one time):
chromewebstore.google.com/detail/chromeflow/lkdchdgkbkodliefobkkhiegjdiidime — click Add to Chrome.
The extension persists across Chrome restarts. You only do this once.
3. Restart Claude Code.
That's it. Claude will automatically reach for Chromeflow whenever a task needs browser interaction, in any project. The plugin's SessionStart hook also cleans up any stale config left over from older npx chromeflow setup-based installs on first run.
1. Install the plugin (one-time, machine-wide):
Then inside Codex:
The plugin registers the MCP server and ships the same usage skill that Claude Code uses, host-adjusted for Codex.
2. Install the Chrome extension (one time) — same Web Store link as above. The extension is host-agnostic and serves both Claude Code and Codex from the same install.
3. Restart Codex.
Codex will reach for Chromeflow on browser tasks the same way Claude Code does.
Just ask Claude normally:
"Set up Stripe for this project — create a product with monthly and annual pricing, capture the price IDs into .env"
"Go to Supabase and get my project's anon key and service role key"
"Help me configure SendGrid webhooks for this app"
Claude will navigate, highlight steps, click what it can, pause for anything sensitive, and write values to your .env automatically.
| Capability | Tools |
|---|---|
| Navigate pages, open new tabs | open_page, list_tabs, switch_to_tab |
| Click buttons and links | click_element (with nth for duplicates) |
| Fill single fields | fill_input (with nth for duplicates) |
| Fill multiple fields in one call | fill_form |
| Upload files (even hidden inputs) | set_file_input |
| Read page content as text | get_page_text (with selector scoping) |
| Inspect all form fields | get_form_fields |
| Scroll to a known element | scroll_to_element |
| Highlight elements for the user | highlight_region |
| Wait for the user to click | wait_for_click |
| Wait for async changes | wait_for |
| Run arbitrary JS | execute_script |
| Read browser console output | get_console_logs |
Capture credentials to .env | get_page_text, write_to_env |
Screenshot (Claude-only by default; pass copy_to_clipboard / save_to to share) | take_screenshot |
| Screenshot the terminal window | capture_terminal |
set_file_input uses Chrome DevTools Protocol to bypass the browser's file-input script restriction — the same mechanism used by Playwright and Puppeteer. It works even when the <input type=file> is hidden behind a custom drag-and-drop zone.
capture_terminal screenshots the terminal window (Terminal, iTerm2, Warp, VS Code, Ghostty, etc.) and saves it as a PNG. Use this with set_file_input to upload terminal output to a web form.
Click the Chromeflow extension icon and use "Use this window for Claude" to lock Claude's browser operations to a specific Chrome window. This lets you freely use other Chrome windows without Claude interfering.
Chromeflow supports up to 11 agent sessions (Claude Code, Codex, or a mix) running in parallel, each automating a different Chrome window without touching the others.
How it works:
7878-7888 (first session gets 7878, second gets 7879, etc.).Setup:
That's it. Each session now drives its own Chrome window — you can run a research task in one window while the other session fills out a Stripe dashboard in another, with zero collision.
Single-instance usage is unchanged and fully backwards compatible — the old per-window assignment is auto-migrated on first load.
Nothing to do — the plugin install above is machine-wide. Open any project and Chromeflow is ready.
In Claude Code:
In Codex:
Restart the host afterward to pick up the new MCP server binary the plugin ships.
npx chromeflow setup flowIf you previously installed Chromeflow via npx chromeflow setup, do nothing — install the plugin (Setup step 1 above) and the plugin's first SessionStart cleans up:
mcpServers.chromeflow entry in ~/.claude.json## Chromeflow section in ~/.claude/CLAUDE.mdPer-project CLAUDE.md files and .claude/settings.local.json allowlists are left alone — they may have content you want to keep, so the plugin won't touch them. You can delete the # Chromeflow — Claude Instructions section from each project's CLAUDE.md by hand whenever it's convenient (the plugin's skill carries the same content now), or just leave it.
The MCP server source lives at packages/mcp-server/src/ and is bundled with esbuild into packages/plugin/server/chromeflow.mjs — a single-file ESM binary the plugin ships directly.
Iterate locally by pointing the plugin at this checkout. In Claude Code:
In Codex:
Rebuild the bundle after editing MCP server source, then /reload-plugins (Claude Code) or restart the host (Codex) to pick it up.
The Chrome extension lives at packages/extension/:
After rebuilding the extension, reload it from chrome://extensions.