Browser automation MCP (Model Context Protocol) server powered by agent-browser.
This MCP server provides comprehensive browser automation capabilities through the MCP protocol, enabling AI agents to interact with web pages programmatically.
- Navigation: Navigate to URLs, go back/forward, reload pages
- Element Interaction: Click, fill, type, hover, drag & drop, upload files
- Semantic Locators: Find elements by role, text, label, placeholder, alt text, title, test ID
- Snapshot: Get accessibility tree with element refs for deterministic interaction
- Screenshots: Capture full page or element screenshots
- Forms: Check/uncheck checkboxes, select dropdowns, manage inputs
- JavaScript Execution: Run custom JavaScript in the page context
- Cookies & Storage: Manage cookies, localStorage, sessionStorage
- Network Control: Intercept requests, mock responses, track network activity
- Tabs & Windows: Manage multiple tabs and windows
- Frames: Switch between iframes
- Browser Settings: Set viewport, emulate devices, geolocation, media features
- Debug: Trace, console logs, page errors
- Recording: Screen recording and screencast streaming
- PDF Export: Save pages as PDF
npm install agent-browser-mcpOr build from source:
git clone https://github.com/xiahanhan/agent-browser-mcp.git
cd agent-browser-mcp
npm install
npm run buildnpx playwright install chromiumOn Linux, you may also need system dependencies:
npx playwright install-deps chromiumAdd to your MCP client configuration (e.g., Claude Desktop config at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"agent-browser": {
"type": "stdio",
"command": "npx",
"args": ["-y", "github:quantmew/agent-browser-mcp"]
}
}
}This method automatically downloads and runs the latest version from GitHub without manual installation.
{
"mcpServers": {
"browser": {
"command": "node",
"args": ["/path/to/agent-browser-mcp/dist/index.js"]
}
}
}# Use a custom browser executable (e.g., for serverless)
export AGENT_BROWSER_EXECUTABLE_PATH="/path/to/chromium"
# Run in headed mode (show browser window)
export AGENT_BROWSER_HEADED="1"-
Navigate to a page
browser_navigate({ url: "https://example.com" })
-
Get a snapshot (accessibility tree with element refs)
browser_snapshot() // Returns: // - heading "Example Domain" [ref=e1] [level=1] // - link "More information..." [ref=e2]
-
Interact with elements using refs
browser_click({ selector: "@e2" }) browser_fill({ selector: "@e3", value: "test@example.com" })
// Navigate to login page
browser_navigate({ url: "https://example.com/login" })
// Get interactive elements
browser_snapshot({ interactiveOnly: true })
// Fill login form
browser_fill({ selector: "@e1", value: "user@example.com" })
browser_fill({ selector: "@e2", value: "password" })
// Click submit button
browser_click({ selector: "@e3" })
// Wait for navigation
browser_wait_for_url({ url: "**/dashboard" })
// Take screenshot
browser_screenshot({ path: "dashboard.png" })
// Close browser
browser_close()// Find by ARIA role
browser_find_by_role({
role: "button",
name: "Submit",
action: "click"
})
// Find by text
browser_find_by_text({
text: "Sign In",
action: "click"
})
// Find by label
browser_find_by_label({
label: "Email",
action: "fill",
value: "test@example.com"
})// Fill inputs
browser_fill({ selector: "#name", value: "John Doe" })
browser_select({ selector: "#country", values: "USA" })
// Check checkbox
browser_check({ selector: "#agree" })
// Upload file
browser_upload({ selector: "#file", files: "/path/to/file.pdf" })
// Submit form
browser_click({ selector: "button[type='submit']" })// Execute custom JavaScript
browser_evaluate({
script: "document.title"
})
// With arguments
browser_evaluate({
script: "(a, b) => a + b",
args: [1, 2]
})
// Wait for condition
browser_wait_for_function({
expression: "window.ready === true"
})// Mock API response
browser_network_route({
url: "**/api/**",
response: {
status: 200,
body: '{"success": true}',
contentType: "application/json"
}
})
// Block requests
browser_network_route({
url: "**/analytics/**",
abort: true
})
// View network requests
browser_network_requests({ filter: "api" })
// Remove routes
browser_network_unroute({ url: "**/api/**" })// Get all cookies
browser_cookies_get()
// Set cookies
browser_cookies_set({
cookies: [{
name: "session",
value: "abc123",
domain: "example.com"
}]
})
// Get localStorage
browser_storage_get({ type: "local" })
// Set localStorage
browser_storage_set({
type: "local",
key: "user",
value: '{"id": 123}'
})
// Clear storage
browser_storage_clear({ type: "local" })// Set viewport size
browser_set_viewport({ width: 1920, height: 1080 })
// Emulate device
browser_set_device({ device: "iPhone 14" })
// Set geolocation
browser_set_geolocation({
latitude: 37.7749,
longitude: -122.4194
})
// Emulate dark mode
browser_emulate_media({ colorScheme: "dark" })
// Set timezone
browser_set_timezone({ timezone: "America/New_York" })// Open new tab
browser_tab_new({ url: "https://example.com" })
// List tabs
browser_tab_list()
// Switch to tab
browser_tab_switch({ index: 1 })
// Close current tab
browser_tab_close()
// Open new window
browser_window_new({
viewport: { width: 800, height: 600 }
})browser_navigate- Navigate to URLbrowser_snapshot- Get accessibility treebrowser_screenshot- Take screenshotbrowser_back- Go backbrowser_forward- Go forwardbrowser_reload- Reload pagebrowser_url- Get current URLbrowser_title- Get page title
browser_click- Click elementbrowser_dblclick- Double-click elementbrowser_fill- Clear and fill inputbrowser_type- Type textbrowser_press- Press keybrowser_hover- Hover over elementbrowser_focus- Focus elementbrowser_select- Select dropdown optionbrowser_check- Check checkboxbrowser_uncheck- Uncheck checkboxbrowser_tap- Tap element (touch)browser_clear- Clear inputbrowser_scroll- Scroll page/elementbrowser_drag- Drag and dropbrowser_upload- Upload file
browser_get_text- Get text contentbrowser_get_inner_text- Get inner textbrowser_get_inner_html- Get inner HTMLbrowser_get_attribute- Get attribute valuebrowser_get_value- Get input valuebrowser_is_visible- Check if visiblebrowser_is_enabled- Check if enabledbrowser_is_checked- Check if checkedbrowser_count- Count matching elementsbrowser_bounding_box- Get bounding boxbrowser_highlight- Highlight elementbrowser_styles- Get computed styles
browser_find_by_role- Find by ARIA rolebrowser_find_by_text- Find by textbrowser_find_by_label- Find by labelbrowser_find_by_placeholder- Find by placeholderbrowser_find_by_alt_text- Find by alt textbrowser_find_by_title- Find by title attributebrowser_find_by_test_id- Find by test IDbrowser_find_nth- Find Nth matching element
browser_wait- Wait for element or timebrowser_wait_for_url- Wait for URLbrowser_wait_for_load_state- Wait for load statebrowser_wait_for_function- Wait for JS condition
browser_evaluate- Execute JavaScript
browser_get_content- Get page HTMLbrowser_set_content- Set page HTML
browser_pdf- Save as PDF
browser_tab_list- List tabsbrowser_tab_new- Open new tabbrowser_tab_switch- Switch to tabbrowser_tab_close- Close tabbrowser_window_new- Open new window
browser_frame- Switch to iframebrowser_main_frame- Switch to main frame
browser_cookies_get- Get cookiesbrowser_cookies_set- Set cookiesbrowser_storage_get- Get storagebrowser_storage_set- Set storagebrowser_storage_clear- Clear storage
browser_set_viewport- Set viewport sizebrowser_set_device- Emulate devicebrowser_set_geolocation- Set geolocationbrowser_set_offline- Set offline modebrowser_emulate_media- Emulate media featuresbrowser_set_timezone- Set timezonebrowser_set_locale- Set localebrowser_set_headers- Set HTTP headersbrowser_set_credentials- Set HTTP credentials
browser_network_route- Intercept requestsbrowser_network_unroute- Remove routesbrowser_network_requests- Get requestsbrowser_wait_for_download- Wait for downloadbrowser_download- Trigger downloadbrowser_response_body- Get response body
browser_dialog_accept- Accept dialogbrowser_dialog_dismiss- Dismiss dialog
browser_console- Get console messagesbrowser_errors- Get page errorsbrowser_trace_start- Start tracebrowser_trace_stop- Stop trace
browser_keyboard- Keyboard shortcutbrowser_key_down- Hold keybrowser_key_up- Release keybrowser_mouse_move- Move mousebrowser_mouse_down- Press mouse buttonbrowser_mouse_up- Release mouse buttonbrowser_wheel- Mouse wheel
browser_select_all- Select all textbrowser_set_value- Set input valuebrowser_multiselect- Multi-select dropdownbrowser_dispatch_event- Dispatch eventbrowser_add_script- Add script tagbrowser_add_style- Add style tagbrowser_add_init_script- Add init scriptbrowser_bring_to_front- Bring to front
browser_screencast_start- Start screencastbrowser_screencast_stop- Stop screencastbrowser_recording_start- Start recordingbrowser_recording_stop- Stop recordingbrowser_recording_restart- Restart recordingbrowser_state_save- Save statebrowser_state_load- Load statebrowser_har_start- Start HARbrowser_har_stop- Stop HARbrowser_clipboard- Clipboard operations
browser_close- Close browser
# Install dependencies
npm install
# Build
npm run build
# Development mode
npm run dev
# Type check
npm run typecheck
# Format code
npm run formatThis MCP server wraps the agent-browser library, which provides:
- Playwright browser automation
- Snapshot generation with accessibility tree and element refs
- Semantic locators (role, text, label, placeholder, etc.)
- Session management
- Network interception
- Multi-tab/window support
Apache-2.0
Based on agent-browser by Vercel Labs.