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
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
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 5 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
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
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
claude mcp add linvireo-browsertap-mcp -- uvx browsertap-mcp
{
"mcpServers": {
"linvireo-browsertap-mcp": {
"command": "uvx",
"args": [
"browsertap-mcp"
]
}
}
} {
"servers": {
"linvireo-browsertap-mcp": {
"command": "uvx",
"args": [
"browsertap-mcp"
]
}
}
} codex mcp add linvireo-browsertap-mcp -- uvx browsertap-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"linvireo-browsertap-mcp": {
"type": "local",
"command": [
"uvx",
"browsertap-mcp"
],
"enabled": true
}
}
} openclaw mcp add linvireo-browsertap-mcp --command uvx --arg browsertap-mcp
mcp_servers:
linvireo-browsertap-mcp:
command: "uvx"
args: ["browsertap-mcp"] {
"McpServers": {
"linvireo-browsertap-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"browsertap-mcp"
]
}
}
} assistant mcp add linvireo-browsertap-mcp -t stdio -c uvx -a browsertap-mcp
{
"mcpServers": {
"linvireo-browsertap-mcp": {
"command": "uvx",
"args": [
"browsertap-mcp"
]
}
}
} 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.
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 →
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 →
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| extension_id | string | yes | – |
| message_json | string | yes | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| return_base64 | boolean | – | – |
| save_path | string | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| clip | – | – | – |
| format | string | – | – |
| full_page | boolean | – | – |
| quality | – | – | – |
| return_base64 | boolean | – | – |
| save_path | string | – | – |
| session_id | – | – | – |
| tab_id | – | – | – |
| timeout | number | – | – |
No output schema declared.
No examples provided.
cdp_batch ~40
Run a CDP bridge batch command; pass the full JSON command object as text.
| Name | Type | Req | Description |
|---|---|---|---|
| batch_json | string | yes | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| extension_id | – | – | – |
| method | string | yes | – |
| params_json | string | – | – |
| session_id | – | – | – |
| tab_id | – | – | – |
| target_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| only_if_agent_owned | boolean | – | – |
| owner_id | – | – | – |
| session_id | – | – | – |
| tab_id | – | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| max_entries | integer | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| parent_id | – | – | – |
| session_id | – | – | – |
| title | string | yes | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| domain | – | – | – |
| name | string | yes | – |
| path | – | – | – |
| session_id | – | – | – |
| tab_id | – | – | – |
| timeout | number | – | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| directory | – | – | – |
| filename | – | – | – |
| overwrite | boolean | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
| url | string | yes | – |
| wait | boolean | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| dialog_policy | string | – | – |
| no_monitor | boolean | – | – |
| script | string | yes | – |
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| clear | boolean | – | – |
| filter | string | – | – |
| max_items | integer | – | – |
| offset | integer | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| prompt_text | string | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activate_session | – | – | – |
| keys_csv | string | yes | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| activate_session | – | – | – |
| button | string | – | – |
| clicks | integer | – | – |
| interval | number | – | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| activate_session | – | – | – |
| button | string | – | – |
| duration | number | – | – |
| session_id | – | – | – |
| x1 | integer | yes | – |
| x2 | integer | yes | – |
| y1 | integer | yes | – |
| y2 | integer | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activate_session | – | – | – |
| duration | number | – | – |
| session_id | – | – | – |
| x | integer | yes | – |
| y | integer | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| body_timeout | number | – | – |
| include_bodies | boolean | – | – |
| max_body_bytes | integer | – | – |
| max_entries | integer | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| include_response_bodies | boolean | – | – |
| resource_type | string | – | – |
| session_id | – | – | – |
| status_max | – | – | – |
| status_min | – | – | – |
| timeout | number | – | – |
| url_pattern | string | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | – |
| owner_id | – | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
| url | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| beforeunload | string | – | – |
| intent_leave | – | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
| url | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| button | string | – | – |
| clicks | integer | – | – |
| offset_x | – | – | – |
| offset_y | – | – | – |
| selector | – | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| button | string | – | – |
| duration | number | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
| x1 | number | yes | – |
| x2 | number | yes | – |
| y1 | number | yes | – |
| y2 | number | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| keys_csv | string | yes | – |
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| clear | boolean | – | – |
| selector | – | – | – |
| session_id | – | – | – |
| submit_key | string | – | – |
| text | string | yes | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| bookmark_id | string | yes | – |
| recursive | boolean | – | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| origin | string | – | – |
| permission | string | – | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| landscape | boolean | – | – |
| page_ranges | string | – | – |
| prefer_css_page_size | boolean | – | – |
| print_background | boolean | – | – |
| save_path | string | yes | – |
| scale | number | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cutlist | boolean | – | – |
| extra_js | string | – | – |
| instruction | string | – | – |
| maxchars | integer | – | – |
| session_id | – | – | – |
| text_only | boolean | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| session_id | – | – | – |
| timeout | number | – | – |
| to | string | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cookies | – | yes | – |
| session_id | – | – | – |
| tab_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | yes | – |
| extension_id | string | yes | – |
| 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.
| Name | Type | Req | Description |
|---|---|---|---|
| duration_seconds | integer | – | – |
| origin | string | – | – |
| permission | string | yes | – |
| session_id | – | – | – |
| setting | string | yes | – |
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'.
| Name | Type | Req | Description |
|---|---|---|---|
| area | string | – | – |
| key | – | – | – |
| max_bytes | integer | – | – |
| max_items | integer | – | – |
| offset | integer | – | – |
| session_id | – | – | – |
| timeout | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| area | string | – | – |
| key | string | yes | – |
| session_id | – | – | – |
| timeout | number | – | – |
| value | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| activate | boolean | – | – |
| browser | – | – | – |
| session_id | – | – | – |
| url_pattern | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
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.