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 · SCANNED SEP 20

Your real, logged-in Chrome as an MCP server: 59 token-efficient web-dev tools. ChromeOS included.

Available components

0 this week 94 Trust /100
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
  • 32 of 110 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • 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 8 days ago).Pass
  • Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability73
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 6045 tokens (~159/item across 38 items; 38 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 39 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
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
// .cursor/mcp.json
{
  "mcpServers": {
    "frsorrentino-chrome-bridge": {
      "command": "npx",
      "args": [
        "-y",
        "chrome-bridge-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "frsorrentino-chrome-bridge": {
      "command": "npx",
      "args": [
        "-y",
        "chrome-bridge-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add frsorrentino-chrome-bridge -- npx -y chrome-bridge-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "frsorrentino-chrome-bridge": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "chrome-bridge-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add frsorrentino-chrome-bridge --command npx --arg -y --arg chrome-bridge-mcp
# ~/.hermes/config.yaml
mcp_servers:
  frsorrentino-chrome-bridge:
    command: "npx"
    args: ["-y", "chrome-bridge-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "frsorrentino-chrome-bridge": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "chrome-bridge-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add frsorrentino-chrome-bridge -t stdio -c npx -a -y chrome-bridge-mcp
// mcp.json
{
  "mcpServers": {
    "frsorrentino-chrome-bridge": {
      "command": "npx",
      "args": [
        "-y",
        "chrome-bridge-mcp"
      ]
    }
  }
}
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.

  • 20 Sept 26 0
    • Stability: 0.97 → pass security
    • Security disclosure: fail → unverified functional
    • Package version: 1.15.1 → 1.17.0 functional
  • 19 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Sept 26 0
    • Security disclosure: unverified → fail functional
  • 15 Sept 26 −2
    • Security disclosure: fail → unverified functional
    • Stability: pass → 0.83 functional
  • 14 Sept 26 0
    • Stability: 0.97 → pass security
  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 12 Sept 26 +15
    • Malware scan: unverified → pass security
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 20 Sept 2026 · Analysed npm/chrome-bridge-mcp@1.17.0

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.17.0
Rekor log index 2791692359
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:51da8b6a727c9eb8821ae23e5297936e051753075548de886993b7a3829f8c113c8cbf4be3b07c1dcd5a6b16b82c84625eabb6a33260b2ef51a0c251d

Background: How many MCP packages publish verified provenance →

Dependencies 110 packages
Packages resolved 110
Stale 32
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 38 exposed · ~5,817 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 ~188

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.

NameTypeReqDescription
countnumberExact match count for selector
selectorstringElement the assertion is about; ">>>" pierces shadow DOM
statestringattached means present in the DOM, visible also requires a rendered box
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
textstringIn the element (with selector) or anywhere on the page
timeoutnumberMax ms to wait for the condition before failing
titlestringTab title pattern
urlstringTab url pattern

No output schema declared.

No examples provided.

click ~271

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.

NameTypeReqDescription
buttonstringright opens the page context menu instead of activating the element
countnumber2 emits dblclick after the two clicks, which is what selects a word or opens an editor
forcebooleanClick even if occluded
frame_idnumberTarget iframe id from get_frames; omitted = main frame
refstringFrom get_interactives, e.g. "n3"
selectorstringCSS selector; ">>>" pierces shadow DOM. Ignored when ref is given
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
wait_afterstringSettle before returning: navigation waits for a page load, networkidle for quiet traffic

No output schema declared.

No examples provided.

clipboard ~88

Read or write the system clipboard (text). Activates the tab first. write overwrites whatever the user had copied, which is not recoverable.

NameTypeReqDescription
actionstringyeswrite takes text; read returns the current clipboard contents
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
textstringFor 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
activebooleanfalse opens the tab in the background, leaving the current one focused
heightnumberWindow height px (new_window)
leftnumberWindow x on the virtual desktop (new_window)
new_windowbooleanOpen in a fresh window instead of a tab; with left/top it lands on the chosen monitor
topnumberWindow y (new_window)
urlstringURL to open (default: new tab page)
widthnumberWindow 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_idnumberTarget 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
regionobjectBox in viewport CSS px (the rect frame of get_interactives/query_dom), instead of selector
scalenumberEnlargement of the crop, 1-4; output still capped at 1568px
selectorstringCSS selector; ">>>" pierces shadow DOM. The element is scrolled into view first
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

execute_js ~111

Run JavaScript in the page (MAIN world). Requires the extension's "Allow user scripts" toggle; errors explain setup if disabled.

NameTypeReqDescription
codestringyesJS evaluated in the page; the value of the last expression is returned
frame_idnumberTarget iframe id from get_frames; omitted = main frame
max_lengthnumberMax output chars
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

extract ~181

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.

NameTypeReqDescription
fieldsobjectyesfield name → {selector, attr}
formatstringlines is compact; json keeps one object per record
item_selectorstringyesCSS selector matching each item
max_itemsnumberCap on records returned, in document order
max_lengthnumberMax output chars
save_tostringAbsolute path: write the records as JSON there and return the path instead of the content
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

fill_form ~160

Batch fill form fields with React-compatible events. Handles input, select, checkbox, radio, and textarea. With submit_selector it also submits, so a repeated call submits twice — not safe to retry blindly. Each field reports value_after and mismatch; page_changed carries the DOM delta.

NameTypeReqDescription
fieldsarrayyes{selector, value} pairs
frame_idnumberTarget iframe id from get_frames; omitted = main frame
submit_selectorstringSubmit button to click after filling
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
wait_afterstringSettle before returning: navigation waits for a page load, networkidle for quiet traffic

No output schema declared.

No examples provided.

find_setting ~133

Where is a setting in an unknown admin panel: follows the panel's menu links (same origin) until a page contains the keyword and reports the menu path. Navigates the tab, leaves it on the page found, stops at max_pages.

NameTypeReqDescription
keywordstringyesWhat you are looking for, e.g. "webp", "cron", "maintenance mode"
max_pagesnumberPages visited at most
menu_selectorstringWhere the menu links are
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

find_text ~113

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.

NameTypeReqDescription
case_sensitivebooleanMatch case exactly
max_resultsnumberCap on matches returned, in document order
tab_idnumberTarget 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
delaynumberms between captures (min 500, Chrome quota)
max_scrollsnumberCap on scroll steps: a taller page is captured only up to here
max_segmentsnumberImages returned from the top (≈2.7k image tokens each); segment_offset for the rest
segment_offsetnumberSkip the first N segments
stitchbooleanfalse = one image per viewport
tab_idnumberTarget 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_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

get_interactives ~157

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.

NameTypeReqDescription
formatstringlines is compact; json adds full attributes per element
frame_idnumberTarget iframe id from get_frames; omitted = main frame
limitnumberMax elements returned; raise it on a dense page
scopestringLimit search (CSS selector)
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
visible_onlybooleanfalse also lists elements hidden or scrolled out of view

No output schema declared.

No examples provided.

get_page_info ~70

Get page metadata: meta tags, scripts, stylesheets, links, and forms

NameTypeReqDescription
frame_idnumberTarget iframe id from get_frames; omitted = main frame
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

get_status ~26

Check bridge status: extension connection, server mode (primary/relay), port, version

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_tabs ~89

List every open tab with id, url, title, active flag and mine (created by this session). Read-only. 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.

NameTypeReqDescription
include_windowsbooleanAlso 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
actionstringaccept/dismiss auto-answer future dialogs; reset restores native behaviour
prompt_textstringReturned by window.prompt on accept
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

handoff ~247

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
askbooleanShow a text box in the banner; the reply comes back as answer
messagestringyesWhat the user should do, one line
pick_elementbooleanAsk the user to click an element; returns its selector, text and box
pick_maxnumberWith pick_element: up to N elements, the user presses Done when finished
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
timeoutnumberms to wait for the click, default 5 min

No output schema declared.

No examples provided.

hover ~104

Hover over an element (mouseenter/mouseover), by CSS selector or ref.

NameTypeReqDescription
frame_idnumberTarget iframe id from get_frames; omitted = main frame
refstringFrom get_interactives
selectorstringCSS selector; ">>>" pierces shadow DOM. Triggers CSS and JS hover handlers
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

http_request ~173

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.

NameTypeReqDescription
bodystringRequest body (POST/PUT/PATCH)
headersobjectExtra request headers
max_lengthnumberMax chars of body returned inline
methodstringHEAD fetches headers only, without the body
save_tostringAbsolute 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 ~150

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.

NameTypeReqDescription
clearbooleanClear buffer after read
formatstringhar exports HAR 1.2 for external tooling
limitnumberMost recent; buffer 1000
sourcestringpage: XHR/fetch only; browser: static assets too; websocket: connections and messages
tab_idnumberTarget 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
heightnumberNew window height px (new_window)
indexnumberPosition in the destination window; -1 appends at the end
leftnumberNew window x (new_window)
new_windowbooleanExtract the tab into a fresh window instead of an existing one
tab_idnumberyesTab to move; get it from get_tabs
topnumberNew window y (new_window)
widthnumberNew window width px (new_window)
window_idnumberDestination window; get_tabs reports windowId for every tab
window_typestringnew_window only: popup has no tab strip nor omnibox, the terminal-window look

No output schema declared.

No examples provided.

navigate ~74

Navigate a Chrome tab to a URL. Returns a preview of interactive elements with refs usable in click/type_text/hover.

NameTypeReqDescription
tab_idnumberTarget 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.

press_key ~192

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.

NameTypeReqDescription
altbooleanHold Alt
ctrlbooleanHold Control
frame_idnumberTarget iframe id from get_frames; omitted = main frame
keystringyese.g. "Enter", "Escape", "Tab", "ArrowDown"
metabooleanHold Meta (Command/Windows)
selectorstringTarget (default: activeElement)
shiftbooleanHold Shift
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

query_dom ~132

Query DOM elements by CSS selector, returning structure, attributes, bounding rect, and computed styles.

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

No output schema declared.

No examples provided.

read_console ~133

Read console messages captured since page load, incl. uncaught errors and unhandled rejections.

NameTypeReqDescription
clearbooleanClear buffer after read
formatstringlines is compact; json keeps timestamps and stack traces
levelstringall merges every level in one chronological list
limitnumberMost recent; buffer 1000
sourcemapbooleanResolve bundle.js:line:col frames to source files through their source maps
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

read_form ~107

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.

NameTypeReqDescription
selectorstringThe form or container; omitted = every visible control on the page
tab_idnumberTarget 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_idnumberTarget iframe id from get_frames; omitted = main frame
max_lengthnumberMax output chars
modestringtext strips markup; markdown keeps headings/links/tables far cheaper than html; accessibility = a11y tree
save_tostringAbsolute path: write the page there and return the path instead of the content
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

screenshot ~140

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
presetsarrayOne capture per preset, window restored; save_to = directory, one file each
save_tostringAbsolute path: write the PNG there and return the path instead of the content
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

scroll ~256

Scroll. action=to: once to element/coordinates; action=until: repeatedly until element visible, network idle, or no new content (infinite scroll).

NameTypeReqDescription
actionstringto jumps to a position or element; until scrolls repeatedly to load more
behaviorstringinstant avoids waiting for smooth-scroll animations
frame_idnumberTarget iframe id from get_frames; omitted = main frame
max_scrollsnumberCap on scroll steps, so an infinite feed terminates
offset_ynumberpx offset for fixed headers (to)
selectorstringTarget (to) or stop element (until=element)
settle_msnumberPause ms after each step
step_pxnumberpx per step, default viewport height
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
untilstringno_new_content stops when the page height stops growing
xnumberAbsolute horizontal position in px (action=to, without selector)
ynumberAbsolute 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_cachebooleanreload only
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one

No output schema declared.

No examples provided.

tile_windows ~199

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.

NameTypeReqDescription
areaobjectMonitor area to fill, when no target window has a scriptable tab to read it from
include_typesarrayWindow types to include; omitted = normal only
layoutstringcolumns splits left to right, rows top to bottom, grid keeps tiles as square as it can
paddingnumberPx of empty margin kept inside the work area
reference_window_idnumberWindow whose monitor is used; omitted = the focused one
window_idsarrayWindows to tile; omitted = every normal window on the reference monitor

No output schema declared.

No examples provided.

type_text ~248

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_idnumberTarget iframe id from get_frames; omitted = main frame
modestringset = assign value; keys = per-char events (autocomplete/masked)
refstringFrom get_interactives, e.g. "n3"
selectorstringCSS selector; ">>>" pierces shadow DOM. Ignored when ref is given
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
textstringyesValue to type; empty string clears the field
wait_afterstringSettle before returning: navigation waits for a page load, networkidle for quiet traffic

No output schema declared.

No examples provided.

upload_file ~100

Set a file on input[type=file] from the server filesystem via DataTransfer (max 10MB).

NameTypeReqDescription
mime_typestringDefault: inferred from extension
pathstringyesAbsolute path on the server machine
selectorstringyesThe file input to fill; ">>>" pierces shadow DOM
tab_idnumberTarget 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
expressionstringJS expression (condition=function)
frame_idnumberTarget iframe id from get_frames; omitted = main frame
idle_msnumberQuiet period ms (network_idle)
intervalnumberPoll ms, min 50
modestringspa = pushState/popstate/hashchange
selectorstringcondition=element; with condition=text it narrows the search to that subtree
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
textstringLiteral text to wait for (condition=text), matched case-insensitively
timeoutnumberMax ms (default 10000; 15000 navigation/network_idle)
visiblebooleanElement must also be visible

No output schema declared.

No examples provided.

watch ~252

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.

NameTypeReqDescription
actionstringpoll = events since a timestamp
expires_minnumberGive up after
interval_snumberBetween checks, min 30
namestringWatch id
reloadbooleanReload before each check, for pages that do not update live
selectorstringElement that appears (until=match) or disappears (until=gone)
sincenumberpoll: events after this ms timestamp
tab_idnumberTarget tab; omitted = last tab navigated in this session, else the active one
textstringText that appears / disappears
untilstringDefault: change with value_of, else match
value_ofstringElement whose text changing fires (until=change)

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
namestringLayout name, required except for list

No output schema declared.

No examples provided.

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. Your real, logged-in Chrome as an MCP server: 59 token-efficient web-dev tools. ChromeOS included. 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 94 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 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 38 tools: get_status, get_tabs, navigate, screenshot, execute_js, and 33 more. Their descriptions and schemas cost roughly 5,817 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 20 September 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.