| name | drissionpage-mcp-browser-automation |
| description | Professional browser automation for Claude Code, Codex, and MCP clients powered by DrissionPage MCP Server |
| triggers | ["automate a web browser","scrape this website","fill out a form on this page","take a screenshot of this website","extract data from this webpage","navigate to a URL and click","test this web application","interact with browser elements"] |
DrissionPage MCP Browser Automation
Skill by ara.so — MCP Skills collection.
DrissionPage MCP Server brings professional browser automation to Claude Code, Codex, Cursor, and other MCP clients. It provides 52 tools for deterministic web automation through the Model Context Protocol, leveraging DrissionPage's efficient engine for structured, LLM-optimized browser control.
Installation
python -m pip install -U drissionpage-mcp
drissionpage-mcp --version
drissionpage-mcp doctor
Configuration
Codex CLI/IDE (Recommended)
Add to ~/.codex/config.toml or .codex/config.toml in your project:
[mcp_servers.drissionpage]
command = "drissionpage-mcp"
startup_timeout_sec = 20
tool_timeout_sec = 60
[mcp_servers.drissionpage.env]
Or via CLI:
codex mcp add drissionpage -- drissionpage-mcp
Claude Desktop / Cursor
Add to MCP settings JSON (e.g., ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"drissionpage": {
"command": "drissionpage-mcp"
}
}
}
For GUI-launched clients that don't inherit shell PATH:
{
"mcpServers": {
"drissionpage": {
"command": "/absolute/path/to/python",
"args": ["-m", "drissionpage_mcp.cli"]
}
}
}
Environment Variables
CHROME_PATH - Custom Chrome/Chromium executable path
DP_HEADLESS - Set to "1" for headless mode
DP_MCP_SCREENSHOT_ROOT - Directory for saved screenshots
DP_MCP_UPLOAD_ROOT - Directory for file uploads (security boundary)
LOG_LEVEL - Logging level (DEBUG, INFO, WARNING, ERROR)
Core Tool Categories
Navigation Tools
page_navigate - Navigate to URLs with optional tab control:
page_navigate(url="https://example.com")
page_navigate(url="https://github.com", new_tab=True)
page_navigate(url="https://news.ycombinator.com", observe=True)
page_go_back / page_go_forward - Browser history navigation:
page_go_back()
page_go_forward()
page_refresh - Reload current page:
page_refresh()
Element Discovery & Interaction
element_find - Find single elements (CSS or XPath):
element_find(selector="button.submit")
element_find(selector="//button[@type='submit']")
result = element_find(selector="input[name='username']")
element_find_all - Extract multiple elements:
element_find_all(
selector="article h2 a",
limit=10
)
element_click - Click elements:
element_click(selector="button#submit")
element_click(selector=".modal-close", scroll_into_view=True)
element_type - Input text:
element_type(selector="input[name='email']", text="user@example.com")
element_type(selector="#search", text="Python tutorials", clear=True)
element_upload_file - Upload files:
element_upload_file(
selector="input[type='file']",
file_path="document.pdf"
)
element_select - Handle dropdowns:
element_select(selector="select[name='country']", value="United States")
element_select(selector="select#size", index=2)
element_check - Toggle checkboxes/radios:
element_check(selector="input#agree-terms", check=True)
element_check(selector="input[name='newsletter']", check=False)
Data Extraction
element_get_text - Extract text content:
element_get_text(selector="article .content")
element_get_text()
element_get_attribute - Get HTML attributes:
element_get_attribute(selector="a.download", attribute="href")
element_get_attribute(selector="div.widget", attribute="data-id")
element_get_property - Get DOM properties:
element_get_property(selector="input#username", property="value")
element_get_property(selector="input[type='checkbox']", property="checked")
element_get_html - Get HTML content:
element_get_html(selector="div.article")
element_get_html()
Page Understanding
page_snapshot - Get structured page overview:
page_snapshot()
page_observe - Get page fingerprint:
page_observe()
form_inspect - Analyze forms:
form_inspect(selector="form#checkout")
Screenshots & Visual
page_screenshot - Capture inline screenshot:
page_screenshot(full_page=True)
page_screenshot(full_page=False)
page_screenshot_save - Save screenshot to disk:
page_screenshot_save(full_page=True)
page_screenshot_save(filename="homepage.png", full_page=True)
Tab Management
tab_list - List open tabs:
tab_list()
tab_switch - Switch to tab:
tab_switch(tab_id="tab_0")
tab_close - Close tab:
tab_close(tab_id="tab_1")
Frame & Shadow DOM
frame_list - List iframes:
frame_list()
frame_snapshot - Inspect iframe content:
frame_snapshot(selector="iframe#payment-form")
frame_find - Find element in iframe:
frame_find(
frame_selector="iframe#widget",
selector="button.submit"
)
shadow_find - Find in shadow DOM:
shadow_find(
host_selector="custom-element",
selector=".internal-button"
)
shadow_find_all - Extract from shadow DOM:
shadow_find_all(
host_selector="product-list",
selector=".item",
limit=10
)
Wait Operations
wait_for_element - Wait for element to appear:
wait_for_element(selector="div.results", timeout=10)
wait_for_url - Wait for URL change:
wait_for_url(text="confirmation", timeout=15)
wait_until - Wait for conditions:
wait_until(
selector="button.submit",
condition="clickable",
timeout=10
)
wait_time - Simple delay:
wait_time(seconds=2)
Cookies & Storage
browser_cookies_get - Read cookies:
browser_cookies_get()
browser_cookies_get(name="session_id", show_value=True)
storage_get - Read localStorage/sessionStorage:
storage_get(storage_type="local", key="user_preferences")
storage_get(storage_type="session")
storage_set - Set storage value:
storage_set(
storage_type="local",
key="theme",
value="dark"
)
storage_clear - Clear storage:
storage_clear(storage_type="local", key="cache")
storage_clear(storage_type="local")
JavaScript Execution
page_evaluate - Run JavaScript:
page_evaluate(script="return document.title")
page_evaluate(script="""
return Array.from(document.querySelectorAll('a'))
.slice(0, 10)
.map(a => ({ text: a.textContent, href: a.href }))
""")
Page Actions
page_scroll - Scroll page:
page_scroll(direction="down", amount=500)
page_scroll(y=1000)
keyboard_press - Send keyboard input:
keyboard_press(key="Enter")
keyboard_press(key="Escape")
page_click_xy - Click by coordinates:
page_click_xy(x=100, y=200)
page_resize - Resize browser window:
page_resize(width=1920, height=1080)
Debug & Diagnostics
page_console_logs - Read browser console:
page_console_logs()
page_console_logs(level="error", limit=20)
page_console_logs(cursor="msg_50", limit=10)
page_get_url - Get current URL:
page_get_url()
page_close - Close browser:
page_close()
Common Patterns
Web Scraping Pattern
page_navigate(url="https://news.ycombinator.com")
snapshot = page_snapshot()
stories = element_find_all(
selector=".storylink",
limit=30
)
for story in stories["elements"]:
title = element_get_text(selector=story["recommended_selector"])
link = element_get_attribute(
selector=story["recommended_selector"],
attribute="href"
)
Form Automation Pattern
form_info = form_inspect(selector="form#login")
element_type(selector="input[name='username']", text="user@example.com")
element_type(selector="input[name='password']", text="$SECURE_PASSWORD")
element_check(selector="input#remember-me", check=True)
element_click(selector="button[type='submit']")
wait_for_url(text="dashboard", timeout=10)
Multi-Tab Pattern
page_navigate(url="https://site1.com")
page_navigate(url="https://site2.com", new_tab=True)
page_navigate(url="https://site3.com", new_tab=True)
tabs = tab_list()
for tab in tabs["tabs"]:
tab_switch(tab_id=tab["tab_id"])
data = element_get_text(selector=".main-content")
Dynamic Content Pattern
page_navigate(url="https://spa-app.com/products")
wait_for_element(selector=".product-card", timeout=10)
wait_until(selector=".price", condition="stable", timeout=5)
products = element_find_all(selector=".product-card", limit=20)
Error Recovery Pattern
try:
element_click(selector="button.primary-submit")
except:
element_click(selector="input[type='submit']")
for attempt in range(3):
try:
wait_for_element(selector=".success-message", timeout=5)
break
except:
if attempt < 2:
wait_time(seconds=2)
page_refresh()
Screenshot Debugging Pattern
page_navigate(url="https://example.com/form")
page_screenshot_save(filename="before.png")
element_type(selector="input#name", text="Test User")
element_click(selector="button.submit")
wait_time(seconds=2)
page_screenshot_save(filename="after.png")
logs = page_console_logs(level="error")
Troubleshooting
Browser Not Starting
drissionpage-mcp doctor
which google-chrome-stable
export CHROME_PATH="/usr/bin/chromium"
Element Not Found
snapshot = page_snapshot()
element_find(selector="button.submit")
element_find(selector="//button[@type='submit']")
wait_for_element(selector="button.submit", timeout=10)
Form Submission Issues
form_info = form_inspect(selector="form")
wait_until(selector="button[type='submit']", condition="clickable")
element_type(selector="input.last-field", text="value")
keyboard_press(key="Enter")
Screenshot Path Issues
export DP_MCP_SCREENSHOT_ROOT="$HOME/screenshots"
mkdir -p "$HOME/screenshots"
page_screenshot_save(filename="test.png")
MCP Connection Issues
For Codex:
codex mcp list
codex mcp logs drissionpage
codex mcp restart dressionpage
For Claude Desktop:
tail -f ~/Library/Logs/Claude/mcp*.log
Headless Mode Issues
unset DP_HEADLESS
export DP_HEADLESS="0"
MCP Resources
DrissionPage MCP exposes resources via the MCP protocol:
drissionpage://session/summary - Current session overview
drissionpage://session/history - Navigation history
drissionpage://session/state - Browser state
drissionpage://page/current - Current page details
drissionpage://tools/catalog - Available tools reference
drissionpage://guide/model-usage - LLM usage guide
dressionpage://policy/summary - Security policies
MCP Prompts
Built-in prompts for common workflows:
drissionpage_mcp_usage_playbook - Complete usage guide
browser_navigate_and_summarize - Navigate and extract summary
browser_extract_structured_data - Structured data extraction
browser_fill_form_safely - Safe form automation
browser_debug_page_issue - Debug page problems
Best Practices
- Use
page_snapshot first - Understand page structure before element selection
- Prefer CSS selectors - More readable and LLM-friendly than XPath
- Use recommended selectors - Returned by
element_find_all and page_snapshot
- Wait appropriately - Use
wait_for_element or wait_until for dynamic content
- Handle errors gracefully - Check form requirements with
form_inspect
- Leverage
page_observe - Get quick page context without full snapshot
- Use tabs wisely - Switch between tabs with
tab_list and tab_switch
- Check console logs - Use
page_console_logs for debugging JavaScript errors
- Secure file uploads - Ensure files are under
DP_MCP_UPLOAD_ROOT
- Close resources - Use
page_close when done to free browser instances
References