Repository navigation
Releases: raultov/browser-control-mcp
Release list
0.3.4-beta.4 - 2026-10-27
Release Notes
Public BETA. The same server as 0.3.3-beta.4, which was published on
crates.io but without binaries, npm package or Homebrew formula: its
release notes made GitHub skip the builds. See 0.3.3-beta.4 below for the
changes.
Fixed
- The release notes no longer quote a URL with credentials, which GitHub
treats as a secret;make checknow refuses one in this file.
Install browser-control-mcp 0.3.4-beta.4
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/raultov/browser-control-mcp/releases/download/v0.3.4-beta.4/browser-control-mcp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/raultov/browser-control-mcp/releases/download/v0.3.4-beta.4/browser-control-mcp-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install raultov/tap/browser-control-mcpInstall prebuilt binaries into your npm project
npm install @raultov/browser-control-mcp@0.3.4-beta.4Download browser-control-mcp 0.3.4-beta.4
| File | Platform | Checksum |
|---|---|---|
| browser-control-mcp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| browser-control-mcp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.msi | x64 Windows | checksum |
| browser-control-mcp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| browser-control-mcp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.3.3-beta.4 - 2026-10-27
Release Notes
Public BETA. Tools that reported success for something that did not
happen now say what happened, and proxy credentials are handled more
safely. Some replies change: an unknown tool argument is an error,
navigate/reload add status, a download URL fails, and
restart_browser/stop_browser on an attached Chrome refuse or only
disconnect.
Fixed
open_instancewithoutheadlessfollows the server's--headlessflag.
It always opened a window, even on a server started with--headless
(where there may be no display, as in the Docker image).- Credentials written in a proxy URL (
http://user:pass@host:port, from
--proxy-server,open_instance'sproxyorrestart_browser) no
longer reach the browser: Chrome got them on its command line, readable
by any local user withps(and ignored them), and Firefox refused to
launch.enable_proxy_authnow falls back to the credentials of
--proxy-server. enable_proxy_authwith wrong credentials no longer loops: a request the
proxy challenges again after two answers is cancelled. Firefox re-raised
the same request forever (about 50 challenges a second, each carrying the
password); Chrome retried tens of times. On Firefox, calling the tool
again also removes the previous intercept (each call added one more).- On Chrome, an instance attached to a browser that was already running on
its port (not launched by the server) no longer reports a restart or stop
that did not happen.restart_browser(and acopy_cookiesrelaunch)
fails saying the server cannot relaunch it, and nothing is changed;
stop_browserdisconnects and says the browser keeps running. Both said
"successfully" while the same process kept running without the presets. navigateandreloadreport the document's HTTP status ("status": 404), and an error status (400 and up) adds a note. A 404 used to look
like any success, and an error with an empty body failed on Chrome
(ERR_HTTP_RESPONSE_CODE_FAILURE) but succeeded on Firefox: it is now a
success with its status on both.navigateto a URL the browser downloads fails withNavigation failed: the URL is a download...on both browsers. Firefox answered "Navigated
to" the previous page; Chrome failed withnet::ERR_ABORTED.- A tool call with an argument the tool does not have now fails before
anything runs, naming the argument it was probably meant to be (tabId
answers "did you meantab_id?"). Unknown arguments were ignored, so a
tabIdtypo ran on the active tab.
Install browser-control-mcp 0.3.3-beta.4
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/raultov/browser-control-mcp/releases/download/v0.3.3-beta.4/browser-control-mcp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/raultov/browser-control-mcp/releases/download/v0.3.3-beta.4/browser-control-mcp-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install raultov/tap/browser-control-mcpInstall prebuilt binaries into your npm project
npm install @raultov/browser-control-mcp@0.3.3-beta.4Download browser-control-mcp 0.3.3-beta.4
| File | Platform | Checksum |
|---|---|---|
| browser-control-mcp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| browser-control-mcp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.msi | x64 Windows | checksum |
| browser-control-mcp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| browser-control-mcp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.3.2-beta.3 - 2026-10-25
Release Notes
Public BETA. Replies up to 256 MB no longer drop the browser connection
(new cdp-lite and bidi-lite releases).
Fixed
- Replies up to 256 MB no longer drop the connection: built with
cdp-lite
0.3.1 andbidi-lite0.1.4, which accept WebSocket messages up to 256 MiB
(the WebSocket library's default closed the connection on a frame over
16 MiB, e.g. anevaluate_jsstring of 20 MB). The lost-connection error
now names the 256 MB limit.
Install browser-control-mcp 0.3.2-beta.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/raultov/browser-control-mcp/releases/download/v0.3.2-beta.3/browser-control-mcp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/raultov/browser-control-mcp/releases/download/v0.3.2-beta.3/browser-control-mcp-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install raultov/tap/browser-control-mcpInstall prebuilt binaries into your npm project
npm install @raultov/browser-control-mcp@0.3.2-beta.3Download browser-control-mcp 0.3.2-beta.3
| File | Platform | Checksum |
|---|---|---|
| browser-control-mcp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| browser-control-mcp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.msi | x64 Windows | checksum |
| browser-control-mcp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| browser-control-mcp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.3.1-beta.3 - 2026-10-25
Release Notes
Public BETA. Size limits: large pages, results, scripts, logs and
screenshots no longer flood the agent or drop the browser connection, and
Chrome reconnects by itself when a reply over 16 MB drops it. Some replies
change (cut texts end with a [cut: ...] or [Truncated: ...] note,
evaluate_js may say truncated: true, inspect_dom positions are
characters).
Fixed
capture_screenshotwithfull_pagecaptures at most 16 384 CSS pixels
per side, from the top left, and then adds a text note naming the
document's size (a 30 000 px page came back whole).- Observation buffers keep a bounded copy of each item: a console message
keeps 10 000 characters, a WebSocket payload 64 000 (payload_lenis
the whole length), custom event params over 64 000 characters of JSON
become{"truncated": true, "characters": N}, andget_network_logs
shows at most 64 000 characters of a request or response body. Each cut
text ends with… [cut: the first N of M characters]. Chrome no longer
fetches a response body whoseContent-Lengthis over 2 MB (Firefox
keeps none larger). Two 3 MB console messages made a 6 MB reply. search_scriptspreviews a long line (minified code) as the match with
100 characters on each side,…where it was cut: one hit in a 1.6 MB
one-line script returned the whole line.evaluate_jsreturns at most 100 000 characters ofvalue: a longer
string is cut, and an object or array whose JSON form is longer is
measured in the page and only described ("too large to return (N
characters of JSON)"), so it never crosses the connection; the reply
says"truncated": true. A 3-million-element array used to time out on
Firefox and a 20 MB object to drop the connection. A string result over
16 MB still drops it (the next call reconnects).inspect_domsearches and cuts in the page, so a large document no
longer crosses the connection (a 20 MB page used to drop it on Chrome).
Withoutqueryit returns at most 100 000 characters, after a
[Truncated: ...]note naming the total;before/afterare capped at
10 000. Positions are characters (they were bytes). On Chrome an
exception in the page is an error (it was an empty success).- A reply over 16 MB (a huge
evaluate_jsresult, a 20 MB page in
inspect_dom) makes the browser close the DevTools connection. Chrome
then answeredCDP Error: Connection lostto every later call until
restart_browser; now the next call reconnects by itself (tab ids are
re-assigned). The failing call explains what happened on both browsers.
Install browser-control-mcp 0.3.1-beta.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/raultov/browser-control-mcp/releases/download/v0.3.1-beta.3/browser-control-mcp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/raultov/browser-control-mcp/releases/download/v0.3.1-beta.3/browser-control-mcp-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install raultov/tap/browser-control-mcpInstall prebuilt binaries into your npm project
npm install @raultov/browser-control-mcp@0.3.1-beta.3Download browser-control-mcp 0.3.1-beta.3
| File | Platform | Checksum |
|---|---|---|
| browser-control-mcp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| browser-control-mcp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.msi | x64 Windows | checksum |
| browser-control-mcp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| browser-control-mcp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.3.0-beta.3 - 2026-10-25
Release Notes
Public BETA. Result of a tool-by-tool audit on real Chrome and Firefox:
tools that reported success for an action that did not happen now fail or
say what happened, secrets no longer leak into logs or replies, and a new
handle_dialog tool closes JavaScript dialogs. Some replies change (marked
in the entries below: scroll, fill_input, click_element errors,
Chrome open_tab ids).
Added
handle_dialog(both browsers): accepts or dismisses the JavaScript
dialog (alert,confirm,promptwithprompt_text,beforeunload)
open on a tab, and replies with its type and message.
Changed
- Chrome: when the first call on an instance is
open_tab, the browser's
own first page is now registered too (as on Firefox), so the new tab is
tab-2and stays inactive untilswitch_tab; before, it wastab-1and
active.
Fixed
-
Chrome tracks popups (
window.open) and tabs closed by the page or the
user when the first call on an instance isopen_tab; it only did after
a call that used the instance's default page. -
navigateandreloadkeep their 30 s budget on slow pages (both
browsers). A server slow to answer, or a page slow to fireload, hit
the 10 s protocol command timeout and failed although the navigation went
on; now the call waits forloadup to 30 s from its start and answers
then, with the not-loaded note when it did not come. -
get_network_logsclear: trueremoves only the requests and frames it
returned (withurl_filter,type_filterorcurrent_navigation_only
it used to empty everything, also what was never returned), as
get_console_logsdoes. WebSocket connections keep their URL after a
clear (later frames used to haveurl: ""). -
Chrome
pause_on_loadno longer leaves itsdebugger;script injected
(after which every later load paused): calling it again replaces the
previous script, and aresumeChrome refuses because the reload has not
paused yet keeps the script pending, so the nextresumeremoves it. -
JavaScript dialogs no longer hang the tools. A call during which the page
opens a dialog (evaluate_jsrunningalert(), aclick_elementon a
button that asksconfirm(), anavigatestopped bybeforeunload)
fails at once quoting the dialog instead of after a 10–20 s timeout, and
while a dialog is open the page tools fail naming it and pointing to
handle_dialog. On Chrome the tab used to stay blocked until a raw
Page.handleJavaScriptDialog. Chrome errors are worded with the
protocol's message instead of Rust debug output (Timeout { method: ... }). -
Security: with
RUST_LOG=tracethe MCP transport logged every incoming
tool call in full, including theenable_proxy_authpassword and raw
protocol params. Its logs are now capped atinfo, likecdp-lite's. -
Security: copies of the user's cookies (
copy_cookies) could stay in the
temp directory: when a launch failed, when a seed was replaced before
use, when a browser failed to stop, when a partial copy failed, and at
shutdown after the seeded Chrome had crashed. The seeded profile now
deletes itself whenever it is dropped, and shutdown drops the seed of an
instance that is no longer running. -
Security:
get_network_logsreturned request bodies (login forms with
passwords, token exchanges) and API-key headers such asX-Api-Keyin
full by default. Request bodies and every header whose name contains
token,secret,api-key,apikey,password,session,csrfor
xsrfare now<redacted>unlessinclude_sensitive_headers: true. -
search_scriptspositions are right, so they can be passed to
set_breakpointas they are. A match at the start of a line was reported
at the end of the previous line (both browsers); matches in inline scripts
were counted from the script, not the page (Chrome); columns now count
UTF-16 units, as the browsers do, instead of bytes. -
Firefox
set_breakpointno longer sets breakpoints that never fire. A
column_numberFirefox cannot break on (it ignores those silently) moves
to the next breakable column of the line once the script is loaded, as on
Chrome, and the reply says where; a column past every breakable one is an
error. A second breakpoint at the same location is refused naming the
first: Firefox keeps one per location, so removing either id used to
remove both. -
Firefox
evaluate_jsno longer changes the type of nested values:NaN
and±Infinityinside objects and arrays were strings ("NaN"),-0
was"-0", a BigInt was a string of digits,undefinedwasnullin
objects and a cycle was{}. Nested values now follow JSON as on Chrome
(null,0,undefinedleft out); an object holding a BigInt or a
cycle has no JSON form and is described ("Object",value: null), and
an object reached twice without a cycle is serialised both times. -
webmcp_list_toolsno longer hides page tools registered without an
inputSchema(optional in WebMCP); they are listed without one and can
be invoked. -
Chrome
restart_browserwithoutproxy_serverkeeps the instance's own
proxy (the one given toopen_instanceor the previous restart), as on
Firefox; it used to fall back to--proxy-server, or none, silently. -
get_console_logs:console.warnis levelwarningon Firefox too (it
waswarn, solevel_filter: "warning"found nothing there and"warn"
nothing on Chrome);level_filteracceptswarnas an alias. -
Chrome: the first call on a fresh instance (usually
navigate) waits
for the browser's page to register as a tab and uses it. It used to run
on a session-level connection whose captured state stopped being read
once the tab registered a moment later, so the first page's network
requests were missing fromget_network_logsandsearch_scriptsfound
nothing right after it. -
Chrome
enable_proxy_authno longer stops answering after falling behind
a burst of events (it left request interception on with nobody
continuing the tab's requests, so they hung); whatever ends the handler
turns interception off. It also subscribes before enabling interception,
so a request paused right away is not missed. -
A browser that crashed or was killed from outside is reported: every call
on that instance answers "The browser of this instance closed or crashed
... Call 'restart_browser'", its dead tabs are forgotten, and nothing is
relaunched behind the agent's back. Chrome used to answerCDP Error: Disconnectedforever while silently starting an unused new Chrome (and
leaking the dead one's pool entry); Firefox answered "the browser was
stopped" forever.restart_browser,stop_browserandclose_instance
work as usual afterwards. Chromeopen_tabchecks--localbefore it
starts a browser. -
A page's own
debugger;statements no longer pause it while the tab has
no breakpoint (and, on Chrome, nopause_on_load). The debugger is
always attached, so anti-debugging pages (setInterval(() => {debugger}))
and a straydebugger;froze every tool on the tab until a timeout. The
first breakpoint turns them back on, removing the last one turns them off
(ChromeDebugger.setSkipAllPauses, re-applied after cross-process
navigations; FirefoxshouldPauseOnDebuggerStatement). Chrome's
session-level connection drops its debugger once the page is a
registered tab, so it no longer resumes the tab's pauses. -
fill_inputno longer types into the wrong element or reports a fill
that did not happen (both browsers). An element that cannot take the text
(a plain element, disabled, read-only, a non-text input such as a
checkbox, or one that cannot take focus) fails with the reason and nothing
is typed; before, the text went to whichever element had focus. A
<select>gets the option whose value or label equals the text (it used
to be emptied on Chrome). After typing, a field left empty (it rejected the
text, e.g. letters in a number field) is an error, and a field holding
something else (a mask,maxlength) succeeds with a note; the text is
never echoed back. The field is emptied through the nativevaluesetter,
which React-controlled inputs observe. On Chrome, an invalid selector
reports itsSyntaxErrorinstead of "Element not found". The description
no longer promises achangeevent: it fires when the field loses focus,
as for a user. -
click_elementno longer reports a click that hit another element or
nothing (both browsers). The element is scrolled into view first (Chrome
used to click off-screen coordinates into the void; Firefox failed with
"move target out of bounds"), and the call fails without clicking when it
has no visible box (Chrome used to click the page corner at (0, 0)) or
when another element covers the point, naming it (an overlay used to get
the click on both). Both browsers click the same checked viewport point;
Firefox no longer leaves the pointer pressed when its actions fail. -
scrollno longer reports success when nothing moved (both browsers). The
reply adds the window positions as JSON{before, after}(plus
element_in_viewfor a selector) after its first line, which says why the
window did not move when it did not (at the edge, or the page scrolls an
inner element). Scrolling to a hidden element fails.xis no longer
dropped when scrolling bypages.
Install browser-control-mcp 0.3.0-beta.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/raultov/browser-control-mcp/releases/download/v0.3.0-beta.3/browser-control-mcp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/raultov/browser-control-mcp/releases/download/v0.3.0-beta.3/browser-control-mcp-installer.ps1 | iex"Install prebuilt bi...
0.2.0-beta.2 - 2026-10-14
Release Notes
Public BETA. Firefox debugger internals only; tool replies are the same
as in 0.2.0-beta.1.
Changed
bidi-browser-lite0.1.5 (bidi-lite0.1.3). Firefox tabs are attached to
their debugger withDebugger::attach_to_context: Firefox's Remote Agent
maps each BiDi context to its RDP tab, replacing the match by position in
the tab lists. Tabs on the same URL, several windows and error pages are
told apart, and a debugger tool never activates a tab any more (a tab
Firefox cannot map is an error, not a guess).- Firefox
set_breakpointuses bidi-lite'sset_breakpoint_resolved: the
bound column comes from the library (every inline script with the URL is
searched). A column-less breakpoint for a script not loaded yet fails with
an argument error asking forcolumn_number, as before.
Install browser-control-mcp 0.2.0-beta.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/raultov/browser-control-mcp/releases/download/v0.2.0-beta.2/browser-control-mcp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/raultov/browser-control-mcp/releases/download/v0.2.0-beta.2/browser-control-mcp-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install raultov/tap/browser-control-mcpInstall prebuilt binaries into your npm project
npm install @raultov/browser-control-mcp@0.2.0-beta.2Download browser-control-mcp 0.2.0-beta.2
| File | Platform | Checksum |
|---|---|---|
| browser-control-mcp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| browser-control-mcp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.msi | x64 Windows | checksum |
| browser-control-mcp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| browser-control-mcp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.2.0-beta.1 - 2026-10-13
Release Notes
Public BETA. Chrome and Firefox now answer the same replies; several are
incompatible with 0.1.x (marked Breaking; see the README's "Migration
from 0.1.x to 0.2.0").
Changed
- Breaking:
navigateandreloadanswer the same shape on Chrome and
Firefox once the page firedload(at most 30 s):{url, tab_id, browser, notes?},urlbeing the final URL after redirects andbrowserthe
protocol's ids (Chrome used to answer the rawPage.navigatereply without
waiting, and{}on reload).open_tabreports the final URL too, and on
Firefox it now creates the tab blank and navigates once it is registered,
as on Chrome, so the page's first events are captured. - Breaking: a network error fails
navigateandopen_tabon both
browsers withNavigation failed: <browser's code> (<url>)(Chrome used to
report success witherrorTextinside, or a tab onchrome-error://); from
open_tabthe error names the tab, which stays open. - Breaking:
evaluate_jsanswers{value, type, subtype?, description?}
on both browsers (Chrome used to wrap the value in the CDPRemoteObject,
Firefox to return the bare value). Values without a JSON form (functions,
DOM nodes, symbols,NaN, bigints, maps...) havevalue: nulland a
description; on Chrome they no longer fail with "Object couldn't be
returned by value" or answer{}(array-likes such asNodeListare
described, e.g.NodeList(6), as on Firefox). A thrown exception fails
with the same wording on both: what was thrown plus its 1-based line and
column. - Breaking: the debugger tools answer the same shapes on both browsers,
with 0-based lines everywhere:set_breakpointreturns an MCP id
(bp-N, also on Chrome instead of the CDP id) with the bound location and
resolved;remove_breakpointtakes that id and answers{removed};
step_overandresumeanswer{paused, location}(Firefox's step
location was 1-based; Chrome reported none);evaluate_on_call_frame
answers theevaluate_jsshape, and an exception in the frame is an error
on Chrome too (Evaluation threw: ...; it used to be a success carrying
exceptionDetails).step_overwithout a pause fails with "the debugger
is not paused" on both. - Breaking:
get_console_logsanswers{messages, total, truncated, notes?}instead of a bare array, returns at mostlimitmessages (new
argument, default 200, the most recent ones), andclearremoves only the
returned messages (it used to empty the whole buffer, even messages a
level_filterhad hidden).
Added
-
Partial
get_performance_metricsandprofile_page_performanceon
Firefox, from the standard Web Performance APIs:Nodes,Frames,
ResourcesandTransferSize; FCP, LCP, DCL and Load (optionally after a
reload, cache bypassed withdisable_cache). What Firefox cannot give (JS
heap, layout counts, long tasks, total blocking time) isnullor listed
in a note, never a silent empty value. -
Firefox WebSocket frames in
get_network_logs, and the console messages
WebDriver BiDi does not report (script errors with file and line, cookie
and security warnings, CSS warnings, platform messages) in
get_console_logs, from the RDP watcher of each tab's debugger, in the
same shapes as Chrome. Each tab's debugger is attached when the session
starts, whenopen_tabcreates the tab, or at the first log call on a tab
the page opened, matched by its position in BiDi's and RDP's tab lists
(checked against their URLs), without bringing it to the front. Needs the
Firefox debugger port (default for a launched Firefox). Messages both feeds report are kept once; console
sourcelabels say what a Firefox message is (javascript,css,
security,network,other). -
--window-size <W>x<H>(default1920x1080): launched Chrome and Firefox
get the same window size, headless too (they used to pick 921x648 and
1280x887). Attached browsers keep their window. -
A tab's console buffer is cleared when the tab moves to another site
(registrable domain, via thepslcrate's embedded Public Suffix List)
and kept across subdomains of one site, reloads and same-page
navigations; the nextget_console_logssays what was cleared. -
Lifecycle crates bumped:
cdp-browser-lite0.4.2 andbidi-browser-lite
0.1.4 (bidi-lite0.1.2). Their mocks now record wire parameters, so the
Firefox page, input, network and debugger tools and the Chrome domain
setup are covered by hermetic tests instead of only by the E2E smoke.
Fixed
- Chrome
get_performance_metricsreturned{}: every tab now enables the
Performance domain when it is registered, the tool enables it on a session
that missed it, and an empty metric list is an error instead of{}. - The "Chrome not found, use Firefox?" hint no longer ends the library's
sentence with two periods.
Install browser-control-mcp 0.2.0-beta.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/raultov/browser-control-mcp/releases/download/v0.2.0-beta.1/browser-control-mcp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/raultov/browser-control-mcp/releases/download/v0.2.0-beta.1/browser-control-mcp-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install raultov/tap/browser-control-mcpInstall prebuilt binaries into your npm project
npm install @raultov/browser-control-mcp@0.2.0-beta.1Download browser-control-mcp 0.2.0-beta.1
| File | Platform | Checksum |
|---|---|---|
| browser-control-mcp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| browser-control-mcp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.msi | x64 Windows | checksum |
| browser-control-mcp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| browser-control-mcp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.1.1-beta.1 - 2026-10-12
Release Notes
Public BETA: known bugs and Chrome/Firefox differences are listed in the
README ("Limitations and TODO"). The GitHub Release, the shell/PowerShell
installers, the MSI and the npm package start with this version (0.1.0 was
only published to crates.io).
Changed
- README: per-platform installation section (shell and PowerShell
installers, npm/npx, Homebrew, MSI, Cargo/binstall, manual download,
Docker, source) and a one-prompt install for AI agents. - Releases of beta versions are published as the latest GitHub Release and
with the npmlatesttag, soreleases/latest/download/...installers
andnpm install -g @raultov/browser-control-mcpget them.
Fixed
- A Windows-only unit test failure (path separator in the cookie-import
error assertion).
Install browser-control-mcp 0.1.1-beta.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/raultov/browser-control-mcp/releases/download/v0.1.1-beta.1/browser-control-mcp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/raultov/browser-control-mcp/releases/download/v0.1.1-beta.1/browser-control-mcp-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install raultov/tap/browser-control-mcpInstall prebuilt binaries into your npm project
npm install @raultov/browser-control-mcp@0.1.1-beta.1Download browser-control-mcp 0.1.1-beta.1
| File | Platform | Checksum |
|---|---|---|
| browser-control-mcp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| browser-control-mcp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| browser-control-mcp-x86_64-pc-windows-msvc.msi | x64 Windows | checksum |
| browser-control-mcp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| browser-control-mcp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |