Repository navigation
Releases: Mehmoodqureshi/chrome-mcp
Release list
v0.9.15 — drop the redundant activeTab permission
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 everythingactiveTabgranted; finding the tab you
are looking at only needstabs. 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
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
--toolssection 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
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,
soget_html,get_textandsnapshotnever 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
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 ownCHROME_MCP_DATAor
CHROME_MCP_WS_PORTre-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_formhas 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
TIMEOUTthat 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)
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.jsongains themcpName
field the registry uses to prove the npm package belongs to this repo, and a
newserver.jsonholds the registry entry. Itsversionfields must move
withpackage.jsonon every release that is re-published to the registry.
v0.9.10 — hide policy-disabled tools; chrome_status names the flag
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 answerPOLICY_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 sameevaluatePolicythe 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_statusnames what is switched off. Withnavigatehidden,
the model could no longer learn from aPOLICY_DENIEDthat
--enable-mutationsexists, and would tell the user it cannot browse.
chrome_statusnow returnsdisabledCapabilities(each capability, its flag
and the tools it hid) plus acapabilityHint, 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
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 andSETUP.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
Forms fill in one round-trip instead of one per field, without loosening the
policy gate that protects what gets typed where.
- feat:
fill_formwrites 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, andsubmitSelectorstill 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 withPOLICY_DENIED. The sequencing moved toshared/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
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(orfalse/off),
DO_NOT_TRACK=1, or the new--no-telemetryflag. - 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
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 withEXTENSION_DISCONNECTEDand 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 itdefault,profile-2,
profile-3…, remembered in~/.chrome-mcp/profiles.json. A Profile typed
into Options still wins. - feat:
profile_renamegives 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_statusanswers 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).