Skip to content

Releases: raultov/browser-control-mcp

0.3.4-beta.4 - 2026-10-27

Choose a tag to compare

@github-actions github-actions released this 27 Oct 19:00

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 check now 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 | sh

Install 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-mcp

Install prebuilt binaries into your npm project

npm install @raultov/browser-control-mcp@0.3.4-beta.4

Download 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

Choose a tag to compare

@github-actions github-actions released this 27 Oct 18:29

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_instance without headless follows the server's --headless flag.
    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's proxy or restart_browser) no
    longer reach the browser: Chrome got them on its command line, readable
    by any local user with ps (and ignored them), and Firefox refused to
    launch. enable_proxy_auth now falls back to the credentials of
    --proxy-server.
  • enable_proxy_auth with 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 a copy_cookies relaunch)
    fails saying the server cannot relaunch it, and nothing is changed;
    stop_browser disconnects and says the browser keeps running. Both said
    "successfully" while the same process kept running without the presets.
  • navigate and reload report 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.
  • navigate to a URL the browser downloads fails with Navigation failed: the URL is a download... on both browsers. Firefox answered "Navigated
    to" the previous page; Chrome failed with net::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 mean tab_id?"). Unknown arguments were ignored, so a
    tabId typo 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 | sh

Install 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-mcp

Install prebuilt binaries into your npm project

npm install @raultov/browser-control-mcp@0.3.3-beta.4

Download 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

Choose a tag to compare

@github-actions github-actions released this 25 Oct 17:55

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 and bidi-lite 0.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. an evaluate_js string 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 | sh

Install 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-mcp

Install prebuilt binaries into your npm project

npm install @raultov/browser-control-mcp@0.3.2-beta.3

Download 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

Choose a tag to compare

@github-actions github-actions released this 25 Oct 17:08

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_screenshot with full_page captures 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_len is
    the whole length), custom event params over 64 000 characters of JSON
    become {"truncated": true, "characters": N}, and get_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 whose Content-Length is over 2 MB (Firefox
    keeps none larger). Two 3 MB console messages made a 6 MB reply.
  • search_scripts previews 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_js returns at most 100 000 characters of value: 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_dom searches and cuts in the page, so a large document no
    longer crosses the connection (a 20 MB page used to drop it on Chrome).
    Without query it returns at most 100 000 characters, after a
    [Truncated: ...] note naming the total; before/after are 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_js result, a 20 MB page in
    inspect_dom) makes the browser close the DevTools connection. Chrome
    then answered CDP Error: Connection lost to 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 | sh

Install 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-mcp

Install prebuilt binaries into your npm project

npm install @raultov/browser-control-mcp@0.3.1-beta.3

Download 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

Choose a tag to compare

@github-actions github-actions released this 25 Oct 15:45

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, prompt with prompt_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-2 and stays inactive until switch_tab; before, it was tab-1 and
    active.

Fixed

  • Chrome tracks popups (window.open) and tabs closed by the page or the
    user when the first call on an instance is open_tab; it only did after
    a call that used the instance's default page.

  • navigate and reload keep their 30 s budget on slow pages (both
    browsers). A server slow to answer, or a page slow to fire load, hit
    the 10 s protocol command timeout and failed although the navigation went
    on; now the call waits for load up to 30 s from its start and answers
    then, with the not-loaded note when it did not come.

  • get_network_logs clear: true removes only the requests and frames it
    returned (with url_filter, type_filter or current_navigation_only
    it used to empty everything, also what was never returned), as
    get_console_logs does. WebSocket connections keep their URL after a
    clear (later frames used to have url: "").

  • Chrome pause_on_load no longer leaves its debugger; script injected
    (after which every later load paused): calling it again replaces the
    previous script, and a resume Chrome refuses because the reload has not
    paused yet keeps the script pending, so the next resume removes it.

  • JavaScript dialogs no longer hang the tools. A call during which the page
    opens a dialog (evaluate_js running alert(), a click_element on a
    button that asks confirm(), a navigate stopped by beforeunload)
    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=trace the MCP transport logged every incoming
    tool call in full, including the enable_proxy_auth password and raw
    protocol params. Its logs are now capped at info, like cdp-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_logs returned request bodies (login forms with
    passwords, token exchanges) and API-key headers such as X-Api-Key in
    full by default. Request bodies and every header whose name contains
    token, secret, api-key, apikey, password, session, csrf or
    xsrf are now <redacted> unless include_sensitive_headers: true.

  • search_scripts positions are right, so they can be passed to
    set_breakpoint as 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_breakpoint no longer sets breakpoints that never fire. A
    column_number Firefox 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_js no longer changes the type of nested values: NaN
    and ±Infinity inside objects and arrays were strings ("NaN"), -0
    was "-0", a BigInt was a string of digits, undefined was null in
    objects and a cycle was {}. Nested values now follow JSON as on Chrome
    (null, 0, undefined left 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_tools no longer hides page tools registered without an
    inputSchema (optional in WebMCP); they are listed without one and can
    be invoked.

  • Chrome restart_browser without proxy_server keeps the instance's own
    proxy (the one given to open_instance or the previous restart), as on
    Firefox; it used to fall back to --proxy-server, or none, silently.

  • get_console_logs: console.warn is level warning on Firefox too (it
    was warn, so level_filter: "warning" found nothing there and "warn"
    nothing on Chrome); level_filter accepts warn as 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 from get_network_logs and search_scripts found
    nothing right after it.

  • Chrome enable_proxy_auth no 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 answer CDP Error: Disconnected forever 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_browser and close_instance
    work as usual afterwards. Chrome open_tab checks --local before it
    starts a browser.

  • A page's own debugger; statements no longer pause it while the tab has
    no breakpoint (and, on Chrome, no pause_on_load). The debugger is
    always attached, so anti-debugging pages (setInterval(() => {debugger}))
    and a stray debugger; froze every tool on the tab until a timeout. The
    first breakpoint turns them back on, removing the last one turns them off
    (Chrome Debugger.setSkipAllPauses, re-applied after cross-process
    navigations; Firefox shouldPauseOnDebuggerStatement). 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_input no 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 native value setter,
    which React-controlled inputs observe. On Chrome, an invalid selector
    reports its SyntaxError instead of "Element not found". The description
    no longer promises a change event: it fires when the field loses focus,
    as for a user.

  • click_element no 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.

  • scroll no longer reports success when nothing moved (both browsers). The
    reply adds the window positions as JSON {before, after} (plus
    element_in_view for 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. x is no longer
    dropped when scrolling by pages.

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 | sh

Install 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...

Read more

0.2.0-beta.2 - 2026-10-14

Choose a tag to compare

@github-actions github-actions released this 14 Oct 06:58

Release Notes

Public BETA. Firefox debugger internals only; tool replies are the same
as in 0.2.0-beta.1.

Changed

  • bidi-browser-lite 0.1.5 (bidi-lite 0.1.3). Firefox tabs are attached to
    their debugger with Debugger::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_breakpoint uses bidi-lite's set_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 for column_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 | sh

Install 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-mcp

Install prebuilt binaries into your npm project

npm install @raultov/browser-control-mcp@0.2.0-beta.2

Download 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

Choose a tag to compare

@github-actions github-actions released this 13 Oct 19:26

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: navigate and reload answer the same shape on Chrome and
    Firefox once the page fired load (at most 30 s): {url, tab_id, browser, notes?}, url being the final URL after redirects and browser the
    protocol's ids (Chrome used to answer the raw Page.navigate reply without
    waiting, and {} on reload). open_tab reports 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 navigate and open_tab on both
    browsers with Navigation failed: <browser's code> (<url>) (Chrome used to
    report success with errorText inside, or a tab on chrome-error://); from
    open_tab the error names the tab, which stays open.
  • Breaking: evaluate_js answers {value, type, subtype?, description?}
    on both browsers (Chrome used to wrap the value in the CDP RemoteObject,
    Firefox to return the bare value). Values without a JSON form (functions,
    DOM nodes, symbols, NaN, bigints, maps...) have value: null and a
    description; on Chrome they no longer fail with "Object couldn't be
    returned by value" or answer {} (array-likes such as NodeList are
    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_breakpoint returns an MCP id
    (bp-N, also on Chrome instead of the CDP id) with the bound location and
    resolved; remove_breakpoint takes that id and answers {removed};
    step_over and resume answer {paused, location} (Firefox's step
    location was 1-based; Chrome reported none); evaluate_on_call_frame
    answers the evaluate_js shape, and an exception in the frame is an error
    on Chrome too (Evaluation threw: ...; it used to be a success carrying
    exceptionDetails). step_over without a pause fails with "the debugger
    is not paused" on both.
  • Breaking: get_console_logs answers {messages, total, truncated, notes?} instead of a bare array, returns at most limit messages (new
    argument, default 200, the most recent ones), and clear removes only the
    returned messages (it used to empty the whole buffer, even messages a
    level_filter had hidden).

Added

  • Partial get_performance_metrics and profile_page_performance on
    Firefox, from the standard Web Performance APIs: Nodes, Frames,
    Resources and TransferSize; FCP, LCP, DCL and Load (optionally after a
    reload, cache bypassed with disable_cache). What Firefox cannot give (JS
    heap, layout counts, long tasks, total blocking time) is null or 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, when open_tab creates 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
    source labels say what a Firefox message is (javascript, css,
    security, network, other).

  • --window-size <W>x<H> (default 1920x1080): 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 the psl crate's embedded Public Suffix List)
    and kept across subdomains of one site, reloads and same-page
    navigations; the next get_console_logs says what was cleared.

  • Lifecycle crates bumped: cdp-browser-lite 0.4.2 and bidi-browser-lite
    0.1.4 (bidi-lite 0.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_metrics returned {}: 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 | sh

Install 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-mcp

Install prebuilt binaries into your npm project

npm install @raultov/browser-control-mcp@0.2.0-beta.1

Download 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

Choose a tag to compare

@github-actions github-actions released this 12 Oct 18:54

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 npm latest tag, so releases/latest/download/... installers
    and npm install -g @raultov/browser-control-mcp get 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 | sh

Install 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-mcp

Install prebuilt binaries into your npm project

npm install @raultov/browser-control-mcp@0.1.1-beta.1

Download 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