
Stealth Browser MCP Server: Setup for Claude, Cursor and Other Apps
Lets your assistant drive a real Chrome built to avoid bot detection, read pages, watch network traffic and copy page elements.
This community server starts a real Chrome, Chromium or Edge window on your computer and gives the assistant more than a hundred controls for it. It is built to avoid bot-detection checks, so sites are less likely to flag it as automated.
It has no read-only mode. The assistant can click, type, run JavaScript, read cookies and change network traffic, so treat it like handing over a browser.
Good for
- Developers debugging how a site loads and what its API returns
- Researchers who need pages that block ordinary scrapers
- Front-end developers who want to copy an element's HTML, CSS and events
- Testers who need to intercept and change browser traffic
Works in
12 should work
Tap an app to see how to set it up and any known problems.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Client does not support this transport.
Client does not support this transport.
Install stealth-browser MCP
Claude Code
- 1
Copy this prompt.
Add the stealth-browser MCP server to Claude Code. Run this command: claude mcp add --transport stdio stealth-browser -- uvx browserstealthmcp Then check that it loaded and tell me if I need to sign in or restart.
- 2
Paste it into Claude Code. It shows the change and asks before running it.
Requires Python 3.10 or newer, Chrome, Chromium or Edge.
Read-only mode: There is no read-only mode. Start with --minimal for 21 core tools, or switch off sections such as --disable-cdp-functions and --disable-dynamic-hooks.
Needs Python 3.10 or newer and Chrome, Chromium or Microsoft Edge on your computer. The PyPI package is called browserstealthmcp, because the name stealth-browser-mcp on PyPI belongs to a different project. The README also installs it with pipx and runs the stealth-browser-mcp command. Add --minimal to the arguments to load only 21 core tools, which keeps the assistant's tool list short.
Built from the package data we hold. Not yet tested by us.
Tools
Opens a stealth Chrome window
Starts a new Chrome, Chromium or Edge window that is set up to look like a normal person's browser, and returns its ID.
Try: “Open a stealth browser.”
Write ·
spawn_browserLists your open browser windows
Shows every browser session this server has started.
Try: “Which browsers are open?”
Read ·
list_instancesCloses a browser window
Shuts a browser session down cleanly.
Try: “Close the browser.”
Write ·
close_instanceShows the state of a browser
Returns details about one browser session, such as its tabs and settings.
Try: “What is the state of this browser?”
Read ·
get_instance_stateGoes to a web address
Loads a URL in the current tab.
Try: “Open https://example.com.”
Network ·
navigateGoes back one page
Moves the tab back in its history.
Try: “Go back.”
Network ·
go_backGoes forward one page
Moves the tab forward in its history.
Try: “Go forward.”
Network ·
go_forwardReloads the page
Refreshes the current page.
Try: “Reload the page.”
Network ·
reload_pageFinds elements on the page
Looks up elements by CSS selector or XPath and returns what it finds.
Try: “Find all the buttons on this page.”
Network ·
query_elementsClicks something on the page
Clicks the element you point to, which can submit forms or trigger actions.
Try: “Click the login button.”
Write ·
click_elementTypes text like a person
Types into a field with human-like timing and supports new lines.
Try: “Type my search term into the box.”
Write ·
type_textPastes text instantly
Puts text into a field at once instead of typing it.
Try: “Paste this address into the field.”
Write ·
paste_textPresses a keyboard key
Sends a real key press such as Enter, Tab, arrows or shortcuts.
Try: “Press Enter.”
Write ·
press_keyUploads a local file to a form
Attaches a file from an allowed folder on your computer to a file input on the page.
Try: “Upload report.pdf to the form.”
Write ·
file_uploadChooses a dropdown option
Selects an item in a dropdown.
Try: “Pick "United States" in the country list.”
Write ·
select_optionChecks an element's state
Reports whether an element is visible, enabled or checked.
Try: “Is the submit button enabled?”
Network ·
get_element_stateWaits for something to appear
Pauses until an element shows up on the page.
Try: “Wait until the results appear.”
Network ·
wait_for_elementScrolls the page
Scrolls in a natural way, for example to load more content.
Try: “Scroll down to the bottom.”
Network ·
scroll_pageRuns JavaScript on the page
Runs JavaScript code you give it inside the open page and returns the result.
Try: “Run a script to get the page title.”
Runs code ·
execute_scriptReads the page text and HTML
Returns the HTML and text of the current page.
Try: “Read the page.”
Network ·
get_page_contentTakes a screenshot
Captures an image of the page.
Try: “Take a screenshot.”
Network ·
take_screenshotLists requests the page made
Shows the network requests captured so far.
Try: “What requests did this page make?”
Network ·
list_network_requestsShows a request's headers and body
Returns the headers and payload of one captured request.
Try: “Show the details of that request.”
Network ·
get_request_detailsShows a response's metadata
Returns the status and headers of a captured response.
Try: “What did the server answer?”
Network ·
get_response_detailsReads a response body
Returns the content of a captured response.
Try: “Show the JSON the API returned.”
Network ·
get_response_contentSearches captured requests
Finds captured requests that match your search.
Try: “Find requests to the login API.”
Network ·
search_network_requestsSaves captured network traffic
Exports captured traffic to a file.
Try: “Export the traffic to a file.”
Write ·
export_network_dataLoads saved network traffic
Reads previously exported traffic back in.
Try: “Import the saved traffic file.”
Files ·
import_network_dataChooses which traffic to capture
Sets filters that limit which requests are recorded.
Try: “Only capture API calls.”
Write ·
set_network_capture_filtersShows the capture filters
Returns the filters that are active now.
Try: “What filters are active?”
Read ·
get_network_capture_filtersChanges request headers
Adds or replaces headers on requests the browser sends.
Try: “Add a custom header to all requests.”
Write ·
modify_headersReads cookies
Returns the cookies of the current page, which can include login sessions.
Try: “Show the cookies for this site.”
Network ·
get_cookiesSets a cookie
Adds a cookie to the browser.
Try: “Set a cookie named theme to dark.”
Write ·
set_cookieClears cookies
Removes cookies from the browser session.
Try: “Clear all cookies.”
Delete ·
clear_cookiesShows debug logs
Returns the server's debug logs and statistics, a page at a time.
Try: “Show the debug log.”
Read ·
get_debug_viewClears the debug logs
Empties the stored debug logs.
Try: “Clear the debug log.”
Delete ·
clear_debug_viewSaves the debug logs to a file
Exports logs as JSON, pickle or gzip.
Try: “Export the debug logs.”
Write ·
export_debug_logsChecks the debug logger lock
Reports the state of the debug logger's lock.
Try: “Is the debug logger locked?”
Read ·
get_debug_lock_statusReloads server code without restart
Reloads the server's modules while it keeps running.
Try: “Hot reload the modules.”
Runs code ·
hot_reloadChecks the module reload status
Reports how the last module reload went.
Try: “Did the reload work?”
Read ·
reload_statusChecks if your system can run it
Diagnoses whether your browser and platform work with the server.
Try: “Check my browser setup.”
Read ·
validate_browser_environment_toolLists open tabs
Shows the tabs open in a browser.
Try: “What tabs are open?”
Read ·
list_tabsSwitches to another tab
Makes another tab the active one.
Try: “Switch to the second tab.”
Write ·
switch_tabCloses a tab
Closes a tab.
Try: “Close this tab.”
Write ·
close_tabShows the active tab
Returns which tab is active now.
Try: “Which tab am I on?”
Read ·
get_active_tabOpens a new tab
Creates a new tab.
Try: “Open a new tab.”
Write ·
new_tabReads an element's styles
Returns the computed CSS of an element.
Try: “Get the styles of the header.”
Network ·
extract_element_stylesReads an element's structure
Returns the DOM structure of an element.
Try: “Get the structure of the nav bar.”
Network ·
extract_element_structureReads an element's event listeners
Lists the event listeners attached to an element.
Try: “What happens when I click this button?”
Network ·
extract_element_eventsReads an element's animations
Returns animations and transitions on an element.
Try: “Get the animations on the hero section.”
Network ·
extract_element_animationsLists an element's images and fonts
Returns the images, fonts and videos an element uses.
Try: “What assets does the banner use?”
Network ·
extract_element_assetsReads styles through the browser protocol
Gets computed styles using the browser's debugging protocol only.
Try: “Get the styles of the card via the protocol.”
Network ·
extract_element_styles_cdpFinds linked CSS and JavaScript files
Lists the stylesheet and script files related to an element.
Try: “Which files style this element?”
Network ·
extract_related_filesCopies an element completely
Extracts an element with its structure, styles, events and assets so it can be rebuilt.
Try: “Clone the pricing table.”
Network ·
clone_element_completeCopies an element via the protocol
Does a complete element copy using only the debugging protocol.
Try: “Clone the footer via the protocol.”
Network ·
extract_complete_element_cdpStarts a light copy of an element
Makes a small first copy of an element that you can expand piece by piece.
Try: “Start a light clone of the navbar.”
Network ·
clone_element_progressiveAdds styles to a light copy
Loads the styles of a stored light copy on demand.
Try: “Expand the styles of that clone.”
Read ·
expand_stylesAdds events to a light copy
Loads the event listeners of a stored light copy.
Try: “Expand the events.”
Read ·
expand_eventsAdds child elements to a light copy
Loads the child nodes of a stored light copy.
Try: “Expand the children.”
Read ·
expand_childrenAdds CSS rules to a light copy
Loads the CSS rules of a stored light copy.
Try: “Expand the CSS rules.”
Read ·
expand_css_rulesAdds pseudo-elements to a light copy
Loads before/after elements of a stored light copy.
Try: “Expand the pseudo-elements.”
Read ·
expand_pseudo_elementsAdds animations to a light copy
Loads the animation data of a stored light copy.
Try: “Expand the animations.”
Read ·
expand_animationsLists stored light copies
Shows the progressive copies held in memory.
Try: “What clones are stored?”
Read ·
list_stored_elementsRemoves one stored copy
Deletes one stored progressive copy.
Try: “Remove that clone.”
Delete ·
clear_stored_elementRemoves all stored copies
Deletes every stored progressive copy.
Try: “Remove all stored clones.”
Delete ·
clear_all_elementsSaves a full element copy to a file
Writes a complete element copy to a file on your computer.
Try: “Save a clone of the header to a file.”
Write ·
clone_element_to_fileSaves a full extraction to a file
Writes a complete element extraction to a file.
Try: “Save the full extraction to a file.”
Write ·
extract_complete_element_to_fileSaves styles to a file
Writes an element's styles to a file.
Try: “Save the styles to a file.”
Write ·
extract_element_styles_to_fileSaves structure to a file
Writes an element's structure to a file.
Try: “Save the structure to a file.”
Write ·
extract_element_structure_to_fileSaves events to a file
Writes an element's event listeners to a file.
Try: “Save the events to a file.”
Write ·
extract_element_events_to_fileSaves animations to a file
Writes an element's animations to a file.
Try: “Save the animations to a file.”
Write ·
extract_element_animations_to_fileSaves assets to a file
Writes an element's asset list to a file.
Try: “Save the assets to a file.”
Write ·
extract_element_assets_to_fileLists saved clone files
Shows the clone files saved on your computer.
Try: “What clone files do I have?”
Files ·
list_clone_filesDeletes old clone files
Removes older saved clone files from your computer.
Try: “Delete old clone files.”
Delete ·
cleanup_clone_filesLists browser protocol commands
Shows the Chrome DevTools Protocol commands that can be run.
Try: “What protocol commands are available?”
Read ·
list_cdp_commandsRuns any browser protocol command
Sends a raw Chrome DevTools Protocol command to the browser, which can do almost anything the browser can.
Try: “Run a protocol command to clear the cache.”
Runs code ·
execute_cdp_commandRuns a script before each page loads
Installs a script that runs before the page's own JavaScript on every new document.
Try: “Run this script before every page loads.”
Runs code ·
add_script_to_evaluate_on_new_documentLists JavaScript contexts
Shows the JavaScript execution contexts of the page.
Try: “List the page's contexts.”
Network ·
get_execution_contextsFinds global JavaScript functions
Lists functions the page defines globally.
Try: “What global functions does this page define?”
Network ·
discover_global_functionsFinds methods on an object
Lists the methods of a JavaScript object on the page.
Try: “What methods does window.app have?”
Network ·
discover_object_methodsCalls a function on the page
Runs a page function that was found earlier.
Try: “Call the checkout function.”
Runs code ·
call_javascript_functionShows a function's details
Returns the signature and details of a page function.
Try: “Show how that function is defined.”
Network ·
inspect_function_signatureInjects and runs JavaScript
Adds your JavaScript to the page and runs it.
Try: “Inject this script into the page.”
Runs code ·
inject_and_execute_scriptCreates a function that survives reloads
Defines a page function that stays after the page reloads.
Try: “Create a helper function that persists.”
Runs code ·
create_persistent_functionLets the page call the agent
Exposes a window function so page JavaScript can call back to the assistant.
Try: “Create a binding the page can call.”
Runs code ·
create_page_bindingReads calls from the page
Returns queued calls the page made to a binding, optionally waiting for one.
Try: “Did the page call my binding?”
Network ·
get_page_binding_callsAnswers a call from the page
Replies to a page binding call with a value or an error.
Try: “Answer the page's call with true.”
Runs code ·
resolve_page_binding_callRemoves a page binding
Deletes a binding and rejects its waiting calls.
Try: “Remove the binding.”
Write ·
remove_page_bindingRuns several page functions in order
Executes an ordered list of function calls on the page.
Try: “Run these three functions in order.”
Runs code ·
execute_function_sequenceRuns Python in the page
Translates Python to JavaScript with py2js and runs it in the page.
Try: “Run this Python snippet in the page.”
Runs code ·
execute_python_in_browserShows the function executor state
Reports the state of the function executor.
Try: “What is the executor doing?”
Read ·
get_function_executor_infoCreates a network hook in Python
Writes a restricted Python hook that can block, redirect, change or fake requests and responses as they pass.
Try: “Create a hook that blocks image requests.”
Runs code ·
create_dynamic_hookCreates a hook from a preset
Makes a hook from a common ready-made pattern.
Try: “Create a hook that blocks ads.”
Runs code ·
create_simple_dynamic_hookLists active hooks
Shows the hooks that are running.
Try: “What hooks are active?”
Read ·
list_dynamic_hooksShows a hook's code
Returns the source and details of one hook.
Try: “Show me the code of the ad blocker hook.”
Read ·
get_dynamic_hook_detailsRemoves a hook
Stops and deletes a hook.
Try: “Remove the ad blocker hook.”
Write ·
remove_dynamic_hookReads the hook docs
Returns documentation for the request object and hook actions.
Try: “How do I write a hook?”
Read ·
get_hook_documentationShows hook examples
Returns example hooks.
Try: “Show hook examples.”
Read ·
get_hook_examplesReads hook matching rules
Returns documentation on matching and best practices for hooks.
Try: “How does hook matching work?”
Read ·
get_hook_requirements_documentationShows common hook patterns
Returns common patterns for hooks.
Try: “Show common hook patterns.”
Read ·
get_hook_common_patternsChecks hook code before use
Validates hook code without running it on traffic.
Try: “Check that this hook code is valid.”
Read ·
validate_hook_function
Read from the source code
Permissions
high risk · 4 things to watch
High risk
It can click, type, read cookies and storage, run JavaScript and change network traffic in a real browser. Use it only with accounts and sites you are comfortable letting the assistant control, and start with the minimal mode.
What it can do
- Read your data
- Create and change things
- Delete things
- Read-only mode
Watch out for
It can run code and change traffic in a live browser
Tools run JavaScript, send raw browser protocol commands and install Python hooks that rewrite requests. Use the --minimal mode or switch off those sections. github.com
It can read cookies and saved sessions
Cookie and storage tools return whatever the browser holds, such as login sessions. Do not sign in to sensitive accounts in the browser it controls. github.com
Can upload files from allowed folders
The upload tool reads files from folders listed in BROWSER_FILE_UPLOAD_ALLOWED_DIRS, which default to the repo or data folder. Keep that list narrow. github.com
HTTP mode needs a token
HTTP mode binds to 127.0.0.1 by default. The README says to set a token before exposing it beyond localhost. github.com
Security advisories
No published security advisories as of Nov 1, 2026.
Technical details
| Talks to | Any website you ask it to open |
|---|---|
| Sign-in and keys | No credentials of its own. Cookies and storage in the browser it starts can be read by the tools. |
| Scopes |
|
Questions
Is the Stealth Browser MCP server official?
No. It is a community project by vibheksoni and is not from Google, Chrome or any site it visits.
Why is the PyPI package called browserstealthmcp?
Because stealth-browser-mcp on PyPI belongs to a different, unrelated project. Installing that name gives the wrong program.
What do I need to run it?
Python 3.10 or newer, uv or pipx, and Chrome, Chromium or Edge.
Can I load fewer tools?
Yes. Add --minimal for 21 core tools, or switch off sections such as --disable-cdp-functions.
Can I make it read-only?
No. The README describes no read-only mode, and many tools click, type and change traffic.
Does it bypass Cloudflare and bot checks?
The README says it is built to handle such checks with a real browser. Results depend on the site, and you remain responsible for following each site's terms.
Does it run locally?
Yes. The browser runs on your computer. An HTTP mode also exists and listens on 127.0.0.1 by default.
Information
updated Nov 2, 2026
- Publisher
- Community
- Package
browserstealthmcp- Registry
- PyPI
- Transport
- stdio
- Auth
- None
- Version
- 0.3.3
- License
- MIT
- Last commit
- Oct 26, 2026
- Open issues
- 0
Sources
Docs, issue trackers and discussions this page is built from. Issues, quotes and findings above link to their own source.
Show all 3Hide
- server.py · github.com
- README.md · github.com
- https://pypi.org/project/browserstealthmcp/ · pypi.org