Let your AI coding agent (Claude Code or Codex CLI) drive your real Chrome — clicks, fills forms, grabs API keys, writes them to .env. Real session, real cookies, no fresh browser sandbox.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http
verified
reported
listed in the official MCP registry counts 30 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
capture_terminal
-
clear_overlays
-
click_at_coordinates
-
click_element
-
close_tab
-
download_file
-
execute_script
-
fetch_url
-
fill_form
-
fill_input
-
find_text
-
get_console_logs
-
get_form_fields
-
get_page_html
-
get_page_text
-
highlight_region
-
inspect_request_headers
-
interactive_snapshot
-
list_frames
-
list_tabs
-
open_page
-
save_flow
-
scroll_to_element
-
set_file_input
-
switch_to_tab
-
take_screenshot
-
type_text
-
wait_for
-
wait_for_click
-
write_to_env
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 9503b5c · analyzer v33 · 14h ago
skills & prompt files 3
danger signals6
- dynamic code execution indirect eval NeoDrew-chromeflow-9503b5c/packages/extension/src/background/handlers/script.ts :159
result = await (0, eval)(wrapAsync(code)); - dynamic code execution eval() NeoDrew-chromeflow-9503b5c/packages/extension/src/background/handlers/script.ts :307
try { __result = eval(${JSON.stringify(code)}); } - dynamic code execution eval() NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/scripting.ts :22
CSP-strict pages that disallow eval (Stripe, GitHub) silently fall through to a CDP eval path. Page alerts (alert/confirm/prompt) fired since the last script appear as PAGE ALERT in the result. - dynamic code execution new Function() NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :2950
const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); - dynamic code execution eval() NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25846
CSP-strict pages that disallow eval (Stripe, GitHub) silently fall through to a CDP eval path. Page alerts (alert/confirm/prompt) fired since the last script appear as PAGE ALERT in the result. - over-broad OAuth scope https://mail.google.com/ NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/flow-store.test.ts :698
expect(originKey("https://mail.google.com/mail/u/0/#inbox")).toBeUndefined();
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 112
filesystem 13
- fs NeoDrew-chromeflow-9503b5c/packages/extension/build.mjs :2
import { cpSync, mkdirSync } from "fs"; - fs NeoDrew-chromeflow-9503b5c/packages/extension/pack.mjs :14
import { existsSync, readFileSync, statSync, unlinkSync } from "node:fs"; - fs (weak) NeoDrew-chromeflow-9503b5c/packages/mcp-server/scripts/usage-stats.mjs :11
import { existsSync, readFileSync } from "node:fs"; - fs (weak) NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/flow-store.test.ts :17
import { mkdtempSync, readFileSync, existsSync } from "node:fs"; - fs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/flow-store.ts :44
import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync } from "node:fs"; - fs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/files.ts :3
import { promises as fs } from "node:fs"; - fs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/screenshot.ts :3
import { writeFileSync, copyFileSync, readFileSync } from "fs"; - fs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/fetch.ts :3
import { mkdirSync, writeFileSync } from "fs"; - fs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/files.ts :3
import { appendFileSync, readFileSync, writeFileSync } from "fs"; - fs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/usage-log.ts :11
import { existsSync, statSync, renameSync, appendFileSync, mkdirSync } from "node:fs"; - fs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/ws-bridge.ts :4
import { mkdirSync, writeFileSync } from "node:fs"; - fs NeoDrew-chromeflow-9503b5c/packages/plugin/hooks/inject.js :18
const fs = require('fs');
show 1 more
- fs NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :24623
import { mkdirSync as mkdirSync2, writeFileSync } from "node:fs";
shell / exec 3
- shell NeoDrew-chromeflow-9503b5c/packages/extension/pack.mjs :13
import { execSync } from "node:child_process"; - shell NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/screenshot.ts :6
import { execSync } from "child_process"; - shell NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25490
import { execSync } from "child_process";
network 6
- net NeoDrew-chromeflow-9503b5c/apps/website/src/components/ValidatedPlatforms.jsx :155
fetch('/validated/last-run.json') - net NeoDrew-chromeflow-9503b5c/packages/extension/src/background/handlers/capture.ts :131
imgBlob = await (await fetch(capture.dataUrl)).blob(); - net NeoDrew-chromeflow-9503b5c/packages/extension/src/background/handlers/fetch.ts :175
// Privileged fetch (extension authority + cookie jar, no tab): confine - net NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/scripting.ts :20
MAIN-world means the page's Content-Security-Policy applies: \`fetch()\` against authenticated APIs is often blocked by the page's connect-src directive. When that happens, switch to fetch_url — it ru - net NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/fetch.ts :14
- **execute_script (page context):** DOM access, page CSP applies, fetch() blocked by connect-src. - net NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25844
MAIN-world means the page's Content-Security-Policy applies: \`fetch()\` against authenticated APIs is often blocked by the page's connect-src directive. When that happens, switch to fetch_url \u2014
tool registrations 60
- set_file_input NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/files.ts :7
- get_form_fields NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/forms.ts :6
- open_page NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/navigation.ts :8
- inspect_request_headers NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/navigation.ts :69
- take_screenshot NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/screenshot.ts :10
- capture_terminal NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/screenshot.ts :105
- clear_overlays NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/screenshot.ts :182
- execute_script NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/scripting.ts :6
- interactive_snapshot NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/snapshot.ts :6
- switch_to_tab NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/tabs.ts :7
- list_tabs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/tabs.ts :47
- close_tab NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/tabs.ts :69
show 28 more
- type_text NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/browser/typing.ts :7
- get_page_text NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/extract.ts :6
- get_page_html NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/extract.ts :66
- get_console_logs NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/extract.ts :110
- fetch_url NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/fetch.ts :9
- write_to_env NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/files.ts :9
- download_file NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/files.ts :81
- fill_input NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/capture/input.ts :6
- click_element NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/click.ts :7
- click_at_coordinates NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/click.ts :267
- find_text NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/find.ts :6
- list_frames NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/find.ts :95
- fill_form NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/forms.ts :6
- save_flow NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/save.ts :6
- wait_for_click NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/wait.ts :6
- wait_for NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/wait.ts :65
- scroll_to_element NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/flow/wait.ts :152
- highlight_region NeoDrew-chromeflow-9503b5c/packages/mcp-server/src/tools/highlight.ts :6
- open_page NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25293
- inspect_request_headers NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25346
- switch_to_tab NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25378
- list_tabs NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25406
- close_tab NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25424
- interactive_snapshot NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25461
- take_screenshot NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25492
- capture_terminal NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25551
- clear_overlays NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25614
- get_form_fields NeoDrew-chromeflow-9503b5c/packages/plugin/server/chromeflow.mjs :25629
20 more not shown — this panel samples each group; the count above is the real total.
declared dependencies 1
- vitest@^4.1.8