Skip to content

Releases: Mehmoodqureshi/chrome-mcp

v0.9.15 — drop the redundant activeTab permission

Choose a tag to compare

@github-actions github-actions released this 09 Oct 17:06

The extension asks for one permission fewer. No behaviour changes. The
extension moves to 0.9.15.

  • chore: the extension no longer requests activeTab. It already holds
    host access to all sites (narrowed at run time by the server's domain
    allowlist), which covers everything activeTab granted; finding the tab you
    are looking at only needs tabs. Checked in a real Chrome: screenshots of
    the front tab and of a background tab, reading, snapshots and opening tabs
    all work without it.
  • docs: the Chrome Web Store permission justifications in docs/WEBSTORE.md
    now cover the tab outline (scripting) and its setting (storage).

v0.9.14 — renamed to MCP Browser Extension, new site address

Choose a tag to compare

@github-actions github-actions released this 09 Oct 16:52

The extension is now called MCP Browser Extension, and the project site moved
to https://mcp-browser-extension.vercel.app. No behaviour changes. The
extension moves to 0.9.14.

  • chore: the extension is renamed MCP Browser Extension (was "MCP
    Extension for Chrome"), in its manifest, toolbar tooltips and Options page
    title. The Chrome Web Store item id is unchanged, so existing installs and
    store links keep working.
  • docs: the site address is now https://mcp-browser-extension.vercel.app in
    package.json, server.json, the extension's homepage link and the store
    notes. The old chrome-mcp-omega.vercel.app address redirects there.
  • docs: the --tools section of the README now reflects the 40-tool catalog:
    28 KB (about 7.1k tokens) for the full list, and a 78% cut for the
    seven-tool example.

v0.9.13 — tab border, fresh screenshots

Choose a tag to compare

@github-actions github-actions released this 26 Sep 10:35

You can now see which tabs the agent is working in, and screenshots no longer
come back stale. The extension moves to 0.9.13.

  • feat: a border marks every tab chrome-mcp is working in. It takes the
    site's own theme colour when that stands out from the page, and is blue
    otherwise (a lighter blue on dark pages). It is drawn with a user stylesheet,
    so get_html, get_text and snapshot never see it, and it is taken down
    for screenshots and PDFs. It follows the tab to each new page, goes away when
    the tab leaves the allowed sites or the server disconnects, and can be turned
    off on the extension's Options page ("Outline the tabs chrome-mcp is working
    in").
  • fix: screenshots always render a fresh frame. A plain viewport capture
    of the tab in front returned the frame last shown on screen, which could
    predate a change made just before the call and sometimes left a grey strip at
    the bottom. Viewport captures now ask Chrome to paint the page for the shot.
  • docs: a README section on using Claude in your signed-in Chrome (Gmail,
    GitHub, dashboards), and Chrome Web Store links in the intro and install
    steps.
  • 8 new tests (329 total, 2 skipped).

v0.9.12 — keep another server's pairing; scale fill_form timeout

Choose a tag to compare

@github-actions github-actions released this 24 Sep 07:56

Two fixes for running more than one chrome-mcp, and for long forms. The
extension moves to 0.9.12 (the Web Store still carries the older build).

  • fix: a second chrome-mcp no longer steals the extension's pairing. Any
    server that owned its own port wrote ~/chrome-mcp-extension/pairing.json,
    so a second one started with its own CHROME_MCP_DATA or
    CHROME_MCP_WS_PORT re-pointed the user's extension at itself and the first
    server lost its browser. A hub now leaves the file alone when it names a
    different port that is still listening, and logs that it did. A file naming
    its own port (failover), a dead port, or no file at all is still written.
  • fix: fill_form has time for long forms. One flat 60 s budget covered
    the whole batch, while every field may wait 5 s for its element, so a long
    form timed out server-side while the extension kept typing. The wire timeout
    now grows with the field count (10 s + 6 s per field, 60 s to 10 min), and
    the extension stops starting fields once that deadline passes, returning a
    TIMEOUT that says how many landed, instead of writing into the page after
    the caller was told it failed.
  • 4 new tests (321 total, 2 skipped).

v0.9.11 — MCP registry metadata (mcpName, server.json)

Choose a tag to compare

@Mehmoodqureshi Mehmoodqureshi released this 23 Sep 11:47

Metadata only; no code changed and the extension stays at 0.9.8.

  • chore: listed on the official MCP registry as
    io.github.Mehmoodqureshi/chrome-mcp. package.json gains the mcpName
    field the registry uses to prove the npm package belongs to this repo, and a
    new server.json holds the registry entry. Its version fields must move
    with package.json on every release that is re-published to the registry.

v0.9.10 — hide policy-disabled tools; chrome_status names the flag

Choose a tag to compare

@Mehmoodqureshi Mehmoodqureshi released this 23 Sep 11:47

The model no longer reads tools it can never use, and still knows how to
switch them on.

  • perf: tools whose capability is off are left out of tools/list. The
    catalog is re-sent to the model on every turn, and a tool the policy has
    switched off can only ever answer POLICY_DENIED. Under the default policy
    that is 20 of 40 tools. Each tool now declares the wire method it is gated on
    (TOOL_GATE), the catalog filter asks the same evaluatePolicy the gate
    runs, and startup fails if a new tool forgets to declare one. A blocked
    domain never hides a tool, since another tab may be allowlisted. The server
    logs which tools it dropped and the flag that brings them back.
  • feat: chrome_status names what is switched off. With navigate hidden,
    the model could no longer learn from a POLICY_DENIED that
    --enable-mutations exists, and would tell the user it cannot browse.
    chrome_status now returns disabledCapabilities (each capability, its flag
    and the tools it hid) plus a capabilityHint, so the model can point the
    user at the one flag to add. Both fields are omitted when nothing is off.
  • 13 new tests (317 total, 2 skipped).

v0.9.9 — docs: Web Store listing linked from install paths

Choose a tag to compare

@Mehmoodqureshi Mehmoodqureshi released this 23 Sep 11:47

Documentation only; no code changed and the extension is untouched, so it stays
at 0.9.8.

  • docs: the install steps now point at the Chrome Web Store listing as the
    one-click route beside the unpacked folder, in both the README and SETUP.md.
    Both note that the listed build passes review separately and can trail the npm
    package by a version, which capability negotiation turns into missing features
    rather than a break.

v0.9.8 — fill_form in one round-trip

Choose a tag to compare

@Mehmoodqureshi Mehmoodqureshi released this 22 Sep 07:44

Forms fill in one round-trip instead of one per field, without loosening the
policy gate that protects what gets typed where.

  • feat: fill_form writes every field in a single wire command. A ten-field
    form cost ten server-to-extension round-trips; it now costs one, and the page
    gets one chance to re-render mid-fill instead of ten. The {filled, submitted}
    contract is unchanged, and submitSelector still clicks as a separate step
    after the fills land.
  • Falls back automatically. The extension advertises a fill-form
    capability in its handshake; a server paired with an older extension (or
    driving CDP) goes back to one write per field, so upgrading either side alone
    is safe.
  • The policy gate still runs per field. Batching would otherwise let a page
    navigate after the first field and collect the rest — passwords included — so
    the allowlist is re-checked against the tab's current URL before every write,
    and frame grants are re-probed. A field that lands off-allowlist stops the
    batch with POLICY_DENIED. The sequencing moved to shared/fill-form.ts,
    next to the policy decision it depends on.
  • A failed field now reports how far the batch got (field 2 of 3 (#x) failed after 1 filled), so a caller knows a blind retry would re-write the fields
    that already landed.
  • 6 new tests (304 total, 2 skipped).

v0.9.7 — anonymous server telemetry

Choose a tag to compare

@Mehmoodqureshi Mehmoodqureshi released this 22 Sep 14:44

Anonymous usage statistics from the server, so the project can see how many
installs are active, which versions and platforms are in use, and which tools
fail most.

  • feat: server telemetry via PostHog. The chrome-mcp server sends a random
    install id, its version, OS, CPU architecture and Node major version, whether
    the session owns the bridge port or shares it, how many browsers are paired,
    and per-tool call and error counts with error codes, batched every 10
    minutes. Never URLs, domains, tool arguments, page content, screenshots,
    cookies, profile names, tokens, file paths or anything typed. Events are
    personless and GeoIP lookup is disabled. A notice is printed on first run.
  • feat: opt out with CHROME_MCP_TELEMETRY=0 (or false / off),
    DO_NOT_TRACK=1, or the new --no-telemetry flag.
  • The browser extension still sends nothing; it only talks to 127.0.0.1.
    README gains a Telemetry section and PRIVACY.md describes the server side.
  • 6 new tests (295 total, 2 skipped).

v0.9.6 — sessions share one Chrome, browsers name themselves

Choose a tag to compare

@Mehmoodqureshi Mehmoodqureshi released this 22 Sep 14:44

Many sessions, many browsers. Two Claude terminals used to fight over Chrome:
every session starts its own chrome-mcp, the extension dials one port, and the
newest session killed the previous one's server to take it. Now they share.

  • feat: several sessions drive Chrome at once. The first chrome-mcp to bind
    the port becomes the hub and owns the extension connections. A later one that
    finds the port held by a live chrome-mcp joins it as a peer over the same
    port, authenticated with the token from the 0600 handshake, and relays its
    calls through the hub. Each session keeps its own active profile. When the
    hub's session ends, its peers race for the port: the winner keeps the same
    token, so the extension re-pairs by itself, and the rest join it. A call in
    flight at that moment fails once with EXTENSION_DISCONNECTED and idempotent
    calls are retried. The old takeover (verify, then stop) is kept only for a
    chrome-mcp too old to share. Sessions share one browser's tabs, so give each
    its own tabs or its own profile.
  • feat: browsers name themselves. Chrome won't tell an extension which
    profile it runs in, so every browser that left Profile blank paired as
    default — and a second one silently knocked the first off. Each install
    now keeps a random id and the server names it default, profile-2,
    profile-3…, remembered in ~/.chrome-mcp/profiles.json. A Profile typed
    into Options still wins.
  • feat: profile_rename gives an auto-named browser a friendly name
    (profile-2 → work). The live connection is re-keyed in place, the name
    survives restarts, and the profile's artifacts move with it when the new
    name has no folder yet.
  • fix: chrome_status answers when the active profile has no browser —
    exactly when you need it — and lists every paired browser, how it was named,
    and its active tab as a hint.
  • fix: pairing errors name the profile. An unpaired profile used to report
    pair the extension, attach a --cdp-endpoint, or enable the CDP fallback,
    suggesting flags this build ignores. It now says which profile has no browser
    and exactly what to set in that Chrome's Options.
  • fix: Options saves without re-pasting the token. The token field is never
    prefilled, and Save refused an empty one, so changing only the Profile
    silently did nothing. A blank token now keeps the stored one, and the page
    shows the name this browser was paired as.
  • Verified live with two Chrome profiles and three concurrent sessions. 16 new
    tests (289 total, 2 skipped).