MCP server + CLI giving AI agents a real, stealth browser — per-country identity, self-healing actions, snapshots, multi-step plans, structured extraction. Reads JS/SPA pages, drives your own browser via CDP. Built on Patchright/Playwright.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 41 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
browser_act
-
browser_autoscroll
-
browser_clipboard
-
browser_close
-
browser_collect
-
browser_collect_batch
-
browser_connect
-
browser_console
-
browser_cookies
-
browser_crawl
-
browser_dialog
-
browser_downloads
-
browser_extract
-
browser_extract_schema
-
browser_fetch
-
browser_fetch_batch
-
browser_handoff
-
browser_inspect
-
browser_live_view
-
browser_live_view_stop
-
browser_metrics
-
browser_navigate
-
browser_network
-
browser_open
-
browser_pdf
-
browser_permissions
-
browser_probe
-
browser_probe_html
-
browser_products
-
browser_route
-
browser_run
-
browser_screenshot
-
browser_serp_batch
-
browser_shots_batch
-
browser_site_shots
-
browser_snapshot
-
browser_status
-
browser_tabs
-
browser_vault
-
browser_visual_diff
-
browser_wait_for
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 254644b · analyzer v33 · 5d ago
danger signals3
- dynamic code execution new Function() fusengine-fuse-browser-254644b/tests/unit/clipboard-tool.test.ts :22
const run = new Function("navigator", `return (${expression});`); - suspicious endpoint 8.8.8.8 fusengine-fuse-browser-254644b/tests/unit/private-net-guard-bypass.test.ts :49
await expect(assertNetworkAllowed("http://8.8.8.8/", lookupThatMustNotBeCalled)).resolves.toBeUndefined(); - suspicious endpoint 192.0.0.1 fusengine-fuse-browser-254644b/tests/unit/private-net-guard-bypass.test.ts :67
"http://192.0.0.1/",
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 431
filesystem 35
- fs fusengine-fuse-browser-254644b/src/bin/run-cli.ts :7
import { readFileSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/engine/browser-paths.ts :9
import { existsSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/engine/configured-context.ts :7
import { existsSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/lib/canonicalize-path.ts :16
import { lstatSync, readlinkSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/lib/fs.ts :6
import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/lib/output-dir.ts :8
import { existsSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/lib/version.ts :7
import { readFileSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/lib/write-guard.ts :24
import { closeSync, constants as fsConstants, mkdirSync, openSync, writeFileSync, writeSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/proxy/country-map.ts :5
import { existsSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/server/resources.ts :5
import { readdirSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/server/tools/visual-diff.ts :7
import { existsSync, readFileSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/session/download-read.ts :6
import { existsSync, readFileSync, statSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/session/downloads.ts :8
import { existsSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/vault/crypto.ts :10
import { existsSync, readFileSync, writeFileSync } from "node:fs"; - fs fusengine-fuse-browser-254644b/src/vault/store.ts :8
import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/integration/fetch-extract.test.ts :7
import { readFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/integration/session-state.test.ts :6
import { existsSync, mkdtempSync, readFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/live/live-check-2.ts :7
import { existsSync, readFileSync, rmSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/live/live-persist-idb.ts :15
import { rmSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/live/live-upload.ts :8
import { writeFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/action-memory.test.ts :2
import { mkdtempSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/canonicalize-path.test.ts :2
import { mkdirSync, mkdtempSync, realpathSync, symlinkSync, writeFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/download-read.test.ts :2
import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/output-dir.test.ts :2
import { mkdirSync, mkdtempSync, rmSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/pdf-tool.test.ts :2
import { readFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/pdf-write.test.ts :2
import { mkdtempSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/proxy-load.test.ts :2
import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/screenshot-tool.test.ts :9
import { existsSync, readFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/vault-resolve.test.ts :2
import { mkdtempSync, rmSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/vault-store.test.ts :2
import { mkdtempSync, rmSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/vault-tool-redact.test.ts :4
import { mkdtempSync, rmSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/write-guard-pdf-real-path.test.ts :2
import { mkdirSync, mkdtempSync, readFileSync, symlinkSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/write-guard-screenshot-escape.test.ts :2
import { existsSync, mkdirSync, mkdtempSync, symlinkSync, writeFileSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/write-guard-screenshot-real-path.test.ts :2
import { mkdirSync, mkdtempSync, readFileSync, symlinkSync } from "node:fs"; - fs (weak) fusengine-fuse-browser-254644b/tests/unit/write-guard.test.ts :2
import { mkdirSync, mkdtempSync, symlinkSync } from "node:fs";
shell / exec 5
- shell (weak) fusengine-fuse-browser-254644b/scripts/postinstall.mjs :6
import { execSync } from "node:child_process"; - shell fusengine-fuse-browser-254644b/src/engine/cdp-launch.ts :12
import { spawn } from "node:child_process"; - shell fusengine-fuse-browser-254644b/src/live/open-url.ts :5
import { spawn } from "node:child_process"; - shell fusengine-fuse-browser-254644b/src/state/action-memory.ts :16
* Run `exec(action)` with site-memory assist: prefill `preferredStrategy` from - shell (weak) fusengine-fuse-browser-254644b/tests/live/live-cli-run.ts :6
import { spawn } from "node:child_process";
network 14
- net fusengine-fuse-browser-254644b/src/agent/fetch-batch.ts :15
/** Options for a batch fetch (per-URL semantics mirror `browser_fetch`). */ - net fusengine-fuse-browser-254644b/src/agent/fetch-escalate.ts :65
* @param rendered - The still-empty rendered fetch (already escalated). - net fusengine-fuse-browser-254644b/src/bin/cli-usage.ts :12
fetch <url> Fast HTTP fetch (add --browser-fallback to retry in a browser) - net fusengine-fuse-browser-254644b/src/engine/cdp-launch.ts :61
const res = await fetch(url, { signal: controller.signal }); - net fusengine-fuse-browser-254644b/src/live/sse-server.ts :7
import { createServer, type ServerResponse } from "node:http"; - net fusengine-fuse-browser-254644b/src/net/captcha-client.ts :22
const res = await fetch(url, { - net fusengine-fuse-browser-254644b/src/net/fetch-fast.ts :52
const res = await client(proxyUrl).fetch(url, { headers: { Accept: ACCEPT } }); - net fusengine-fuse-browser-254644b/src/net/ip-ranges.ts :8
import { isIP } from "node:net"; - net fusengine-fuse-browser-254644b/src/server/tools/fetch-batch.ts :25
title: "HTTP fast fetch (batch)", - net fusengine-fuse-browser-254644b/src/server/tools/schemas-fetch-output.ts :8
/** A single rendered fetch (matches `agent/fetch-render.ts#RenderedFetch`). */ - net (weak) fusengine-fuse-browser-254644b/tests/integration/live-view.test.ts :7
import { get } from "node:http"; - net (weak) fusengine-fuse-browser-254644b/tests/live/live-persist-idb.ts :14
import { createServer, type Server } from "node:http"; - net (weak) fusengine-fuse-browser-254644b/tests/live/live-proxy.ts :8
import { createServer } from "node:http"; - net (weak) fusengine-fuse-browser-254644b/tests/unit/fetch-fast-network-guard.test.ts :2
import { createServer } from "node:net";
secrets 6
- secrets fusengine-fuse-browser-254644b/src/vault/crypto.ts :17
const env = process.env.FUSE_VAULT_KEY; - secrets fusengine-fuse-browser-254644b/src/vault/store.ts :42
if (!process.env.FUSE_VAULT_KEY && !existsSync(keyPath)) { - secrets (weak) fusengine-fuse-browser-254644b/tests/live/captcha-live.ts :27
apiKey: process.env.CAPTCHA_KEY ?? "INVALID_TEST_KEY", - secrets (weak) fusengine-fuse-browser-254644b/tests/unit/vault-resolve.test.ts :51
delete process.env.FUSE_VAULT_KEY; - secrets (weak) fusengine-fuse-browser-254644b/tests/unit/vault-store.test.ts :20
process.env.FUSE_VAULT_KEY = Buffer.alloc(32, 7).toString("base64"); - secrets (weak) fusengine-fuse-browser-254644b/tests/unit/vault-tool-redact.test.ts :22
process.env.FUSE_VAULT_KEY = Buffer.alloc(32, 9).toString("base64");
tool registrations 41
- browser_autoscroll fusengine-fuse-browser-254644b/src/server/tools/autoscroll.ts :17
- browser_clipboard fusengine-fuse-browser-254644b/src/server/tools/clipboard.ts :59
- browser_collect_batch fusengine-fuse-browser-254644b/src/server/tools/collect-batch.ts :37
- browser_collect fusengine-fuse-browser-254644b/src/server/tools/collect.ts :21
- browser_connect fusengine-fuse-browser-254644b/src/server/tools/connect.ts :26
- browser_cookies fusengine-fuse-browser-254644b/src/server/tools/cookies.ts :55
- browser_crawl fusengine-fuse-browser-254644b/src/server/tools/crawl.ts :19
- browser_dialog fusengine-fuse-browser-254644b/src/server/tools/dialogs.ts :35
- browser_downloads fusengine-fuse-browser-254644b/src/server/tools/dialogs.ts :63
- browser_extract_schema fusengine-fuse-browser-254644b/src/server/tools/extract-schema.ts :37
- browser_extract fusengine-fuse-browser-254644b/src/server/tools/extract.ts :37
- browser_fetch_batch fusengine-fuse-browser-254644b/src/server/tools/fetch-batch.ts :22
- browser_fetch fusengine-fuse-browser-254644b/src/server/tools/fetch.ts :27
- browser_handoff fusengine-fuse-browser-254644b/src/server/tools/handoff.ts :24
- browser_inspect fusengine-fuse-browser-254644b/src/server/tools/inspect.ts :34
- browser_live_view fusengine-fuse-browser-254644b/src/server/tools/live-view.ts :23
- browser_live_view_stop fusengine-fuse-browser-254644b/src/server/tools/live-view.ts :50
- browser_console fusengine-fuse-browser-254644b/src/server/tools/logs.ts :30
- browser_network fusengine-fuse-browser-254644b/src/server/tools/logs.ts :65
- browser_metrics fusengine-fuse-browser-254644b/src/server/tools/metrics.ts :29
- browser_navigate fusengine-fuse-browser-254644b/src/server/tools/navigate.ts :16
- browser_pdf fusengine-fuse-browser-254644b/src/server/tools/pdf.ts :43
- browser_permissions fusengine-fuse-browser-254644b/src/server/tools/permissions.ts :48
- browser_probe fusengine-fuse-browser-254644b/src/server/tools/probe.ts :26
- browser_probe_html fusengine-fuse-browser-254644b/src/server/tools/probe.ts :48
- browser_products fusengine-fuse-browser-254644b/src/server/tools/products.ts :27
- browser_route fusengine-fuse-browser-254644b/src/server/tools/route.ts :64
- browser_run fusengine-fuse-browser-254644b/src/server/tools/run.ts :22
- browser_screenshot fusengine-fuse-browser-254644b/src/server/tools/screenshot.ts :32
- browser_serp_batch fusengine-fuse-browser-254644b/src/server/tools/serp-batch.ts :28
- browser_open fusengine-fuse-browser-254644b/src/server/tools/session.ts :30
- browser_status fusengine-fuse-browser-254644b/src/server/tools/session.ts :52
- browser_close fusengine-fuse-browser-254644b/src/server/tools/session.ts :73
- browser_shots_batch fusengine-fuse-browser-254644b/src/server/tools/shots-batch.ts :27
- browser_site_shots fusengine-fuse-browser-254644b/src/server/tools/site-shots.ts :32
- browser_snapshot fusengine-fuse-browser-254644b/src/server/tools/snapshot.ts :22
- browser_act fusengine-fuse-browser-254644b/src/server/tools/snapshot.ts :51
- browser_tabs fusengine-fuse-browser-254644b/src/server/tools/tabs.ts :47
- browser_vault fusengine-fuse-browser-254644b/src/server/tools/vault.ts :24
- browser_visual_diff fusengine-fuse-browser-254644b/src/server/tools/visual-diff.ts :33
- browser_wait_for fusengine-fuse-browser-254644b/src/server/tools/wait.ts :17
install hooks 2
- postinstall fusengine-fuse-browser-254644b/package.json :52
node scripts/postinstall.mjs - prepublishOnly fusengine-fuse-browser-254644b/package.json :53
npm run build
declared dependencies 14
- @modelcontextprotocol/sdk@^1.29.0
- defuddle@^0.19.1
- fast-png@^8.0.0
- impit@^0.14.3
- libphonenumber-js@^1.13.9
- linkedom@^0.18.13
- patchright@^1.61.1
- pixelmatch@^7.2.0
- playwright@^1.61.1
- zod@^4.4.3
- @biomejs/biome@^2.5.4
- @types/node@^22.10.5
- tsx@^4.23.1
- typescript@^7.0.2