MCP Server for AI-assisted web development via Selenium WebDriver
console applicationapt install python3-mcp-server-webdriverProvides an MCP (Model Context Protocol) server that gives AI agents direct access to browser DevTools information — JavaScript errors, console output, failed network resources (CSS, JS, fonts, images) and layout screenshots — eliminating the need to manually copy-paste from the browser DevTools panel.
Uses the W3C WebDriver BiDi protocol via Firefox and geckodriver.
MCP Server that lets AI agents control a real web browser via Selenium WebDriver (Firefox + geckodriver).
Built with FastMCP.
The server eliminates the copy-paste loop between the browser and the AI assistant. Instead of opening DevTools, copying errors, pasting them into a chat, and repeating, the assistant opens the browser itself, navigates, captures errors and screenshots, and diagnoses the problem directly.
You: "Why is the checkout button broken on /cart?"
AI: browser_open → browser_navigate("/cart")
→ devtools_report # JS errors? network failures?
→ browser_screenshot # what does it look like?
→ devtools_computed_css("button#checkout") # hidden? wrong z-index?
→ "The button has pointer-events: none — overridden by .disabled class
applied when cart.js fails to load (404 on /static/cart.js)."
| Dependency | Version |
|---|---|
| Python | ≥ 3.11 |
| FastMCP | ≥ 2.10 |
| selenium | ≥ 4.0 |
| Firefox | any recent |
| geckodriver | ≥ 0.34 |
sudo curl -fsSL http://repo.vitexsoftware.com/KEY.gpg -o /usr/share/keyrings/vitexsoftware-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/vitexsoftware-archive-keyring.gpg] http://repo.vitexsoftware.com trixie main" \
| sudo tee /etc/apt/sources.list.d/vitexsoftware.list
sudo apt update
sudo apt install python3-mcp-server-webdriver
This installs gecko-driver, python3-selenium, python3-fastmcp, and
mcp-server-webdriver in a single step.
# Debian/Ubuntu (official repos — may be older geckodriver):
sudo apt install firefox-geckodriver
# macOS:
brew install geckodriver
# Rust / cargo (build from source):
cargo install geckodriver
Then install Python dependencies:
pip install fastmcp selenium
pip install fastmcp selenium webdriver-manager
# geckodriver is downloaded automatically on first browser_open call
mcp-server-webdriver [OPTIONS]
OPTIONS
-P <profile> Start Firefox with a named profile
--profile <path> Start Firefox with a profile directory at <path>
-h, --help Show help and exit
The server speaks MCP over stdin/stdout and is launched automatically by the MCP client — not by hand.
Ask: "Why does /dashboard show a blank screen?"
The assistant will:
browser_open — open Firefox headlesslybrowser_navigate — go to /dashboarddevtools_report — get JS errors, console output, and failed network resources in one callbrowser_screenshot — see what the page actually looks likedevtools_report is the primary diagnostic tool — equivalent to opening the Console
and Network tabs in DevTools and reading them simultaneously.
Ask: "The sidebar overlaps the content area on mobile. Why?"
browser_open — open the pagebrowser_screenshot — capture the broken layoutdevtools_computed_css(".sidebar") — check position, width, z-index, overflowdevtools_css_variables("--") — verify design tokens loaded correctlydevtools_network_failed — check whether any stylesheet failed to loadAsk: "Log into the app at /login with user=admin, password=secret and screenshot the dashboard."
browser_open — start the browserbrowser_navigate — go to /loginbrowser_fill("#username", "admin") — type usernamebrowser_fill("#password", "secret") — type passwordbrowser_press_key("enter") — submit the formbrowser_wait("#dashboard", condition="visible") — wait for redirectbrowser_screenshot — capture the resultAsk: "Check the admin panel using my existing session token."
browser_open — start the browserbrowser_navigate — go to the app's root so the cookie domain matchesbrowser_set_cookie("session", "<token>") — inject the auth cookiebrowser_navigate — now navigate to the protected pagebrowser_screenshot — confirm accessAsk: "List all the navigation links on the homepage."
browser_open + browser_navigate — open the pagebrowser_find_elements("nav a") — get all links with their text, href, and visibilityAsk: "Click the third item in the Products dropdown."
browser_hover(".nav-products") — trigger the :hover state that reveals the dropdownbrowser_wait(".dropdown-menu", condition="visible") — wait for animationbrowser_find_elements(".dropdown-menu a") — list the itemsbrowser_click(".dropdown-menu a:nth-child(3)") — click the right oneAsk: "Fill out the registration form and submit it."
browser_fill("#first-name", "Alice")browser_fill("#last-name", "Smith")browser_fill("#email", "alice@example.com")browser_select("#country", "Czech Republic")browser_press_key("tab") — move focus to next fieldbrowser_click("button[type=submit"]")browser_wait(".success-message", condition="visible")devtools_report — check for any JS errors or failed API calls during submissionAsk: "Click the Delete button and confirm the dialog."
browser_click("#delete-btn")browser_accept_dialog — click OK on the confirm("Are you sure?")browser_wait(".deleted-notice", condition="present")Ask: "Screenshot the footer of the page."
browser_open + browser_navigatebrowser_scroll("footer") — scroll the footer element into viewbrowser_screenshot("footer") — capture just the footer elementOr scroll by offset to trigger lazy-loaded content:
browser_scroll(by=True, y=1000) — scroll down 1000 pxbrowser_wait(".lazy-section", condition="visible") — wait for lazy contentbrowser_screenshot — capture the now-loaded contentConfigure the server with a named profile that already has your session:
{
"mcpServers": {
"webdriver": {
"command": "mcp-server-webdriver",
"args": ["-P", "work"]
}
}
}
The browser starts with your existing cookies, saved passwords, and extensions. Ask: "Check my GitHub notifications." — no login step needed.
Ask: "Which resources on /shop are slowest to load?"
browser_open + browser_navigate("/shop")devtools_network_all(slow_ms=500, limit=20) — requests over 500 ms, capped at 20 entries| Tool | Description |
|---|---|
browser_open |
Open Firefox (URL optional, default about:blank); accepts width, height, user_agent for mobile emulation |
browser_close |
Quit the browser session |
browser_status |
Session state, geckodriver version, BiDi status, current viewport size, buffer counts |
browser_set_viewport |
Resize the viewport mid-session (e.g. 390×844 for iPhone 14) |
| Tool | Description |
|---|---|
browser_navigate |
Navigate to a URL (bare hostnames get https://) |
browser_back |
Go back in history |
browser_forward |
Go forward in history |
browser_refresh |
Reload the current page |
| Tool | Description |
|---|---|
browser_screenshot |
Full-page or element PNG screenshot |
browser_get_title |
Current page <title> |
browser_get_url |
Current URL |
browser_get_source |
Raw HTML source |
browser_get_text |
Visible text (whole page or CSS selector) |
browser_get_attribute |
Value of an HTML attribute on an element |
browser_find_elements |
List all elements matching a CSS selector |
| Tool | Description |
|---|---|
browser_click |
Click element (CSS selector) |
browser_fill |
Type text into an input field (clears first by default) |
browser_select |
Select <option> in a <select> dropdown |
browser_execute_js |
Run JavaScript — returns JSON |
browser_wait |
Wait: visible / clickable / present / text:<str> |
browser_scroll |
Scroll to coords, by offset, or element into view |
browser_press_key |
Send enter / tab / escape / arrow / F-keys |
browser_hover |
Hover mouse over element (:hover states, tooltips, dropdowns) |
browser_switch_frame |
Switch into <iframe> or back to main document |
| Tool | Description |
|---|---|
browser_accept_dialog |
Accept a JS alert() / confirm() / prompt() |
browser_dismiss_dialog |
Dismiss a JS confirm() / prompt() |
browser_get_cookies |
Read all cookies for the current page |
browser_set_cookie |
Inject a cookie (auth tokens, session IDs) |
| Tool | Description |
|---|---|
devtools_report |
Main diagnostic tool — JS errors + console + failed/slow network |
devtools_js_errors |
JavaScript exceptions only |
devtools_console |
Console output (log / warn / error / info / debug) |
devtools_network_failed |
Failed resources (4xx, 5xx, DNS errors) |
devtools_network_all |
All network requests (supports limit= and filters) |
devtools_clear |
Clear buffered DevTools data (use before navigating) |
devtools_enable_bidi |
Attach BiDi listeners to a running session |
devtools_computed_css |
Computed CSS properties of an element |
devtools_element_info |
Bounding box, visibility, attributes, aria, outerHTML |
devtools_css_variables |
CSS custom properties (--var) in scope |
| Variable | Default | Description |
|---|---|---|
GECKODRIVER_PATH |
(unset) | Absolute path to geckodriver binary (highest priority) |
GECKODRIVER_AUTO_INSTALL |
true |
Set to false to disable webdriver-manager fallback |
FIREFOX_BINARY |
(unset) | Path to a custom Firefox executable |
FIREFOX_PROFILE |
(unset) | Named Firefox profile — same as -P |
FIREFOX_PROFILE_DIR |
(unset) | Profile directory path — same as --profile |
| # | Source | Configure via |
|---|---|---|
| 1 | GECKODRIVER_PATH env variable |
Absolute path to the binary |
| 2 | System PATH (default) | apt install gecko-driver from repo.vitexsoftware.com |
| 3 | webdriver-manager auto-download | Fallback; disable with GECKODRIVER_AUTO_INSTALL=false |
Minimal config:
{
"mcpServers": {
"webdriver": {
"command": "mcp-server-webdriver"
}
}
}
With a named Firefox profile (stays logged in, uses saved passwords):
{
"mcpServers": {
"webdriver": {
"command": "mcp-server-webdriver",
"args": ["-P", "work"]
}
}
}
With a profile directory and explicit geckodriver path:
{
"mcpServers": {
"webdriver": {
"command": "mcp-server-webdriver",
"args": ["--profile", "/home/user/.mozilla/firefox/abc123.dev"],
"env": {
"GECKODRIVER_PATH": "/usr/bin/geckodriver"
}
}
}
}
# Unit tests only (no browser required):
pytest tests/ -m "not integration"
# All tests including browser integration:
pytest tests/
| Server | Description |
|---|---|
| abraflexi-mcp-server | AbraFlexi accounting/ERP integration — invoices, contacts, products, bank transactions |
| mastodon-mcp-server | Mastodon integration — timelines, posting, account management, search |
| semaphore-mcp-server | Semaphore UI integration — manage Ansible, Terraform and other automation workflows |
MIT
This package may not be indexed in our database yet. Please try again later or check the package repository directly.