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.

BrowserTap MCP

PYPI · BROWSERTAP-MCP · SCANNED SEP 20

MCP server that drives the real Chrome you already use, through an extension and CDP.

Available components

+4 this week 79 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 Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
  • 1 of 36 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency35
Schema Quality & AI Usability80
  • AI-judged instruction clarity (excellent).Pass
  • Tool/resource definitions use about 5474 tokens (~99/item across 55 items; 55 tools + 0 resources), lean.Pass
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
  • Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 0% of tool parameters carry a description.Fail
  • Structured output schemas are declared (96% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "uninstall_extension" implies "uninstall" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 56 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 BrowserTap MCP server?

BrowserTap MCP runs locally as a PyPI package, launched with uvx browsertap-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · browsertap-mcp

# add to Claude Code
claude mcp add linvireo-browsertap-mcp -- uvx browsertap-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "linvireo-browsertap-mcp": {
      "command": "uvx",
      "args": [
        "browsertap-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "linvireo-browsertap-mcp": {
      "command": "uvx",
      "args": [
        "browsertap-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add linvireo-browsertap-mcp -- uvx browsertap-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "linvireo-browsertap-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "browsertap-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add linvireo-browsertap-mcp --command uvx --arg browsertap-mcp
# ~/.hermes/config.yaml
mcp_servers:
  linvireo-browsertap-mcp:
    command: "uvx"
    args: ["browsertap-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "linvireo-browsertap-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "browsertap-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add linvireo-browsertap-mcp -t stdio -c uvx -a browsertap-mcp
// mcp.json
{
  "mcpServers": {
    "linvireo-browsertap-mcp": {
      "command": "uvx",
      "args": [
        "browsertap-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 +1

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

  • 18 Sept 26 +1

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

  • 16 Sept 26 +1

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

  • 14 Sept 26 +1

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

  • 12 Sept 26 +1

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

  • 9 Sept 26 +1

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

  • 7 Sept 26 +1

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

  • 5 Sept 26 +1

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

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 pypi/browsertap-mcp@0.4.12

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem pypi

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted setuptools.build_meta

Background: Why install scripts are a supply-chain risk →

Dependencies 36 packages
Packages resolved 36
Stale 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 55 exposed · ~5,237 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
activate_tab ~52

Bring a tab to the foreground and focus its window. Use this explicitly after switch_tab when foreground work is required, or to re-raise a tab the user has since clicked away from.

NameTypeReqDescription
session_id

Structured output declared, but exposes no named fields.

No examples provided.

call_extension ~68

Send a JSON message from the BTAP extension service worker to another installed extension. The target must be enabled and list this BTAP extension in externally_connectable. Works with no tabs open.

NameTypeReqDescription
extension_idstringyes
message_jsonstringyes
session_id

Structured output declared, but exposes no named fields.

No examples provided.

capture_desktop_screenshot ~93

Capture the complete visible virtual desktop across all displays and return text metadata plus MCP image content; this is not a background-tab screenshot, save_path only adds a disk copy, and return_base64 is opt-in. width/height/left/top are PHYSICAL screen pixels and are exactly the range mouse_click accepts, unscaled.

NameTypeReqDescription
return_base64boolean
save_pathstring

No output schema declared.

No examples provided.

capture_page_screenshot ~191

Capture a viewport, full-page, or clipped screenshot of a page/tab via CDP with optional JPEG/WebP quality. Returns text metadata plus an attached MCP image even when save_path is set; save_path only controls disk output. image_width/image_height are DEVICE pixels (CSS x devicePixelRatio), not the CSS pixels page_click takes, and `size` is the byte count. If the current model cannot consume images, it has not seen the pixels and must use scan_page, execute_js, a page-specific API, or OCR instead. Base64 is included only when return_base64=true.

NameTypeReqDescription
clip
formatstring
full_pageboolean
quality
return_base64boolean
save_pathstring
session_id
tab_id
timeoutnumber

No output schema declared.

No examples provided.

cdp_batch ~40

Run a CDP bridge batch command; pass the full JSON command object as text.

NameTypeReqDescription
batch_jsonstringyes
session_id

Structured output declared, but exposes no named fields.

No examples provided.

cdp_command ~85

Call one Chrome DevTools Protocol command. session_id accepts client:tabId; tab_id accepts either a native number or the same composite session string.

NameTypeReqDescription
extension_id
methodstringyes
params_jsonstring
session_id
tab_id
target_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

close_tabs ~117

Close one or more tabs by native tab id or composite session_id. Accepts a single identifier or a list; identifiers in one call must belong to the same browser. By default it closes only tabs created by this MCP task and requires the owner_id returned by open_new_tab; lifecycle generations are checked before removal. Set only_if_agent_owned=false only for an explicit operator request to close a user tab.

NameTypeReqDescription
only_if_agent_ownedboolean
owner_id
session_id
tab_idyes

Structured output declared, but exposes no named fields.

No examples provided.

console_capture_start ~61

Start a bounded Runtime console and exception capture on a real-browser tab without foregrounding it. Use get_console_messages while running and console_capture_stop when done.

NameTypeReqDescription
max_entriesinteger
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

console_capture_stop ~44

Stop console capture on a real-browser tab, return the remaining bounded message buffer, and release its debugger lease.

NameTypeReqDescription
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

create_bookmark ~66

Create a bookmark or folder. Supply url for a bookmark; omit url to create a folder. parent_id is optional and uses Chrome's default bookmark location when omitted.

NameTypeReqDescription
parent_id
session_id
titlestringyes
url

Structured output declared, but exposes no named fields.

No examples provided.

debugger_targets ~42

List every CDP-attachable target, including service workers and extension background pages that list_tabs never shows. Works with no tabs open.

NameTypeReqDescription
session_id

Structured output declared, but exposes no named fields.

No examples provided.

delete_cookies ~97

Delete a cookie by name from the real browser profile. Scope defaults to the current page (url), or pass domain/path/url to target another scope. Uses CDP Network.deleteCookies, falling back to expiring it via document.cookie.

NameTypeReqDescription
domain
namestringyes
path
session_id
tab_id
timeoutnumber
url

Structured output declared, but exposes no named fields.

No examples provided.

download_file ~159

Download an http(s) URL through the real browser's native download manager, so the current browser profile's cookies and authenticated session are used. Waits for completion by default and returns the final absolute local path. directory may be any absolute local directory; completed files are moved there without replacing an existing file unless overwrite=true. A directory timeout reports directory_applied=false because Chrome may finish in its default download directory. An explicit session_id must still be live and is never replaced with another profile. Use this for attachments instead of page fetch.

NameTypeReqDescription
directory
filename
overwriteboolean
session_id
timeoutnumber
urlstringyes
waitboolean

Structured output declared, but exposes no named fields.

No examples provided.

execute_js ~137

Execute arbitrary JS in the requested real-browser tab under one total deadline. BTAP pins every monitor/retry/result roundtrip to an explicit session, uses the service-worker/page route first, and falls back to directed Runtime.evaluate on SPA/CSP bridge failures without retargeting. Use wait_for/wait_for_url instead of setTimeout or sleep Promises; BTAP retries only proven-undelivered work, never an acknowledged script whose side effects may already have run.

NameTypeReqDescription
dialog_policystring
no_monitorboolean
scriptstringyes
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

extension_path ~22

Get absolute path to the unpacked Chrome extension directory for manual installation.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

get_automation_profile ~53

Return the active safe/lab automation profile. Lab is the default and skips elicitation unless BROWSERTAP_LAB_NO_ELICIT is explicitly disabled; safe requires approval for every physical action and permission allow.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

get_bookmarks ~27

Return the browser bookmark tree. Works with no tabs open.

NameTypeReqDescription
session_id

Structured output declared, but exposes no named fields.

No examples provided.

get_console_messages ~103

Read a page of captured console messages and exceptions from a real-browser tab. Set clear=true to clear the full buffer after reading. Set filter='user' to exclude extension service-worker / content-script logs and keep only the page's own main-world console output.

NameTypeReqDescription
clearboolean
filterstring
max_itemsinteger
offsetinteger
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

get_cookies ~36

Get cookies for the current page or specified tab via the Chrome extension bridge.

NameTypeReqDescription
session_id
tab_id

Structured output declared, but exposes no named fields.

No examples provided.

get_setup_status ~32

Return component versions, stale-build actions, extension path, bridge ports, and connection status for setup/diagnostics.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

handle_dialog ~66

Inspect or handle a JavaScript dialog on the requested real-browser tab. action is dismiss, accept, or manual; manual reports the dialog without choosing.

NameTypeReqDescription
actionstringyes
prompt_textstring
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

hotkey ~128

Send a hotkey chord like 'command,l' or 'ctrl,shift,p' via the real keyboard. Safe mode requires one-action approval; lab skips prompting by default and uses session approval only when BROWSERTAP_LAB_NO_ELICIT is explicitly disabled. By default BTAP foregrounds and verifies the selected browser tab after the quiet-input check; prefer an explicit session_id for browser input. activate_session='none' is only for intentional input to the already-visible desktop or native UI.

NameTypeReqDescription
activate_session
keys_csvstringyes
session_id

Structured output declared, but exposes no named fields.

No examples provided.

list_all_tabs ~66

List every open tab, including chrome-extension:// pages that list_tabs hides. Those never become sessions (content scripts can't run there), so they have no session id — drive them with cdp_command(tab_id=...) instead. Works with no tabs open.

NameTypeReqDescription
session_id

Structured output declared, but exposes no named fields.

No examples provided.

list_extensions ~35

List installed browser extensions (id, name, enabled, type, version). Works with no tabs open.

NameTypeReqDescription
session_id

Structured output declared, but exposes no named fields.

No examples provided.

list_tabs ~38

List connected tabs across all connected browsers; each tab has a browser field (chrome/edge/opera) and a session id to pass verbatim.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

mouse_click ~188

Click on the real desktop at absolute virtual-desktop coordinates in PHYSICAL screen pixels — the space pointer_info and capture_desktop_screenshot report, NOT the viewport CSS pixels page_click takes; on a scaled display the two differ by devicePixelRatio. A point on no display is refused with coordinates_off_screen rather than clamped to a screen edge. Pass session_id — the same one you pass every other tool (preferred) — and that tab is raised after the quiet check so the click lands on it. Without one the current global target is raised, which another task may have changed. Approval may foreground the selected browser tab. activate_session='none' clicks the desktop as-is.

NameTypeReqDescription
activate_session
buttonstring
clicksinteger
intervalnumber
session_id
x
y

Structured output declared, but exposes no named fields.

No examples provided.

mouse_drag ~191

Drag the real mouse from one point to another, both in absolute virtual-desktop PHYSICAL screen pixels (see mouse_click for how that differs from page_drag's CSS pixels). Either endpoint on no display is refused with coordinates_off_screen. Safe mode requires one-action approval; lab skips prompting by default and uses session approval only when BROWSERTAP_LAB_NO_ELICIT is explicitly disabled. By default BTAP foregrounds and verifies the selected browser tab after the quiet-input check; prefer an explicit session_id for browser input. activate_session='none' is only for intentional input to the already-visible desktop or native UI.

NameTypeReqDescription
activate_session
buttonstring
durationnumber
session_id
x1integeryes
x2integeryes
y1integeryes
y2integeryes

Structured output declared, but exposes no named fields.

No examples provided.

mouse_move ~176

Move the real mouse cursor to absolute virtual-desktop coordinates in PHYSICAL screen pixels (the space pointer_info and capture_desktop_screenshot report, not the CSS pixels page_click takes). A point on no display is refused with coordinates_off_screen rather than clamped to a screen edge. Safe mode requires one-action approval; lab skips prompting by default and uses session approval only when BROWSERTAP_LAB_NO_ELICIT is explicitly disabled. By default BTAP foregrounds and verifies the selected browser tab after the quiet-input check; prefer an explicit session_id for browser input. activate_session='none' is only for intentional input to the already-visible desktop or native UI.

NameTypeReqDescription
activate_session
durationnumber
session_id
xintegeryes
yintegeryes

Structured output declared, but exposes no named fields.

No examples provided.

network_capture_start ~98

Start bounded CDP Network capture on a real-browser tab. Captures requests, responses, and optionally response bodies without foregrounding the tab. Call network_capture_stop to return the buffer and release the debugger lease.

NameTypeReqDescription
body_timeoutnumber
include_bodiesboolean
max_body_bytesinteger
max_entriesinteger
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

network_capture_stop ~113

Stop Network capture on a real-browser tab, optionally filter returned records by URL, resource type, HTTP status range, or response-body inclusion, and release its debugger lease. url_pattern uses the browser's JavaScript RegExp syntax and invalid patterns return a structured error.

NameTypeReqDescription
include_response_bodiesboolean
resource_typestring
session_id
status_max
status_min
timeoutnumber
url_patternstring

Structured output declared, but exposes no named fields.

No examples provided.

open_new_tab ~169

Open one real-browser tab in the background by default with an operation_id-backed exactly-once create. Pass active=true only when foreground work is genuinely required. If the create ACK is lost, the same operation_id is reconciled within one total deadline; a completed result is registered only with its exact client_id, tab_id, and generation. Before create is dispatched, an unresolved probe returns status=unknown, may_have_created=false, retry_safe=true; after dispatch, an unresolved operation returns status=unknown, may_have_created=true, retry_safe=false and the operation_id. Never use a URL-based guess or an unmarked create retry.

NameTypeReqDescription
activeboolean
owner_id
session_id
timeoutnumber
urlstringyes

Structured output declared, but exposes no named fields.

No examples provided.

open_url ~104

Navigate the current real-browser tab through CDP without raising its window. beforeunload defaults to dismiss, except lab mode auto-accepts configured shell/IDE hosts. Use accept to leave explicitly, manual to inspect, or intent_leave=false to force the conservative dismiss behavior even on a lab auto host.

NameTypeReqDescription
beforeunloadstring
intent_leave
session_id
timeoutnumber
urlstringyes

Structured output declared, but exposes no named fields.

No examples provided.

page_click ~242

Click a CSS/structured locator or viewport coordinates in a specific real browser tab using background CDP input. Coordinates are viewport-relative CSS pixels (the space getBoundingClientRect reports), NOT the physical screen pixels mouse_click takes and NOT the device pixels capture_page_screenshot returns -- on a scaled display divide a screenshot pixel by devicePixelRatio first. Ambiguous or unreachable targets dispatch nothing; the tab is not activated and the desktop cursor does not move. Selector offsets are measured from the element's top-left corner; an omitted axis uses the element centre. In selector mode the point is hit-tested before anything is dispatched: an element below the fold is scrolled into view, and a point owned by another element returns status 'obscured' (with occluded_by) or 'outside_viewport' having clicked nothing. Coordinate mode is not hit-tested -- coordinates name a pixel, not an element.

NameTypeReqDescription
buttonstring
clicksinteger
offset_x
offset_y
selector
session_id
timeoutnumber
x
y

Structured output declared, but exposes no named fields.

No examples provided.

page_drag ~122

Drag between viewport coordinates in a specific tab using one background CDP input sequence, without activating the tab or moving the desktop cursor. Both endpoints are viewport-relative CSS pixels, like page_click's coordinate mode and unlike mouse_drag's physical screen pixels, and neither is hit-tested.

NameTypeReqDescription
buttonstring
durationnumber
session_id
timeoutnumber
x1numberyes
x2numberyes
y1numberyes
y2numberyes

Structured output declared, but exposes no named fields.

No examples provided.

page_press ~53

Press a key or comma-delimited modifier chord in a specific tab using background CDP input, without activating the tab.

NameTypeReqDescription
keys_csvstringyes
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

page_type ~101

Insert text into the focused element or a CSS/structured-locator field in a specific tab using background CDP input; xterm containers automatically retarget their helper textarea. Optionally clear and submit a key. Missing, ambiguous, or unusable targets dispatch nothing.

NameTypeReqDescription
clearboolean
selector
session_id
submit_keystring
textstringyes
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

pointer_info ~63

Report the current desktop mouse position and screen geometry in PHYSICAL pixels. screen_width/screen_height are the PRIMARY display only; screen_bounds is the virtual desktop across every display and is the range mouse_click will accept. These are not the CSS pixels the page_* tools take.

Input schema present but exposes no named parameters.

Structured output declared, but exposes no named fields.

No examples provided.

remove_bookmark ~50

Remove a bookmark by id. Set recursive=true only for a folder whose full subtree should be removed.

NameTypeReqDescription
bookmark_idstringyes
recursiveboolean
session_id

Structured output declared, but exposes no named fields.

No examples provided.

reset_site_permissions ~59

Restore matching temporary site-permission leases now. Omit origin and permission to reset every lease for the selected browser; origin accepts only http/https.

NameTypeReqDescription
originstring
permissionstring
session_id

Structured output declared, but exposes no named fields.

No examples provided.

resolve_leave_dialog ~60

Resolve an intended beforeunload leave in one bounded workflow: protocol accept twice, return immediately when no dialog exists, then use a lab-only foreground Enter fallback after the normal physical-input approval gate only when protocol handling actually fails.

NameTypeReqDescription
session_id

Structured output declared, but exposes no named fields.

No examples provided.

save_pdf ~113

Print a real-browser tab to a validated PDF file through bounded CDP. The file is written atomically only after valid non-empty PDF bytes are returned; a CDP timeout invalidates and detaches the debugger lease.

NameTypeReqDescription
landscapeboolean
page_rangesstring
prefer_css_page_sizeboolean
print_backgroundboolean
save_pathstringyes
scalenumber
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

scan_page ~94

Read the current page as simplified HTML/text, preserving login state from the real browser. Defaults: cutlist=true, maxchars=35000, timeout=15 seconds.

NameTypeReqDescription
cutlistboolean
extra_jsstring
instructionstring
maxcharsinteger
session_id
text_onlyboolean
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

scroll_page ~100

Scroll the page and report the new position. scan_page omits anything past ±5000px from the current scroll offset, so on a long page: scan, then scroll, then scan again. Pass to='bottom'/'top', a pixel offset, or a CSS selector to bring into view. Defaults: to='bottom', timeout=15 seconds.

NameTypeReqDescription
session_id
timeoutnumber
tostring

Structured output declared, but exposes no named fields.

No examples provided.

set_automation_profile ~48

Set the safe or lab automation profile for this MCP process. This does not persist or reload the extension; BROWSERTAP_MODE controls the next process.

NameTypeReqDescription
modestringyes

Structured output declared, but exposes no named fields.

No examples provided.

set_cookies ~129

Write cookies into the real browser profile. Takes one cookie object or a list (JSON text is accepted): name is required, plus optional value/url/domain/path/expires (Unix seconds)/httpOnly/secure/sameSite. Uses CDP Network.setCookie so HttpOnly and cross-path cookies work; falls back to document.cookie only if CDP is unavailable, and then says which cookies could not carry HttpOnly. Cookies with neither url nor domain are scoped to the current page.

NameTypeReqDescription
cookiesyes
session_id
tab_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

set_extension_enabled ~99

Enable or disable an installed extension by id. Chrome exposes no API to INSTALL an extension, so this only toggles ones already present; use list_extensions for ids. The BTAP bridge refuses to disable itself -- nothing would be left to re-enable it -- so ask a human to press Reload on chrome://extensions to pick up a new build.

NameTypeReqDescription
enabledbooleanyes
extension_idstringyes
session_id

Structured output declared, but exposes no named fields.

No examples provided.

set_site_permission ~120

Temporarily set an origin-scoped browser site permission for 60-600 seconds. Only http/https origins and notifications, geolocation/location, camera, microphone, or clipboard are supported. safe asks on every allow; lab skips prompts by default and restores session approval only when BROWSERTAP_LAB_NO_ELICIT is explicitly disabled. All leases restore their prior setting.

NameTypeReqDescription
duration_secondsinteger
originstring
permissionstringyes
session_id
settingstringyes

Structured output declared, but exposes no named fields.

No examples provided.

storage_get ~102

Read localStorage or sessionStorage. Give a key for one value, or omit it to dump every key (values are truncated past ~20k chars and truncated is reported). area='local' (default) or 'session'.

NameTypeReqDescription
areastring
key
max_bytesinteger
max_itemsinteger
offsetinteger
session_id
timeoutnumber

Structured output declared, but exposes no named fields.

No examples provided.

storage_set ~82

Write one key into localStorage or sessionStorage and read it back to confirm. area='local' (default) or 'session'. Values are strings; non-string values are JSON-encoded first.

NameTypeReqDescription
areastring
keystringyes
session_id
timeoutnumber
valuestringyes

Structured output declared, but exposes no named fields.

No examples provided.

switch_tab ~94

Set the target tab for later calls by session id, URL substring, or browser name ('chrome'/'edge'/'opera') without focusing the browser. A URL substring must match exactly one tab; pass its full session_id when several tabs match. Use activate=true or activate_tab when foreground work is required.

NameTypeReqDescription
activateboolean
browser
session_id
url_pattern

Structured output declared, but exposes no named fields.

No examples provided.

Common questions

What is the BrowserTap MCP server?

BrowserTap MCP is listed in the public MCP registry as io.github.LinVireo/browsertap-mcp. MCP server that drives the real Chrome you already use, through an extension and CDP. This page covers its PyPI package (browsertap-mcp).

Is the BrowserTap MCP server safe to use?

BrowserTap MCP scores 79 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. 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 BrowserTap MCP server expose?

BrowserTap MCP exposes 55 tools: get_automation_profile, set_automation_profile, get_setup_status, list_tabs, list_all_tabs, and 50 more. Their descriptions and schemas cost roughly 5,237 tokens of context every time the server is loaded.

Is the BrowserTap MCP server still maintained?

BrowserTap MCP 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.