Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.frsorrentino/chrome-bridge

NPM · CHROME-BRIDGE-MCP

Borrow a tab from your own logged-in Chrome, hand it back; 2FA and CAPTCHA stay yours. 69 tools.

Available components

+10 this week 93 Trust /100

Last scanned (1 hour ago)

Scores higher than 96% of npm servers

Category Browser Automation

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 107 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to frsorrentino/chrome-bridge). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 6 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability65
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 9736 tokens (~211/item across 46 items; 46 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 47 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 4 Nov 26 0
    • Package version: 1.30.0 → 1.32.1 functional
  • 2 Nov 26 0
    • Security disclosure: unverified → pass ▲ functional
  • 30 Oct 26 +10
    • Known CVEs: unverified → pass ▲ security
    • Security disclosure: pass → unverified ▼ functional
    • Dependency health: unverified → 0.87 ▲ functional
    • Package version: 1.30.0 → 1.32.1 functional
  • 29 Oct 26 0
    • Stability: pass → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Known CVEs: unverified → pass ▲ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Dependency health: unverified → 0.88 ▲ functional
    • Dependency health: unverified → 0.87 ▲ functional
    • Package version: 1.31.2 → 1.32.1 functional
    • Package version: 1.31.2 → 1.32.0 functional
    • Package version: 1.31.2 → 1.31.3 functional
  • 28 Oct 26 −10
    • Stability: pass → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Known CVEs: pass → unverified ▼ security
    • Malware scan: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Dependency health: 0.87 → unverified ▼ functional
    • Package version: 1.30.7 → 1.31.2 functional
    • Package version: 1.30.7 → 1.31.1 functional
    • Package version: 1.30.7 → 1.31.0 functional
  • 25 Oct 26 0
    • Stability: pass → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Package version: 1.30.6 → 1.30.7 functional
  • 24 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 23 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 1.30.5 → 1.30.6 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed npm/chrome-bridge-mcp@1.32.1

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo frsorrentino/chrome-bridge
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/frsorrentino/chrome-bridge/.github/workflows/publish-npm.yml@refs/tags/v1.32.1
Rekor log index 3564712378
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:b588b1ff3af9d04997653eb362d1c515ebf0dc057bc2453d4d3c7bda0cbd8c5d8aaabd29fdfe816e41c619164abd01688fcc7c3a0430e320e04289d97

Background: How many MCP packages publish verified provenance →

Dependencies 107 packages
Packages resolved 107
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 46 exposed · ~9,207 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
assert ~216

Assert a page condition, polling until timeout: element exists/visible (optionally with count or containing text), text on page, tab url/title. Patterns: substring, or "/…/" for regex. Recorded flows replay it as a test. Unlike wait_for, which returns found: false, a failure is an error naming what did not match; success returns passed and waited_ms.

NameTypeReqDescription
countnumber–Exact match count for selector
selectorstring–Element the assertion is about; ">>>" pierces shadow DOM
statestring–attached means present in the DOM, visible also requires a rendered box
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
textstring–In the element (with selector) or anywhere on the page
timeoutnumber–Max ms to wait for the condition before failing
titlestring–Tab title pattern
urlstring–Tab url pattern

No output schema declared.

No examples provided.

audit ~201

One-call page audit, pick the kinds: accessibility, keyboard (tab order and focus issues), SEO, security headers, broken links, Core Web Vitals, unused CSS, resources (which plugin/theme/module/host slows the page), cache (is the CDN serving the new version). A summary line per kind; with save_to the full Markdown report with every finding. Read-only. For one deep look at load speed use perf_trace, for Lighthouse scores lighthouse.

NameTypeReqDescription
kindsarray–Default skips keyboard, css (slow, approximate), resources and cache
max_linksnumber–links only: cap on URLs fetched
save_tostring–Absolute path: write the full Markdown report there and return the path instead of the content
scopestring–a11y only: limit to this subtree
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

capture_downloads ~224

Save files the page builds itself, with no browser download and no "Save as" dialog: blob and data URL links (a[download]), window.showSaveFilePicker writes, and downloads the page starts (cancelled at once, bytes fetched again with the browser cookies). arm with save_dir, then click Export/Download, then wait: it returns the saved paths. A file with a URL: http_request save_to instead. Names are cleaned, existing files never overwritten, size capped by max_mb.

NameTypeReqDescription
actionstringyesarm before the click; wait returns what arrived and stays armed; disarm restores the page
max_mbnumber–arm: per-file cap in MB (default 100, max 200); a bigger file is skipped
save_dirstring–arm: absolute directory for the files; created if missing
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
timeoutnumber–wait: max ms for the first file

No output schema declared.

No examples provided.

click ~324

Click an element by CSS selector or by a ref (n1, n2…) from get_interactives or navigate. A real pointer sequence: it can submit, open a dialog or navigate — use wait_after. Not idempotent; a native confirm() blocks the bridge: handle_dialogs first. Returns page_changed (url, title and DOM deltas: nodes, text, open, expanded, checked, dialogs, focus): the effect, without a screenshot; when the click opens or reveals something, the refs of the visible interactives follow, no get_interactives needed.

NameTypeReqDescription
buttonstring–right opens the page context menu instead of activating the element
countnumber–2 emits dblclick after the two clicks, which is what selects a word or opens an editor
forceboolean–Click even if occluded
frame_idnumber–Target iframe id from get_frames; omitted = main frame
refstring–From get_interactives, e.g. "n3"
selectorstring–CSS selector; ">>>" pierces shadow DOM. Ignored when ref is given
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
trustedboolean–Real browser input (isTrusted) via chrome.debugger, main frame only: for widgets that ignore synthetic clicks
wait_afterstring–Settle before returning: navigation waits for a page load, networkidle for quiet traffic

No output schema declared.

No examples provided.

clipboard ~121

Read or write the system clipboard (text). Activates the tab and focuses its window first. write overwrites whatever the user had copied, which is not recoverable. To fill a field use type_text instead of write and paste; read checks what a Copy button copied, and an empty clipboard returns text "".

NameTypeReqDescription
actionstringyeswrite takes text; read returns the current clipboard contents
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
textstring–For write

No output schema declared.

No examples provided.

create_tab ~172

Open a new tab, optionally at a URL, and make it the implicit target of later commands in this session. Each call creates another tab: reuse a tab_id or navigate() to move an existing one instead of piling up tabs.

NameTypeReqDescription
activeboolean–false opens the tab in the background, leaving the current one focused
heightnumber–Window height px (new_window)
leftnumber–Window x on the virtual desktop (new_window)
new_windowboolean–Open in a fresh window instead of a tab; with left/top it lands on the chosen monitor
topnumber–Window y (new_window)
urlstring–URL to open (default: new tab page)
widthnumber–Window width px (new_window)

No output schema declared.

No examples provided.

dismiss_overlays ~59

Dismiss cookie banners/modal overlays: OneTrust, Cookiebot, Usercentrics, then generic heuristic. Idempotent.

NameTypeReqDescription
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

element_screenshot ~167

Screenshot cropped to one element or to a viewport region (PNG), optionally enlarged. Read-only. The cheapest image in the set, because it carries only the box you asked for — and with scale the way to read fine print: crop the box, zoom it, verify.

NameTypeReqDescription
regionobject–Box in viewport CSS px (the rect frame of get_interactives/query_dom), instead of selector
scalenumber–Enlargement of the crop, 1-4; output still capped at 1568px
selectorstring–CSS selector; ">>>" pierces shadow DOM. The element is scrolled into view first
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

execute_js ~232

Run JavaScript in the page (MAIN world). Requires the extension's "Allow user scripts" toggle; errors explain setup if disabled. Use it when no dedicated tool fits: extract or extract_table read data, query_dom inspects elements, inject_css restyles, and none of them needs the toggle. A promise is awaited up to timeout. A cut result stays valid JSON and says truncated; save_to writes the whole result to disk.

NameTypeReqDescription
codestringyesJS evaluated in the page; the value of the last expression is returned
frame_idnumber–Target iframe id from get_frames; omitted = main frame
max_lengthnumber–Max output chars
save_tostring–Absolute path: write the result (a string as is, anything else as JSON) there and return the path instead of the content
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
timeoutnumber–Max ms to wait for the result (default 30000); raise it for long async work

No output schema declared.

No examples provided.

extract ~212

Read repeated non-tabular structures — product cards, list items, search results — as one record per item: item_selector matches the repeating block, fields map output names to selectors relative to it. Read-only, deterministic, parsed server-side from the main-document HTML. Default output: total and shown, then one tab-separated row per item under the field names; a field with no match is empty (null in json).

NameTypeReqDescription
fieldsobjectyesfield name → {selector, attr}
formatstring–lines is compact; json keeps one object per record
item_selectorstringyesCSS selector matching each item
max_itemsnumber–Cap on records returned, in document order
max_lengthnumber–Max output chars
save_tostring–Absolute path: write the records as JSON there and return the path instead of the content
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

extract_table ~269

Read a real <table> as JSON: thead cells become keys, each row an object. Only for tabular markup — `where` filters rows server-side, so one matching row out of 1500 costs a few hundred bytes instead of the whole document. `row_count` is the table total, `match_count` how many rows passed the filter. No table at index is an error saying how many the selector found; for cards and lists use extract.

NameTypeReqDescription
columnsarray–Return only these columns per row.
indexnumber–Which table to take when the selector matches several, 0-based
max_rowsnumber–Max rows returned to you (output cap).
offsetnumber–Skip N rows of the (filtered) set before applying max_rows.
scan_rowsnumber–Max rows materialized in-page to scan/filter; raise for very large tables.
selectorstring–The table to read; ">>>" pierces shadow DOM
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
whereobject–{column: substring} rows must match, case-insensitive (names too). Key "any" matches any cell.

No output schema declared.

No examples provided.

fill_form ~237

Batch fill form fields with React-compatible events. Handles input, select, checkbox, radio, and textarea. Fields and submit take a CSS selector or a ref (n1, n2…) from navigate/get_interactives. With submit_selector it also submits, so a repeated call submits twice — not safe to retry blindly; after a submit, after_submit carries url, title and the text the page gained (the confirmation or the errors). Each field reports value_after and mismatch; page_changed carries the DOM delta, and the refs of what appeared.

NameTypeReqDescription
fieldsarrayyes{selector or ref, value or checked} per field
frame_idnumber–Target iframe id from get_frames; omitted = main frame
submit_refstring–Submit button as a ref, instead of submit_selector
submit_selectorstring–Submit button to click after filling
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
wait_afterstring–Settle before returning: navigation waits for a page load, networkidle for quiet traffic

No output schema declared.

No examples provided.

find_setting ~156

Where is a setting in an unknown admin panel: follows the panel's menu links (same origin) until a page contains the keyword. Returns the URL, the menu path (Settings › Media) and the matching text; when nothing matches, how many pages it tried. Navigates the tab and leaves it on the last page visited, at most max_pages.

NameTypeReqDescription
keywordstringyesWhat you are looking for, e.g. "webp", "cron", "maintenance mode"
max_pagesnumber–Pages visited at most
menu_selectorstring–Where the menu links are
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

find_text ~139

Find text on the page: parent selector, context, visibility, position per match. Attaches nearby interactive elements (with refs for click/type_text/hover) for the first visible match. Use it when you know the words on screen but not the selector (query_dom needs one); no match returns count 0.

NameTypeReqDescription
case_sensitiveboolean–Match case exactly
max_resultsnumber–Cap on matches returned, in document order
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
textstringyesLiteral text to find, not a regex

No output schema declared.

No examples provided.

full_page_screenshot ~208

Full-page capture by scrolling: stitched segments of ~2 viewports (≤1568px), or one image per viewport with stitch=false. Expensive: ~2.7k image tokens per segment, only max_segments returned, the rest via segment_offset. Reading the text you need is cheaper by an order of magnitude — prefer read_page, extract or find_text unless layout is the question.

NameTypeReqDescription
delaynumber–ms between captures (min 500, Chrome quota)
max_scrollsnumber–Cap on scroll steps: a taller page is captured only up to here
max_segmentsnumber–Images returned from the top (≈2.7k image tokens each); segment_offset for the rest
segment_offsetnumber–Skip the first N segments
stitchboolean–false = one image per viewport
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

get_css_styles ~242

Why an element looks the way it does: for each CSS property the winning declaration — selector, stylesheet, rule position, !important, @layer, @media — and the ones it overrides, like the Styles panel of DevTools; query_dom gives the computed value, this gives who set it. Read-only, from the CSSOM: stylesheets of another origin without CORS are opaque and listed by href; user-agent styles, @container and @scope rules are not evaluated. properties narrows the output.

NameTypeReqDescription
frame_idnumber–Target iframe id from get_frames; omitted = main frame
include_inheritedboolean–Also inherited properties (color, font-*, custom properties) with the ancestor that sets them
propertiesarray–Only these, e.g. ["margin-top","--brand"]; margin covers its longhands. Omitted = every property a matching rule sets
selectorstringyesCSS selector; ">>>" pierces shadow DOM. Only the first match is inspected
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

get_frames ~59

List frames (main + iframes) with frameId, parent, URL — for the frame_id parameter of DOM tools.

NameTypeReqDescription
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

get_interactives ~240

List actionable elements (buttons, links, inputs, [role], [onclick]) with ready-to-use CSS selector, label, position, flags. Prefer this over dumping HTML to discover selectors. Document order, cut at limit (count equal to limit: there may be more), each with a ref (n1, n2…) for click, type_text and hover. The full list also names the WebMCP tools the page declares, if any.

NameTypeReqDescription
formatstring–lines is compact; json adds full attributes per element
frame_idnumber–Target iframe id from get_frames; omitted = main frame
limitnumber–Max elements returned; raise it on a dense page
scopestring–Limit search (CSS selector)
sincestring–cursor from the previous list: only added (+), changed (~) and removed elements; same scope, frame and tab
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
visible_onlyboolean–false also lists elements hidden or scrolled out of view

No output schema declared.

No examples provided.

get_page_info ~171

Page metadata: title, url, visibility, doctype, charset, meta tags, scripts, stylesheets, links and forms. visibility=hidden means the window is minimized, covered or in the background: the page does not render (screenshots fail) and its timers slow down. dev.server names a dev server (vite, webpack-dev-server, next, nuxt) and dev.overlay carries the compiler message when an error overlay is open: read it before treating the page as valid. For the text use read_page, for specific elements query_dom, for the bridge itself get_status.

NameTypeReqDescription
frame_idnumber–Target iframe id from get_frames; omitted = main frame
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

get_status ~276

Status of the bridge itself, not of a page: call it when a tool you expect is missing or browser commands fail (connected=false: the extension is not reachable, extension_install gives its Chrome Web Store link). Also reports mode (primary/relay), host, port, server and extension versions, js_evaluation (false under --no-js), write_root, read_root, session_tab_id (the implicit tab), owned_tabs (created by this session), uptime_sec, webmcp (whether WebMCP is active in the session tab, and how to enable it). caps_active and caps_available: a missing tool lives in an inactive cap. enable is the only change it makes: it switches caps on for this session, no restart, and lists the tools added. Optional caps: audits (cookie_audit); visual (inject_css, measure_spacing, emulate_media, viewport_resize); perf (animations, frames, perf_trace, screencast, lighthouse, heap_snapshot); network (http_auth, set_geolocation, track_events); storage (get_storage, set_storage, session_fixture); dom (modify_dom, watch_dom, drag_and_drop); files (save_page, manage_downloads, session_record).

NameTypeReqDescription
enablearray–Caps to switch on now, all in one call; "all" = every cap

No output schema declared.

No examples provided.

get_tabs ~115

List every open tab with id, url, title, active flag and mine (created by this session). Find a tab_id when the implicit target is not the one you mean. include_windows adds position, size, state and type of each window — needed before moving or tiling. Session tabs gone since the last call come back once in closed_session_tabs with the reason (closed, window_closed, replaced, closed_by_bridge).

NameTypeReqDescription
include_windowsboolean–Also return the windows with bounds, state, type and tab count

No output schema declared.

No examples provided.

handle_dialogs ~94

Auto-accept/dismiss future JS dialogs (alert/confirm/prompt), logging them. reset restores native dialogs and returns the log.

NameTypeReqDescription
actionstring–accept/dismiss auto-answer future dialogs; reset restores native behaviour
prompt_textstring–Returned by window.prompt on accept
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

handoff ~283

Hand the browser to the user for what only a person can do — 2FA, CAPTCHA, login, a choice — and wait: a banner in the page shows your message with Done/Cancel, the call returns on click or timeout, redirects included. pick_element: the user clicks an element and you get its selector. Never type credentials yourself. ask: the user types a reply in the banner ("which of the three?") and you get it as answer. pick_max: with pick_element, up to N elements; the user presses Done when finished.

NameTypeReqDescription
askboolean–Show a text box in the banner; the reply comes back as answer
in_terminalboolean–Also ask in the Claude Code terminal (MCP elicitation) when the client supports it; the first answer wins. Not for pick_element
messagestringyesWhat the user should do, one line
pick_elementboolean–Ask the user to click an element; returns its selector, text and box
pick_maxnumber–With pick_element: up to N elements, the user presses Done when finished
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
timeoutnumber–ms to wait for the click, default 5 min

No output schema declared.

No examples provided.

hover ~159

Hover over an element, by CSS selector or ref. Default: synthetic mouseenter/mouseover/mousemove, which fire JS hover handlers but not CSS :hover. trusted moves the real mouse pointer (chrome.debugger), so CSS :hover rules and their transitions apply.

NameTypeReqDescription
frame_idnumber–Target iframe id from get_frames; omitted = main frame
refstring–From get_interactives
selectorstring–CSS selector; ">>>" pierces shadow DOM
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
trustedboolean–Real browser pointer via chrome.debugger, main frame only: needed for CSS :hover

No output schema declared.

No examples provided.

http_request ~201

HTTP request sent from the browser, with the logged-in user's cookies: fetches what a server-side request gets a login page for (invoices, authenticated JSON, exports). Text bodies inline (capped by max_length); save_to writes the bytes — the way to read a PDF, since read_page returns nothing on a PDF tab, and the way to save any file that has a URL: no click on Download, no browser download, no "Save as" dialog.

NameTypeReqDescription
bodystring–Request body (POST/PUT/PATCH)
headersobject–Extra request headers
max_lengthnumber–Max chars of body returned inline
methodstring–HEAD fetches headers only, without the body
save_tostring–Absolute path: write the response bytes here instead of returning them (PDF, images, archives)
urlstringyesAbsolute URL. Cookies are sent for its origin

No output schema declared.

No examples provided.

monitor_network ~191

Monitor network requests. source=page: XHR/fetch hook (installed on first call); source=browser: all requests incl. static assets; source=websocket: connections and messages. format=har exports HAR 1.2. It only observes: to block, stub or rewrite requests use network_rules, to send one yourself http_request.

NameTypeReqDescription
clearboolean–Clear buffer after read
formatstring–har exports HAR 1.2 for external tooling
limitnumber–Most recent; buffer 1000
sincestring–cursor from the previous read: only newer entries, nothing deleted
sourcestring–page: XHR/fetch only; browser: static assets too; websocket: connections and messages
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

move_tab ~245

Move an existing tab into another window (chrome.tabs.move), keeping id, history and page state; works on chrome-untrusted:// tabs too. The **destination** must be a normal window: out of an app/popup window is fine, into one is refused. A ChromeOS Terminal tab can be pulled out (new_window, window_type popup) but never merged back: extensions cannot create app windows.

NameTypeReqDescription
heightnumber–New window height px (new_window)
indexnumber–Position in the destination window; -1 appends at the end
leftnumber–New window x (new_window)
new_windowboolean–Extract the tab into a fresh window instead of an existing one
tab_idnumberyesTab to move; get it from get_tabs
topnumber–New window y (new_window)
widthnumber–New window width px (new_window)
window_idnumber–Destination window; get_tabs reports windowId for every tab
window_typestring–new_window only: popup has no tab strip nor omnibox, the terminal-window look

No output schema declared.

No examples provided.

navigate ~138

Navigate a Chrome tab to a URL and wait for the load; DNS and connection errors fail the call. Without tab_id it reuses the tab this session last navigated or created, else opens a new one rather than taking over the active tab. Returns a preview of interactive elements with refs usable in click/type_text/hover, plus the first console errors and failed requests, if any, and the WebMCP tools the page declares.

NameTypeReqDescription
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
urlstringyesAbsolute URL, or a path resolved against the current page

No output schema declared.

No examples provided.

network_rules ~314

Network interception, browser-wide, survives reloads until cleared: block, redirect, set/remove headers, stub a synthetic body, or record real API responses and replay them with forced errors/latency (local helper; from HTTPS pages the stub host must be trusted). It changes traffic, while monitor_network only observes it and http_request sends one request; each rule comes back as added, list shows them, clear removes them all.

NameTypeReqDescription
actionstringyesrecord saves the page's API responses (url_filter) as a fixture, replay serves them with overrides; list/clear
bodystring–Response body (action=stub)
content_typestring–action=stub
headerstring–Header name for action=modify_header, e.g. "User-Agent"
header_targetstring–response = strip content-security-policy / x-frame-options, inject CORS
header_valuestring–Omit to remove header
namestring–Fixture name for record/replay
overridesarray–replay: force a status, body or delay on matching URLs — error states a real backend will not produce
redirect_urlstring–Destination for action=redirect
resource_typesarray–Limit the rule to these request types; omitted = all of them
statusnumber–action=stub
url_filterstring–declarativeNetRequest urlFilter, e.g. "||example.com/api/*"

No output schema declared.

No examples provided.

press_key ~237

Send a key to the focused element (or to selector, focusing it first) as a real keydown/keypress/keyup sequence, so framework handlers fire. For typing a value use type_text; this is for Enter, Tab, Escape, arrows and shortcuts. Not idempotent: two calls send the key twice. Returns page_changed like click; when the key opens or reveals something, the refs of the visible interactives follow.

NameTypeReqDescription
altboolean–Hold Alt
ctrlboolean–Hold Control
frame_idnumber–Target iframe id from get_frames; omitted = main frame
keystringyese.g. "Enter", "Escape", "Tab", "ArrowDown"
metaboolean–Hold Meta (Command/Windows)
selectorstring–Target (default: activeElement)
shiftboolean–Hold Shift
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
trustedboolean–Real browser key (isTrusted) via chrome.debugger, main frame only

No output schema declared.

No examples provided.

query_dom ~175

Query DOM elements by CSS selector, returning structure, attributes, bounding rect and, with properties, computed styles. Use it when you already have a selector (no match: count 0); to find one, get_interactives or find_text; for the rule that set a style, get_css_styles.

NameTypeReqDescription
frame_idnumber–Target iframe id from get_frames; omitted = main frame
limitnumber–Max elements returned, from the top of the match list
propertiesarray–Computed styles to include, e.g. ["color"]
selectorstringyesCSS selector; ">>>" pierces shadow DOM. Matches all, not just the first
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

read_console ~182

Read console messages captured since page load, incl. uncaught errors and unhandled rejections. clear deletes the messages it returns, hence not read-only; since=cursor reads only newer ones without deleting, and failed requests are in monitor_network.

NameTypeReqDescription
clearboolean–Clear buffer after read
formatstring–lines is compact; json keeps timestamps and stack traces
levelstring–all merges every level in one chronological list
limitnumber–Most recent; buffer 1000
sincestring–cursor from the previous read: only newer entries, nothing deleted
sourcemapboolean–Resolve bundle.js:line:col frames to source files through their source maps
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

read_form ~114

Read a form as the user filled it — label, type, value, checked/selected, required-but-empty, browser validity — to check it against the project's documents before an irreversible Submit. Password and card values come back [redacted]. Read-only, on request; to change values use fill_form.

NameTypeReqDescription
selectorstring–The form or container; omitted = every visible control on the page
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

read_page ~190

Read the page as text (default), markdown, raw HTML, or accessibility tree. Read-only. markdown keeps headings, links and tables at a fraction of the HTML cost. Expensive on big pages: HTML on a large table costs tens of thousands of tokens for data you filter anyway — prefer extract_table/extract for repeated content, get_interactives for click targets.

NameTypeReqDescription
frame_idnumber–Target iframe id from get_frames; omitted = main frame
max_lengthnumber–Max output chars
modestring–text strips markup; markdown keeps headings/links/tables far cheaper than html; accessibility = a11y tree
save_tostring–Absolute path: write the page there and return the path instead of the content
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

screenshot ~183

Screenshot of the visible viewport only (PNG), at the current scroll position, or one per viewport preset with presets. Read-only. Activates the tab in the background without stealing window focus, then restores the previous tab. Downscaled to ≤1568px: for fine print, element_screenshot with scale.

NameTypeReqDescription
if_changedboolean–Same pixels as the last screenshot of this tab: a note instead of the image. false = always send it
presetsarray–Resizes the window per preset, then restores it; not phone emulation. A refused width is reported, not shot. save_to = directory
save_tostring–Absolute path: write the PNG there and return the path instead of the content
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

screenshot_diff ~268

Visual regression: save a named baseline (viewport, element, or a PNG such as the design mockup) and compare later — changed-pixel % and a red-highlighted diff; or compare_urls: production vs staging in this tab, pixels plus text diff, logged-in pages included. Baselines are in-memory (lost on service worker restart).

NameTypeReqDescription
actionstringyesbaseline stores, compare measures against it, compare_urls diffs url_a vs url_b here, clear drops baselines
from_filestring–action=baseline: take it from this PNG (design mockup) instead of capturing
maskarray–compare_urls: selectors hidden on both pages (dates, carousels, ads)
namestring–Baseline id: reuse the same one to compare across runs
selectorstring–Capture one element (default viewport)
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
thresholdnumber–Per-channel tolerance 0-255
url_astring–compare_urls: reference page, e.g. production
url_bstring–compare_urls: page under test, e.g. staging or a PR preview

No output schema declared.

No examples provided.

scroll ~322

Scroll. action=to: once to element/coordinates; action=until: repeatedly until element visible, network idle, or no new content (infinite scroll). It moves the tab's scroll position and returns it (to) or stopped_reason and steps (until); full_page_screenshot scrolls by itself, wait_for waits without scrolling.

NameTypeReqDescription
actionstring–to jumps to a position or element; until scrolls repeatedly to load more
behaviorstring–instant avoids waiting for smooth-scroll animations
containerstring–until: selector that scrolls; default the document, or the largest scrollable element if the document does not scroll
frame_idnumber–Target iframe id from get_frames; omitted = main frame
max_scrollsnumber–Cap on scroll steps, so an infinite feed terminates
offset_ynumber–px offset for fixed headers (to)
selectorstring–Target (to) or stop element (until=element)
settle_msnumber–Pause ms after each step
step_pxnumber–px per step, default viewport height
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
untilstring–no_new_content stops when the page height stops growing
xnumber–Absolute horizontal position in px (action=to, without selector)
ynumber–Absolute vertical position in px (action=to, without selector)

No output schema declared.

No examples provided.

tab_action ~155

Tab lifecycle: close, activate, reload, back, forward, discard, mute, duplicate, close_session (only tabs this session created). close drops unsaved work and cannot be undone — it may be the user's tab. reload drops injected CSS, emulations and hooks. duplicate works where create_tab is forbidden (chrome-untrusted://) and lands in the source window, app windows included. discard replaces the tab id.

NameTypeReqDescription
actionstringyesclose cannot be undone; discard frees memory (reloads on focus); reload drops injected CSS and hooks
bypass_cacheboolean–reload only
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

tile_windows ~219

Tile Chrome windows over one monitor in equal parts with no gap. Only Chrome windows. The monitor is the one of a window already on it, whose work area is read from a page there: at least one target needs a scriptable tab (not chrome://). Maximized windows are restored first, since maximized ignores bounds. To restore a saved arrangement use window_layout; to move one tab into another window, move_tab.

NameTypeReqDescription
areaobject–Monitor area to fill, when no target window has a scriptable tab to read it from
include_typesarray–Window types to include; omitted = normal only
layoutstring–columns splits left to right, rows top to bottom, grid keeps tiles as square as it can
paddingnumber–Px of empty margin kept inside the work area
reference_window_idnumber–Window whose monitor is used; omitted = the focused one
window_idsarray–Windows to tile; omitted = every normal window on the reference monitor

No output schema declared.

No examples provided.

type_text ~260

Put text into an input, textarea or contenteditable, by selector or ref. Replaces the whole value through the native setter (React/Vue controlled inputs register it) and fires input and change. mode=keys emits keydown/input/keyup per character for autocomplete and masked fields: slower, use it only when mode=set leaves the field empty. Returns value_after; mismatch=true means the field did not keep the value: retry with mode=keys.

NameTypeReqDescription
frame_idnumber–Target iframe id from get_frames; omitted = main frame
modestring–set = assign value; keys = per-char events (autocomplete/masked); trusted = real input via chrome.debugger, main frame
refstring–From get_interactives, e.g. "n3"
selectorstring–CSS selector; ">>>" pierces shadow DOM. Ignored when ref is given
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
textstringyesValue to type; empty string clears the field
wait_afterstring–Settle before returning: navigation waits for a page load, networkidle for quiet traffic

No output schema declared.

No examples provided.

upload_file ~178

Set a file on input[type=file] from the server filesystem via DataTransfer (max 200 MB; over 6 MB it travels in pieces). Keys and credentials (~/.ssh, ~/.aws, ~/.gnupg, .env*, *.pem, *.key, id_*…) are refused, and a --read-root on the server limits the readable tree: the call fails with an error, nothing is read.

NameTypeReqDescription
mime_typestring–Default: inferred from extension
pathstringyesAbsolute path on the server machine; keys and credentials (~/.ssh, .env, *.pem) refused
selectorstringyesThe file input to fill; ">>>" pierces shadow DOM
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

wait_for ~284

Block until a condition holds: element, text, function (JS expression; needs the "Allow user scripts" toggle), navigation (mode=spa for client-side routes), network_idle. Polls until timeout (10s element/function, 15s the rest) then **returns `found: false` with a reason instead of raising**: check it, or a failed wait reads as success. Read-only.

NameTypeReqDescription
conditionstringyeselement and text need selector or text; function needs expression
expressionstring–JS expression (condition=function)
frame_idnumber–Target iframe id from get_frames; omitted = main frame
idle_msnumber–Quiet period ms (network_idle)
intervalnumber–Poll ms, min 50
modestring–spa = pushState/popstate/hashchange
selectorstring–condition=element; with condition=text it narrows the search to that subtree
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
textstring–Literal text to wait for (condition=text), matched case-insensitively
timeoutnumber–Max ms (default 10000; 15000 navigation/network_idle)
visibleboolean–Element must also be visible

No output schema declared.

No examples provided.

watch ~280

Keep watching a page in the background — "tell me when the pipeline is green / the Approve button appears / this number changes" — checked every interval_s by the extension. Events are collected, not pushed: action=poll, or a script blocking on "chrome-bridge watch --wait <name>". Survives extension idling, not a browser restart. poll returns one line per event (time, name, kind, url, value, previous); a change due within seconds is wait_for.

NameTypeReqDescription
actionstring–poll = events since a timestamp
expires_minnumber–Give up after
interval_snumber–Between checks, min 30
namestring–Watch id
reloadboolean–Reload before each check, for pages that do not update live
selectorstring–Element that appears (until=match) or disappears (until=gone)
sincenumber–poll: events after this ms timestamp
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
textstring–Text that appears / disappears
untilstring–Default: change with value_of, else match
value_ofstring–Element whose text changing fires (until=change)

No output schema declared.

No examples provided.

webmcp_call ~217

Run a WebMCP tool the page declares (see webmcp_tools or the webmcp line of navigate): one call instead of the clicks and fields it replaces. Returns status (ok, error, timeout, not_found, inactive, needs_confirmation), the tool result and ms; navigated_to when the call led to another page. A sensitive tool (buy, pay, send, delete, a POST form) is not run without confirm:true: on needs_confirmation ask the user, then repeat with confirm.

NameTypeReqDescription
confirmboolean–true only after the user approved this sensitive action
frame_idnumber–Target iframe id from get_frames; omitted = main frame
inputobject–Arguments matching the tool input_schema
namestringyesTool name as listed by webmcp_tools
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one
timeoutinteger–Abort the tool after this many ms

No output schema declared.

No examples provided.

webmcp_tools ~188

List the WebMCP tools the page declares for agents: name, description, input_schema, origin, kind (imperative = registered with document.modelContext.registerTool; declarative = a <form toolname>), sensitive (why webmcp_call wants confirm) and how many times each was called. active=false: WebMCP is off in this Chrome and only form tools are visible, as plain forms. calls adds the call log of the page, any caller (chrome-bridge or the browser agent): input, output, status, ms.

NameTypeReqDescription
callsinteger–Also return the last N calls from the log; 0 = tools only
frame_idnumber–Target iframe id from get_frames; omitted = main frame
tab_idnumber–Target tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

window_layout ~90

Save the current window arrangement under a name, restore, list or delete. save overwrites silently. Window ids do not survive a browser restart: restore matches windows by the overlap of their tab URLs and reports the ones it cannot recognise instead of guessing.

NameTypeReqDescription
actionstringyessave snapshots every window; restore repositions the recognised ones
namestring–Layout name, required except for list

No output schema declared.

No examples provided.

Install

How do I install the io.github.frsorrentino/chrome-bridge MCP server?

io.github.frsorrentino/chrome-bridge runs locally as an npm package, launched with npx -y chrome-bridge-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · chrome-bridge-mcp

# add to Claude Code
claude mcp add frsorrentino-chrome-bridge -- npx -y chrome-bridge-mcp
Common questions

What is the io.github.frsorrentino/chrome-bridge MCP server?

io.github.frsorrentino/chrome-bridge is an MCP server listed in the public MCP registry as io.github.frsorrentino/chrome-bridge. Borrow a tab from your own logged-in Chrome, hand it back; 2FA and CAPTCHA stay yours. 69 tools. This page covers its npm package (chrome-bridge-mcp).

Is the io.github.frsorrentino/chrome-bridge MCP server safe to use?

io.github.frsorrentino/chrome-bridge scores 93 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.frsorrentino/chrome-bridge MCP server expose?

io.github.frsorrentino/chrome-bridge exposes 46 tools: get_status, get_tabs, navigate, screenshot, execute_js, and 41 more. Their descriptions and schemas cost roughly 9,207 tokens of context every time the server is loaded.

Is the io.github.frsorrentino/chrome-bridge MCP server still maintained?

io.github.frsorrentino/chrome-bridge is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.frsorrentino/chrome-bridge MCP server under?

io.github.frsorrentino/chrome-bridge declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.