← Back to directory
D

DrissionPage MCP Server

Community
Local browser automation MCP server powered by DrissionPage
Category
Browser #5 of 32
Stars
★ 484 Very popular
Transport
stdio (local process)
Runtime
Python 3.10+ · Prebuilt binary
Credentials
No credential needed
License
Other / unspecified
Last commit
Tools
69
64FMRS · C

A community-maintained local browser automation MCP server built on DrissionPage that exposes 69 typed atomic tools over stdio, covering navigation, tabs, element interaction, screenshots, frames and Shadow DOM, cookies and storage, network observation, waits, and console logs. It is structured-first with optional coordinate and deterministic natural pointer motion, and it redacts URLs, credentials, headers, cookies, network bodies, and related metadata by default. All tools load by default, there are zero prompts, and the only resource is a static optional-Skills catalog. It is beta software under Apache 2.0 and is not an upstream official project; real behavior depends on the local Chrome/Chromium and target sites, so use a dedicated browser profile and verify results.

Strongest · Documentation 15/20 Weakest · Reliability 11/20

Reliability
11/20
Security and permissions
12/20
Maintenance
12/20
Documentation
15/20
Setup experience
14/20
Why each score
Reliability 11/20
Evidence shows: the README claims 69 typed tools, zero prompts, one optional Skills catalog resource, plus a doctor command, structured error.details.hints, DIALOG_PENDING/DIALOG_NOT_FOUND recovery, token/cursor/timeout/cancellation-safe network listeners, tab-owned cleanup, typed output contracts, and Pydantic validation. The repository layout (server.py, context.py, runtime.py, tools/) and CI/coverage badges indicate unit, protocol, schema-snapshot, response-contract, and browser-integration tests with a claimed 95% coverage floor. However, these are static claims, not verifiable execution evidence: nothing was run here, no CI logs or test file contents were supplied, so reliability must stay at or below the static cap of 12. Deductions: no live handshake evidence, real behavior of 69 tools cannot be cross-checked against implementations, runtime depends on local Chrome/Chromium and target sites (self-declared beta), and the v0.8.8 release date of 2026-09-08 is a future date that weakens version evidence.
Security and permissions 12/20
Evidence shows several positive designs: credential-bearing results are redacted by default (cookies, headers, network bodies, storage values require include_values=true), HTTP auth runs in a disposable Chromium context without returning credentials, keyboard input is not echoed, no retained action history or absolute screenshot paths in public results, an opt-in local safety policy for navigation and screenshot paths, file upload/download confined to DP_MCP_UPLOAD_ROOT / DP_MCP_DOWNLOAD_ROOT / DP_MCP_SCREENSHOT_ROOT, Chrome sandbox enabled by default (DP_NO_SANDBOX=1 reserved for restricted containers), and explicit network listener and blocked-URL controls. The README also discloses that the server runs locally, may touch authenticated sessions, cookies, downloads, and page content, and can reach any site the machine can reach, with no mandatory confirmation for dangerous operations (click, upload, download, page_evaluate). Deductions: no client-side content-trust prompting, bounded JS execution on arbitrary pages, and no explicit confirmation flow for altering network requests, user agent, or permissions; the privileged surface is broad. No malware, credential theft, covert exfiltration, or default irreversible delete/deploy was found, so the 0-4 red-line band is not triggered.
Maintenance 12/20
Evidence shows: a consistent 0.8.8 version across manifest, README, and badges; CHANGELOG, CONTRIBUTING.md, SECURITY.md, codecov.yml, GitHub Actions CI, PyPI distribution, official MCP Registry metadata and a tag-gated publish workflow; the repository is not archived, has only 5 open issues, complete topics/description, and a clear owner (Wukunyun). Deductions: the GitHub license field is NOASSERTION even though the README claims Apache 2.0, a governance/metadata inconsistency; no static evidence of dependency-update cadence, issue-response latency, or a security-response SLA; the stated release date (2026-09-08) is implausible and weakens release evidence. Full marks are not justified.
Documentation 15/20
Evidence shows layered documentation: README covers installation, per-client configuration (Codex TOML, Claude Code/Desktop, Cursor JSON), absolute-Python fallback, environment variables, a categorized 69-tool inventory with parameter guidance (e.g., page_navigate(new_tab/background/new_window/new_context), page_scroll(pixels/x/y), page_dialog_respond(action), frame_snapshot, browser_permission_set(setting)), the Skills catalog with three example Skills and their stop boundaries, test/playground commands, troubleshooting, compatibility, tool contract, changelog, and roadmap, and it discloses limitations (beta, cannot read cross-origin iframe inner DOM, narrower pointer targeting, cache clear preserving cookies/storage, local Chrome/Chromium dependency). Deductions: screenshots and example outputs are not inspectable, cost/resource usage is unquantified, some parameter semantics live in unprovided linked docs (docs/tool-contract.md), and there is no field-level API reference. Hence below full marks.
Setup experience 14/20
Evidence shows a fairly clear install path: pip install -U "drissionpage-mcp>=0.8.8", then drissionpage-mcp --version / doctor / doctor --launch-browser; Codex can be configured with codex mcp add; copy-paste JSON snippets are given for Claude Code, Cursor, and Claude Desktop; GUI clients get an absolute-Python command with args fallback for PATH/venv problems; requirements (Python 3.10+, Chrome/Chromium, any MCP client) and screenshot walkthroughs are included. Deductions: users must still install Chrome/Chromium and ensure client PATH correctness, making it a multi-step manual setup; there is no automated setup script or one-click IDE install; and there is no verifiable evidence of a successful live connection, so the static cap of 15 applies.

Static review · not runListed 2026-09-18

Read the FMRS scoring method →

Fit and risk

What it can accessUses the networkControls a browser

Best for

  • Developers already using Codex CLI/IDE, Claude Code, Claude Desktop, or Cursor who want to drive a local browser
  • Automation that needs both DOM-selector work and coordinate interaction on visual surfaces
  • Teams wanting a lightweight Python 3.10+ browser automation option using local Chrome/Chromium
  • Local workflows that need no external API credentials, including authorized testing and accessibility work

Not for

  • Users expecting built-in site-specific workflows, component-library adaptation, or challenge handling (these live in the client or optional Skills)
  • Environments without Chrome/Chromium or without Python 3.10+
  • Users who need a cloud-hosted browser or remote execution environment
  • Production-critical scenarios that require official vendor support or an SLA

Required permissions

  • Local browser control: open tabs, navigate to any reachable URL, run bounded JavaScript
  • Read and write browser Cookies, localStorage, and sessionStorage
  • Read and modify request headers, user agent, HTTP cache, and browser permissions
  • File upload and download (bounded by DP_MCP_UPLOAD_ROOT and DP_MCP_DOWNLOAD_ROOT), plus screenshot and PDF/MHTML artifact writes (bounded by DP_MCP_SCREENSHOT_ROOT and DP_MCP_ARTIFACT_ROOT)
  • Access to authenticated sessions and page content in the local browser

Risks and side effects

  • The local browser may hold authenticated sessions, cookies, downloads, and page data, so mistakes can affect real accounts or production systems
  • It can open and interact with any site reachable from the local machine, risking misuse or violation of site terms
  • Coordinate-based interaction depends on the model's reading of screenshot coordinates and can click the wrong place, so observe and verify results
  • Downloads, uploads, and exported artifacts write to the local file system, so review directories and content boundaries
  • DP_NO_SANDBOX=1 disables the Chrome sandbox and should be reserved for restricted container or root environments
  • The project is in beta; real browser behavior depends on the local Chrome/Chromium and target sites

Setup

Before you start

Runtime:Python 3.10+ · Prebuilt binary

Other optional settings (7)
CHROME_PATH optional Optional; path to a custom Chrome executable, defaults to system Chrome/Chromium.
DP_HEADLESS optional Optional; set to 1 to launch the browser headless.
DP_NO_SANDBOX optional Optional; only for restricted container/root environments, Chrome sandbox stays enabled by default.
DP_MCP_DOWNLOAD_ROOT optional Root directory where element_click_and_download saves download artifacts.
DP_MCP_UPLOAD_ROOT optional Root directory from which element_upload_file may read files for upload.
DP_MCP_SCREENSHOT_ROOT optional Root directory where page_screenshot_save stores screenshots.
DP_MCP_ARTIFACT_ROOT optional Root directory where page_export_artifact stores PDF/MHTML artifacts.
  1. Install or update your client (for example Codex CLI on macOS/Linux: curl -fsSL https://chatgpt.com/codex/install.sh | sh).
  2. Install from PyPI with python -m pip install -U "drissionpage-mcp>=0.8.8".
  3. Verify the package and environment with drissionpage-mcp --version and drissionpage-mcp doctor; doctor must report mcp_supported and mcp_server_wiring as ok, and --launch-browser adds a browser startup check.
  4. Configure the client: for Codex, add [mcp_servers.drissionpage] with command = "drissionpage-mcp", startup_timeout_sec = 20, and tool_timeout_sec = 60 to ~/.codex/config.toml (or .codex/config.toml in a trusted project); for JSON clients (Claude Code, Cursor, Claude Desktop), add {"mcpServers": {"drissionpage": {"command": "drissionpage-mcp"}}} to the client's config file.
  5. Restart the client; in Codex run /mcp or codex mcp list to verify. If a GUI-launched client cannot see your shell PATH or virtualenv, use the absolute Python executable as command with args = ["-m", "drissionpage_mcp.cli"].
claude_desktop_config.json
{
  "mcpServers": {
    "drissionpage": {
      "command": "drissionpage-mcp"
    }
  }
}

Shown for Claude Desktop. Other clients may use a different file or key (VS Code uses "servers") — the configurator below converts it.

.vscode/mcp.json
{
  "servers": {
    "drissionpage": {
      "command": "drissionpage-mcp"
    }
  }
}

Goes in your project's .vscode/mcp.json (VS Code uses a "servers" key).

Terminal
claude mcp add drissionpage -- drissionpage-mcp

Run it in a terminal; replace any <…> placeholders with your own values first.

Check that it works

Run drissionpage-mcp --version to confirm the installed version, then run drissionpage-mcp doctor and confirm mcp_supported and mcp_server_wiring are both ok; after restarting the client, the tool list should show the 69 tools including page_navigate and page_screenshot.

Troubleshooting

  1. If tools do not load, run drissionpage-mcp --version and confirm output such as drissionpage-mcp 0.8.8
  2. Run drissionpage-mcp doctor and confirm mcp_supported and mcp_server_wiring are ok; version output alone does not prove the client can initialize the server
  3. Browser issues: check installation with which google-chrome (Linux) or which chromium (macOS); use CHROME_PATH to point at a custom browser and DP_HEADLESS=1 for headless runs
  4. If Codex cannot find the server, run codex mcp list or /mcp in the TUI; for JSON clients verify the config path and JSON syntax and restart the client
  5. If a GUI-launched client cannot see your shell PATH or virtualenv, use the absolute Python executable and args ["-m", "drissionpage_mcp.cli"]
  6. For debug logs use drissionpage-mcp --log-level DEBUG and consult docs/troubleshooting.md
  7. Validate a checkout with python -m pytest tests/ or DP_HEADLESS=1 python playground/run_mcp_lab.py --all --json

Things to try

Once connected, you can ask your AI assistant things like:

  • Visit https://example.com and take a screenshot for me
  • Go to Wikipedia, search for Python, and get the first paragraph
  • Fill out the form at https://httpbin.org/forms/post and submit it
  • Get the top 10 news headlines from news.ycombinator.com

Tools 69

page_navigate writes
Navigate to any URL; target an existing tab_id, or combine new_tab=true with optional background, new_window, or new_context; observe returns a change summary
page_navigate_with_http_auth writes
Navigate through a scoped HTTP auth challenge in a dedicated disposable Chromium context without returning credentials
page_go_back writes
Navigate backward in browser history
page_go_forward writes
Navigate forward in browser history
page_refresh writes
Reload the current page
tab_list read-only
List open browser tabs with stable MCP tab IDs
tab_switch writes
Switch to a tab returned by tab_list
tab_close destructive
Reject new work, drain in-flight actions, then close one tab without closing the whole browser
Show 61 more tools
element_find read-only
Find one element by CSS selector or XPath; bare selectors like h1 are treated as CSS
element_find_all read-only
Extract bounded repeated elements with text, attributes, and recommended selectors
element_click writes
Click any element with additive left/right/middle and single/double-click semantics
element_click_and_download writes
Correlate one selector, coordinate, or keyboard trigger with one integrity-checked artifact under DP_MCP_DOWNLOAD_ROOT
element_type writes
Input text into elements
element_upload_file writes
Use element_upload_file(paths=[...]) to upload files from DP_MCP_UPLOAD_ROOT to input[type=file]
element_click_and_upload writes
Arm Chromium's file chooser, click its trigger, inject approved files, and clean interception without an operating-system picker
element_scroll_into_view writes
Bring an element into the viewport before acting
element_hover writes
Hover an element to trigger menu or tooltip states
element_select writes
Select an option by value, text, or index
element_check writes
Check or uncheck checkbox/radio controls
element_get_text read-only
Get element or page text
element_get_attribute read-only
Get an HTML attribute
element_get_property read-only
Get a live DOM property such as an input value
element_get_html read-only
Get element or page HTML
element_state_get read-only
Read live DrissionPage state flags and document/viewport geometry for one element
page_screenshot read-only
Capture an inline full-page or viewport screenshot
page_screenshot_save writes
Save a screenshot under DP_MCP_SCREENSHOT_ROOT
page_export_artifact writes
Generate a managed PDF or MHTML artifact under DP_MCP_ARTIFACT_ROOT with SHA-256 and receipt evidence
page_snapshot read-only
Return a bounded page outline with headings, links, buttons, inputs, forms, and selector recommendations
page_accessibility_snapshot read-only
Return a bounded Chromium accessibility tree for the page or a scoped element, with field values redacted unless explicitly requested
page_observe read-only
Return a compact page fingerprint with URL, title, counts, visible text samples, active element, and recent console summary
page_evaluate writes
Run bounded JavaScript in the current page and return a JSON-safe result
page_scroll writes
Use page_scroll(pixels=...) for relative scrolling, or pass x/y for an absolute position
keyboard_press writes
Send keys to the active element or page without echoing the input in results
page_resize writes
Adjust the browser window
page_pointer_move writes
Move to exact viewport CSS coordinates with direct or bounded deterministic natural motion
page_pointer_drag writes
Perform one failure-safe coordinate drag through up to six optional ordered waypoints with the selected profile
page_pointer_drag_element writes
Resolve source and destination geometry immediately before dragging; supports CSS/XPath in the top document or one same-origin iframe, plus CSS paths through nested open Shadow DOM hosts
page_click_xy writes
Move with direct or natural motion, optionally wait for an explicit delay, then press and release at the exact target
page_close destructive
Close the browser
page_get_url read-only
Get the current URL
page_dialog_observe read-only
Wait for and inspect a pending native alert, confirm, or prompt without handling it
page_dialog_respond writes
Use page_dialog_respond(action="accept") (or "dismiss") for one pending alert, confirm, or prompt
frame_list read-only
List iframe/frame contexts without changing global frame state
frame_snapshot read-only
Use frame_snapshot(frame_selector="...") or frame_index to inspect one iframe with bounded outline data
frame_find read-only
Find an element inside a selected iframe
shadow_find read-only
Find one element inside a shadow root exposed by the current supported DrissionPage runtime, including tested closed roots
shadow_find_all read-only
Extract repeated elements from a DrissionPage-exposed shadow root
browser_headers_set writes
Replace extra request headers and return names with redacted values; an empty object clears them
browser_user_agent_set writes
Override the user agent and optional platform, returning both the accepted and previous user agents
browser_cache_clear destructive
Clear HTTP cache while preserving Cookies, localStorage, and sessionStorage
browser_permission_get read-only
Query one browser permission for the current document origin without opening an OS prompt
browser_permission_set writes
Use browser_permission_set(setting="granted") (or "denied"/"prompt") for an exact origin or the current Chromium context
browser_permissions_reset writes
Reset permission overrides for the current Chromium context
browser_cookies_get read-only
Read normalized cookies with values redacted by default
browser_cookies_set writes
Set up to 100 cookies in one call and return accepted metadata with redacted values
browser_cookies_delete destructive
Delete one named cookie with optional URL/domain/path scope
browser_cookies_clear destructive
Clear all browser cookies
storage_get read-only
Read localStorage/sessionStorage by key or as a map, with values redacted unless include_values=true
storage_set writes
Set one localStorage/sessionStorage item without echoing the value
storage_clear destructive
Clear one storage key or an entire storage area
page_console_logs read-only
Read bounded browser console messages with level filtering, cursor pagination, and limits
wait_for_element read-only
Wait for an element to appear (with timeout)
wait_for_url read-only
Use wait_for_url(url_pattern="...") until the current URL contains the supplied text
wait_until read-only
Use wait_until(condition="text_contains", value="...") or another documented condition/value pair
wait_time read-only
Delay execution
network_listen_start writes
Start bounded HTTP/XHR/Fetch observation through DrissionPage
network_listen_wait read-only
Wait for bounded packet metadata with optional redacted headers or body excerpts
network_listen_stop writes
Stop observation and optionally clear queued packets
network_blocked_urls_set writes
Use network_blocked_urls_set(urls=[...]) to replace blocked URL patterns; an empty list clears them

Use cases

Automated testing of web applications
Scraping structured data from websites
Filling out and submitting forms
Monitoring pages for updates or changes
Capturing and verifying page state with screenshots
Analyzing web content programmatically
Coordinate interaction with canvas, map, chart, and other visual-only surfaces

Supported clients

Claude Desktop
Claude Code
Cursor
Codex CLI/IDE
VS CodePartial support

Listed from the project's documentation, not tested by this site.

Overview

DrissionPage MCP Server is a local Model Context Protocol server that exposes DrissionPage's browser automation capabilities as 69 typed, atomic tools to Codex CLI/IDE, Claude Code, Claude Desktop, Cursor, and other MCP clients. It runs over stdio, installs from the PyPI package drissionpage-mcp, and requires Python 3.10+ plus a local Chrome or Chromium. The design is structured-first and vision-ready: use DOM structure when reliable selectors exist, and coordinates with either direct or bounded deterministic natural pointer motion for canvas, map, chart, and other visual-only surfaces. The server executes exactly the requested browser operation; site flows, component-library adaptation, challenge handling, and business policy belong to the client or optional Skills. It exposes zero MCP prompts and one static optional-Skills catalog resource. The project is in beta, licensed under Apache 2.0, and maintained by a community author rather than the upstream product owner.

Similar servers

Source revision 140756ac4e70 Data synced 2026-11-02 Read the FMRS scoring method