{"slug": "show-hn-browserforge-ai-agents-use-your-real-browser-you-approve-the-clicks", "title": "Show HN: BrowserForge – AI agents use your real browser, you approve the clicks", "summary": "BrowserForge, a local-first Firefox and Chrome extension paired with an MCP server, launched for Claude Code, OpenAI Codex and other MCP clients, letting AI agents operate inside a user's real browser session while requiring a human click to approve consequential actions such as submits, payments, password entry and uploads. The tool runs entirely on 127.0.0.1 with no cloud service or API credits, requires Node.js 22 or newer, and captures observed traffic to generate an OpenAPI 3.1 spec plus Python, TypeScript, JavaScript and PHP clients, labeling each inferred API fact as observed, inferred or hypothesis with confidence and evidence. BrowserForge ships on the Chrome Web Store for Chrome, Edge and Brave and on Firefox Add-ons, and its Windows installer is not yet code-signed.", "body_md": "**Give your AI agent a real browser, and turn the traffic it sees into API docs and clients.**\n\nA local-first Firefox + Chrome extension and MCP server for Claude Code, OpenAI Codex and any other MCP client.\n\nChrome, Edge and Brave use the Chrome Web Store build. Then install the small local program: on **Windows** run the installer above (it brings its own Node.js; Windows may warn because it is not code-signed yet: *More info*, then *Run anyway*), elsewhere see [Quick start](#quick-start).\n\n<sub>The approval step (12 s). [**Watch the full 73-second demo (MP4)**](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/assets/demo.mp4): fill a form, approve the submit, turn traffic into an OpenAPI spec, open the dashboard. Recorded on the demo site in this repo; a script plays the agent. Re-record it with `npm run demo:record`.</sub>\n\nAI agents are good at deciding what to do on a website and bad at being trusted with your accounts. BrowserForge closes that gap: the agent works in **your real browser** through an extension, a small **local program** carries its requests, and **you approve** anything consequential (submit, send, pay, passwords, uploads) with a click the agent cannot answer. What the agent sees and learns stays on your computer and is turned into reusable things: replayable **flows**, shareable **skills**, and **API specs and clients** built from the traffic it observed. The longer story, how this differs from headless automation and other browser bridges, and where the project is going: **[docs/VISION.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/VISION.md)**.\n\n| **Real browser, real session** | A WebExtension, not a headless clone: your tabs, your logins, your cookies. | \n| **Local-first** | Everything runs on `127.0.0.1` . No cloud service, no API credits. | \n| **Reverse-engineer APIs** | Capture traffic, then get endpoints, schemas, auth and pagination, an OpenAPI 3.1 spec and Python / TypeScript / JavaScript / PHP clients. | \n| **Human in the loop** | Submitting forms, purchases, sending, accepting terms, passwords and uploads wait for a click in the extension popup that the agent cannot answer. A red **STOP** halts the agent until you resume. | \n| **Honest output** | Every inferred API fact is labelled `observed` ,`inferred` or`hypothesis` with confidence and evidence. Per-browser capture limits are documented in[docs/LIMITATIONS.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/LIMITATIONS.md) . | \n| **Secure by default** | Token-authenticated loopback transports, Origin/Host checks, strict schemas, secret redaction, path-safe file access. See [docs/SECURITY.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/SECURITY.md) . | \n\nRequires Node.js 22 or newer, and Chrome, Edge, Brave or Firefox, on Linux, macOS or Windows (Linux is the one it has been tested on; see [docs/INSTALL.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/INSTALL.md)).\n\n```\n# From npm (no build): npm install -g @el-makina-ai/browserforge-mcp   then:   browserforge setup\n# From a checkout:\nnpm install && npm run build\nnode apps/mcp-server/dist/cli.js serve     # prints endpoints, creates tokens in ~/.config/browserforge/\nnode apps/mcp-server/dist/cli.js tokens    # shows the extension token\n```\n\n1. \n**Install the extension** from the store:\n  - [Chrome Web Store](https://chromewebstore.google.com/detail/browserforge/ihbkpcclcolaeppmfgmndmemjljmiaec) (Chrome, Edge, Brave)\n  - [Firefox Add-ons](https://addons.mozilla.org/en-US/firefox/addon/browserforge/)\n Working from a checkout? Load your own build instead: \n  - Firefox: `about:debugging#/runtime/this-firefox` →*Load Temporary Add-on* →`apps/firefox-extension/dist/firefox/manifest.json`\n  - Chrome: `chrome://extensions` → Developer mode →*Load unpacked* →`apps/firefox-extension/dist/chrome`\n2. \n**Connect it.** Click the toolbar icon, paste the**extension token** , press*Connect* .\n3. \n**Connect your agent.** Guides:[Codex](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/CODEX.md) ·[Claude Code](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/CLAUDE_CODE.md)\n\n```\ncodex mcp add browserforge --url http://127.0.0.1:7345/mcp --bearer-token-env-var BROWSERFORGE_MCP_TOKEN\nclaude mcp add --transport http browserforge http://127.0.0.1:7345/mcp --header \"Authorization: Bearer $(cat ~/.config/browserforge/mcp-token)\"\n```\n\n4. \n**Try it.** Start the demo site with`node tests/fixtures/demo-site/server.mjs` , then ask your agent:Call `system_status` , then open`http://127.0.0.1:8099/apply` and describe the form.\n\nFull instructions: [docs/INSTALL.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/INSTALL.md) · guides in the [wiki](https://github.com/zoghlamimostafa/BrowserForge-MCP/wiki) · what is planned: the [roadmap board](https://github.com/users/zoghlamimostafa/projects/1). Problems: [docs/TROUBLESHOOTING.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/TROUBLESHOOTING.md).\n\n- *\"Open this site, click through the checkout flow, and tell me which API calls it makes.\"*\n- *\"Analyze the captured traffic and generate an OpenAPI spec and a Python client for the endpoints I used.\"*\n- *\"Fill in the application form from my saved profile, show me a preview, and wait for my approval before submitting.\"*\n- *\"Export the capture as a HAR file with secrets redacted.\"*\n\n**From a website to a working API client**, in one conversation: the agent browses the shop, BrowserForge analyses the requests it saw (by code, not a model), writes an OpenAPI spec and a Python client that passes its own tests, and the client fetches real data:\n\n[**Watch the 41-second API demo (MP4)**](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/assets/demo-api.mp4). Recorded on the demo site in this repo with `npm run demo:record -- --scene api`; a script plays the agent.\n\nMore end-to-end examples: [docs/WORKFLOWS.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/WORKFLOWS.md).\n\n| Namespace | Tools | \n|---|---|\n| **browser** | `browser_get_tabs` ,`browser_get_active_tab` ,`browser_select_tab` ,`browser_close_tab` ,`browser_navigate` ,`browser_click` ,`browser_type` ,`browser_fill_field` ,`browser_select_option` ,`browser_scroll` ,`browser_press_key` ,`browser_get_page_text` ,`browser_get_dom_snapshot` ,`browser_get_interactive_elements` ,`browser_take_screenshot` ,`browser_wait_for_element` ,`browser_get_forms` ,`browser_extract_table` ,`browser_verify` ,`browser_fill_form` ,`browser_get_downloads` ,`browser_get_console_errors` ,`browser_solve_captcha` ,`browser_pending_requests` ,`browser_pause` ,`browser_resume` ,`browser_stop` | \n| **network** | `network_list_requests` ,`network_get_request` ,`network_get_request_details` ,`network_search_requests` ,`network_list_captures` ,`network_configure_capture` ,`network_export_har` ,`network_import_har` ,`network_clear_capture` | \n| **api** (reverse engineering) | `api_analyze_traffic` ,`api_list_endpoints` ,`api_get_endpoint_details` ,`api_generate_openapi` ,`api_generate_client` | \n| **form** | `form_profile_save` ,`form_profile_list` ,`form_profile_delete` ,`form_discover` ,`form_fill_from_profile` ,`form_validate` ,`form_preview_submission` ,`form_prepare_cover_letter` | \n| **goal** (optional, local model) | `browser_run_goal` ,`browser_goal_feedback` | \n| **knowledge** | `knowledge_add_document` ,`knowledge_search` ,`knowledge_list` ,`knowledge_remove` ,`knowledge_export_dataset` | \n| **flows** | `flow_list` ,`flow_get` ,`flow_save` ,`flow_delete` ,`flow_record` ,`flow_export` ,`flow_run` ,`flow_consolidate` ,`flow_to_skill` | \n| **sites** | `site_info` ,`site_note` ,`site_list` | \n| **skills** | `skill_list` ,`skill_get` ,`skill_run_workflow` (plus one prompt per skill) | \n| **plugins** | whatever the plugins you install add, e.g. `cv_*` from the RenderCV plugin | \n| **workflow** | `workflow_create` ,`workflow_run` ,`workflow_pause` ,`workflow_resume` ,`workflow_get_status` | \n| **system** | `system_status` ,`system_diagnostics` | \n\nRead-only tools carry `readOnlyHint`. Every tool has a strict JSON schema (unknown arguments are rejected) and bounded output.\n\n`browser_run_goal` is an optional fast path: **local** models pick one routine step at a time from a compact table of the page. By default Qwen (via Ollama) decides; `--decider cascade` puts Laya (via [Ollaya](https://github.com/ollaya-dev/ollaya)) first with Qwen as backup. The run hands back to your agent when the models are unsure, and every step says which model decided. It only types values you pass in, never navigates to other sites, and goes through the same approval gate as every other action.\n\nAnalysis and code generation themselves are deterministic and use no LLM.\n\nBrowserForge records what an agent does on each website as a **flow**: steps, several ways to find each element, and your typed values as named parameters (passwords are never kept). Replay a flow with no model (`flow_run`), or export it as a script for **Playwright** (TypeScript, Python), **Selenium** (Python, Java), **Chrome DevTools Recorder / Puppeteer Replay**, or neutral JSON:\n\n```\nbrowserforge flow list\nbrowserforge flow export <id> --format playwright-ts --out signup.ts\nFLOW_CONFIRM=1 FLOW_PARAM_FIRST_NAME=Grace npx tsx signup.ts\n```\n\nExported scripts stop before submits, sends and uploads unless you say `FLOW_CONFIRM=1`, since outside BrowserForge there is no approval prompt. Details: [docs/FLOWS.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/FLOWS.md).\n\n- **Agent window:** turn it on in the popup and the agent works in its own window instead of the tabs you are using; it can still use one of yours when it selects it on purpose.**Take over** stops the agent and shows its window so you can finish by hand;**Hand back** lets it carry on. Details:[docs/AGENT_WINDOW.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/AGENT_WINDOW.md) .\n- **Tables:**`browser_extract_table` reads HTML tables and ARIA grids (also inside iframes) as column names and rows, with merged cells expanded, as JSON or CSV (spreadsheet formulas neutralised), or saved to a file so a big table does not fill the agent's context.\n\n- **Site cards:** navigating to a site returns what is known about it (obstacles, past results, flows to replay); agents add to it with`site_note` . See[docs/SITES.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/SITES.md) .\n- **Automatic checks:** after a submit, and at the end of`browser_run_goal` , the page is read for a confirmation or an error, and the run is labelled good or bad without waiting for anyone.`browser_verify` does it on demand.\n- **Flows to skills:**`flow_consolidate` merges many recordings of a task into one clean flow, and`flow_to_skill` turns it into a shareable skill that replays with no model.\n- **Record me:** an opt-in popup switch that also records*your own* clicks and fields as a flow and as training examples for the local model. Off by default, passwords never recorded, everything stays on your computer.\n\n`browserforge dashboard` opens a read-only page on your own computer: connected browsers, MCP sessions and every tool, the plugins and skills you installed (with the permissions you approved, in plain words), recorded flows and how the local models are doing. It changes nothing and has its own token. Details: [docs/DASHBOARD.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/DASHBOARD.md).\n\nAnyone can add to BrowserForge without touching the core:\n\n- **Skills** : a folder with a`SKILL.md` (and optional ready-made workflows). No code; agents read it.`browserforge skill new my-skill` .[docs/SKILLS.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/SKILLS.md)\n- **Plugins** : a small ES module that adds tools, with a manifest of exactly which folders, programs and browser access it needs. You see that list in plain words and approve it before it is installed; a later version asking for more is switched off until you approve again.`browserforge plugin new my-tool` .[docs/PLUGINS.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/PLUGINS.md)\n\n```\nbrowserforge plugin search cv            # npm packages tagged \"browserforge-plugin\"\nbrowserforge plugin add ./plugins/rendercv\nbrowserforge plugin config rendercv cvDir=~/cv rendercv=~/venv/bin/rendercv\n```\n\nThe first plugin is [`plugins/rendercv`](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/plugins/rendercv): tailor a RenderCV resume to each job (reorder and reword only; it rejects any number, link or tool name not already in your CV), render it, and keep an application log. Its companion skill [`skills/job-apply`](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/skills/job-apply) is a worked example of a skill. Contributing: [CONTRIBUTING.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/CONTRIBUTING.md).\n\n``` php\nflowchart LR\n  A[\"Your agent<br/>Claude Code · Codex · any MCP client\"] -->|\"MCP + token\"| D\n  subgraph D[\"browserforge daemon · 127.0.0.1\"]\n    T[\"Tools\"] --- N[\"Traffic analyzer<br/>+ client generator\"]\n    T --- F[\"Flows\"]\n    T --- M[\"Memory<br/>site cards · traces\"]\n    T --- L[\"Local deciders<br/>Qwen · Laya\"]\n  end\n  D -->|\"WebSocket + token\"| E[\"Extension<br/>Chrome · Firefox<br/>approvals · STOP\"]\n  N --> O[\"OpenAPI · API clients · HAR\"]\n  F --> S[\"Playwright · Selenium ·<br/>Chrome Recorder scripts\"]\n  F -->|\"flow_to_skill\"| K[\"Skills\"]\n  K --> A\n  P[\"Plugins<br/>permission manifests\"] --> T\n```\n\nThe extension, the daemon and the typed protocol between them are the core. Flows, skills and plugins are how it grows without touching the core, and the local models and site memory make repeated tasks cheaper. Each part, and where it is heading (a shared library of skills, local models that learn from your demonstrations, more plugins, more browsers and platforms), is in [docs/VISION.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/VISION.md).\n\n```\n Claude Code / Codex  ──MCP (HTTP + Bearer)──►  browserforge daemon  ──WebSocket (token + Origin)──►  extension in Firefox / Chrome\n                                                 MCP tools · BrowserHub                                 background · content script · popup\n                                                 NetworkStore · analyzer · generator                    approvals · STOP\n```\n\n1. A tool call is validated against its schema, then sent to the extension with a request id, timeout and cancellation.\n2. The extension re-validates it, resolves the tab and element, and runs it in the page.\n3. If the action looks consequential, it returns to the human for approval *inside the browser* before anything happens.\n4. Results flow back to the agent as redacted, bounded, untrusted data.\n\nDeeper dive: [docs/ARCHITECTURE.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/ARCHITECTURE.md) · [docs/BROWSER_PROTOCOL.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/BROWSER_PROTOCOL.md) · [docs/RESEARCH.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/RESEARCH.md).\n\n- **Page content is data, never instructions.** It is wrapped as untrusted before the agent sees it.\n- **Approvals live in the browser.** The agent cannot answer the popup.\n- **Secrets are redacted** from what the agent sees, from exports and from generated code. Revealing them requires starting the daemon with`--allow-reveal` .\n- **Nothing is persisted** unless you export it. Captured traffic stays in memory.\n- **No anti-bot evasion** and no arbitrary-JavaScript tool. CAPTCHA solving exists only as the opt-in`browser_solve_captcha` (local CapSkip app, needs`--capskip` and YOLO mode; see[SECURITY.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/SECURITY.md) ).\n\n```\napps/firefox-extension     cross-browser extension source (builds dist/firefox and dist/chrome)\napps/mcp-server            daemon: MCP (HTTP/stdio), extension WebSocket hub, tools, CLI\npackages/browser-protocol  versioned Zod message and action schemas\npackages/network-inspector capture store, filters, redacted views, HAR\npackages/api-analyzer      traffic to endpoints, schemas, pagination, auth, evidence\npackages/client-generator  OpenAPI 3.1, Python/TS/JS/PHP clients, safe writer, validators\npackages/knowledge         local reference documents (BM25) and run traces\npackages/flows             flow format, builder and exporters (Playwright, Selenium, Chrome Recorder, JSON)\npackages/plugin-sdk        what plugin authors import: manifest, permission-checked api, test helper\nplugins/                   reference plugins (rendercv)\nskills/                    reference skills (job-apply)\npackages/shared            errors, limits, redaction, path safety, tokens, logger\ntests/                     unit · security · integration · e2e (real browsers) · demo site\ndocs/  examples/  CONTRIBUTING.md\n```\n\n| Command | What it does | \n|---|---|\n| `npm run build` | TypeScript project build and extension bundles | \n| `npm run typecheck` | `tsc` for packages, server, extension and tests | \n| `npm run lint` | ESLint and `web-ext lint` | \n| `npm test` | unit, security and integration tests (no browser needed) | \n| `npm run test:e2e` | real Firefox (geckodriver) and Chromium (Playwright); `BF_BROWSERS=firefox` to pick one | \n| `npm run package` | `artifacts/browserforge-{firefox,chrome}-<version>.zip` | \n| `npm run dev` | rebuild on change and restart the daemon | \n\nVersion 0.2.1 (the Chrome Web Store and Firefox Add-ons are updated after each release), published on the Chrome Web Store and Firefox Add-ons. BrowserForge reports what a WebExtension can actually see; it does not capture all browser traffic. For example, Firefox cannot observe WebSocket frames, closed shadow roots and sandboxed iframes are invisible to it, and consequential-action detection is heuristic.\n\nRead [docs/LIMITATIONS.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/LIMITATIONS.md) for the full list and [docs/RELEASE_CHECKLIST.md](https://github.com/zoghlamimostafa/BrowserForge-MCP/blob/main/docs/RELEASE_CHECKLIST.md) for the manual checks still required before a release.\n\nUse BrowserForge only on sites and accounts you are authorised to automate or inspect, and respect their terms of service and the law. It is built for your own sessions and for legitimate testing, integration and documentation work.\n\nIf BrowserForge saves you time, a ⭐ on this repository helps other people find it. Ideas, questions and plugins are welcome in [Discussions](https://github.com/zoghlamimostafa/BrowserForge-MCP/discussions); things you can pick up right now are the [issues marked *help wanted*](https://github.com/zoghlamimostafa/BrowserForge-MCP/issues?q=is%3Aopen+label%3A%22help+wanted%22), and the plan is on the [roadmap board](https://github.com/users/zoghlamimostafa/projects/1).", "url": "https://wpnews.pro/news/show-hn-browserforge-ai-agents-use-your-real-browser-you-approve-the-clicks", "canonical_source": "https://github.com/zoghlamimostafa/BrowserForge-MCP", "published_at": "2026-11-04 23:50:07+00:00", "updated_at": "2026-11-05 00:20:32.842638+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "agent-protocols", "developer-tools", "ai-products"], "entities": ["BrowserForge", "Claude Code", "OpenAI Codex", "Chrome Web Store", "Firefox Add-ons", "Node.js", "Chrome", "Firefox"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-browserforge-ai-agents-use-your-real-browser-you-approve-the-clicks", "markdown": "https://wpnews.pro/news/show-hn-browserforge-ai-agents-use-your-real-browser-you-approve-the-clicks.md", "text": "https://wpnews.pro/news/show-hn-browserforge-ai-agents-use-your-real-browser-you-approve-the-clicks.txt", "jsonld": "https://wpnews.pro/news/show-hn-browserforge-ai-agents-use-your-real-browser-you-approve-the-clicks.jsonld"}}