mcp-chrome-server
Provides browser automation capabilities for Google Chrome, including navigation, element manipulation, login automation (with CAPTCHA and 2FA handling), and credential management via system keychain.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-chrome-server log in to my GitHub account"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Chrome Server
A Chrome server based on MCP (Model-Controller-Prompt) for browser automation.
Installation
Prerequisites
Python 3.12
Google Chrome browser installed
uv (Python package installer) or Docker
Installing via Smithery
npx -y @smithery/cli install @dlwjdtn535/mcp-chrome-server --client claudeConfiguration Setup
Choose one of the following setup methods based on your environment:
1. Using uv (Recommended)
Windows Setup:
{
"mcpServers": {
"mcp-chrome-server": {
"command": "uv",
"args": [
"run",
"--directory",
"%LOCALAPPDATA%\\Programs\\mcp-chrome-server\\src",
"mcp-chrome-server"
],
"env": {
"CHROME_PROFILE_PATH": "%LOCALAPPDATA%\\Google\\Chrome\\User Data"
}
}
}
}macOS Setup:
{
"mcpServers": {
"mcp-chrome-server": {
"command": "uv",
"args": [
"run",
"--directory",
"/usr/local/bin/mcp-chrome-server/src",
"mcp-chrome-server"
],
"env": {
"CHROME_PROFILE_PATH": "$HOME/Library/Application Support/Google/Chrome"
}
}
}
}Linux Setup:
{
"mcpServers": {
"mcp-chrome-server": {
"command": "uv",
"args": [
"run",
"--directory",
"/usr/local/bin/mcp-chrome-server/src",
"mcp-chrome-server"
],
"env": {
"CHROME_PROFILE_PATH": "$HOME/.config/google-chrome"
}
}
}
}Related MCP server: Real Browser MCP
Configuration
Chrome Profile Paths
Default Chrome profile paths for each operating system:
OS | Path |
Windows |
|
macOS |
|
Linux |
|
Important Notes
Close all running Chrome instances before starting the automation server
Ensure proper permissions for the Chrome profile directory
For Docker setup, make sure the volume mount path matches your system's Chrome profile path
Credential Management
Securely store and manage login information using the system keychain:
# Save credentials
result = tool_save_credentials(
site="example.com",
username="your_username",
password="your_password"
)
# Retrieve saved credentials
result = tool_get_credentials(
site="example.com",
username="your_username"
)Key Features
Browser Control
# Open browser
result = tool_open_browser()
# Navigate to URL
result = tool_navigate(url="https://example.com")
# Close browser
result = tool_close_browser()Web Login
result = tool_web_login(
url="https://example.com/login",
credentials={
"username": "your_username",
"password": "your_password"
},
selectors={
"username": "#id",
"password": "#pw",
"submit": ".login-button"
}
)Special handling:
Waits for user to solve CAPTCHA when detected
Automatic detection of 2-factor authentication
Detailed analysis of login failure scenarios
Element Manipulation
# Click element
result = tool_click(selector=".button")
# Type text
result = tool_type(
selector="#input-field",
text="Hello, World!"
)
# Get text
result = tool_get_text(selector=".content")
# Get multiple elements
result = tool_get_elements(selector=".items")Important Considerations
Chrome Profile Usage
Verify correct profile path configuration
Close all other Chrome windows using the profile
Automation Detection Prevention
Simulation of natural user behavior
Maintain appropriate delays between login attempts
Security
Always use system keychain for important credentials
Never expose credentials directly in environment variables or configuration files
Available Tools
36 toolstool_add_cookieD
Add a cookie.
Inputs: cookie (required).
tool_backA
Navigate back in the browser history.
Inputs: no named parameters.
tool_clickA
Click an element on the page.
This tool finds and clicks an element on the page using either CSS selector
or XPath. It will wait for the element to be clickable before attempting
to click it.
Args:
selector (str): The selector to find the element
by (str, optional): The selector type. Either "css" or "xpath". Defaults to "css"
Returns:
Dict[str, Any]: A dictionary containing:
- success (bool): Whether the operation was successful
- message (str): Status message
Example:
{"tool": "click", "args": {"selector": "#submit-button"}}
{"tool": "click", "args": {"selector": "//button[@type='submit']", "by": "xpath"}}
Inputs: selector (required), by.
tool_close_browserA
Close the browser instance.
This tool closes the current Chrome browser window and cleans up resources.
It's safe to call this even if no browser is open.
Returns:
Dict[str, Any]: A dictionary containing:
- success (bool): Whether the operation was successful
- message (str): Status message
Example:
{"tool": "close_browser"}
Inputs: no named parameters.
tool_delete_all_cookiesA
Delete all cookies.
Inputs: no named parameters.
tool_delete_cookieC
Delete a specific cookie.
Inputs: name (required).
tool_execute_scriptC
Execute JavaScript code.
Inputs: script (required), args (required).
tool_forwardB
Navigate forward in the browser history.
Inputs: no named parameters.
tool_fullscreen_windowB
Switch the browser window to full screen.
Inputs: no named parameters.
tool_get_cookiesA
Return all cookies from the current page.
Inputs: no named parameters.
tool_get_credentialsC
Retrieve stored credentials from system keychain
Args:
site: Website domain
username: User's username
Inputs: site (required), username (required).
tool_get_current_urlA
Return the current page's URL.
Inputs: no named parameters.
tool_get_elementsA
Get multiple elements matching a selector.
This tool finds all elements matching the selector and returns their text
content and HTML.
Args:
selector (str): The selector to find the elements
by (str, optional): The selector type. Either "css" or "xpath". Defaults to "css"
Returns:
Dict[str, Any]: A dictionary containing:
- success (bool): Whether the operation was successful
- message (str): Status message
- data (List[Dict]): List of elements, each containing:
- text (str): The text content of the element
- html (str): The outer HTML of the element
Example:
{"tool": "get_elements", "args": {"selector": ".item"}}
{"tool": "get_elements", "args": {"selector": "//li[@class='item']", "by": "xpath"}}
Inputs: selector (required), by.
tool_get_logC
Retrieve browser logs.
Inputs: log_type (required).
tool_get_page_sourceA
Return the current page's HTML source.
Inputs: no named parameters.
tool_get_textA
Get text from an element.
This tool finds an element and returns its text content.
Args:
selector (str): The selector to find the element
by (str, optional): The selector type. Either "css" or "xpath". Defaults to "css"
Returns:
Dict[str, Any]: A dictionary containing:
- success (bool): Whether the operation was successful
- message (str): Status message
- data (str): The text content of the element
Example:
{"tool": "get_text", "args": {"selector": "h1"}}
{"tool": "get_text", "args": {"selector": "//div[@class='content']", "by": "xpath"}}
Inputs: selector (required), by.
tool_get_titleA
Return the current page's title.
Inputs: no named parameters.
tool_get_window_handlesB
Return all window handles.
Inputs: no named parameters.
tool_get_window_sizeA
Return the current browser window size.
Inputs: no named parameters.
tool_implicitly_waitC
Set implicitly wait time.
Inputs: seconds (required).
tool_maximize_windowB
Maximize the browser window.
Inputs: no named parameters.
tool_minimize_windowB
Minimize the browser window.
Inputs: no named parameters.
tool_open_browserA
Open a new Chrome browser instance.
This tool initializes a new Chrome browser window. If a browser instance
already exists, it will reuse that instance.
Returns:
Dict[str, Any]: A dictionary containing:
- success (bool): Whether the operation was successful
- message (str): Status message
Example:
{"tool": "open_browser"}
Inputs: no named parameters.
tool_refreshB
Refresh the current page.
Inputs: no named parameters.
tool_sampleC
Set Sample execution timeout.
Inputs: seconds (required).
tool_save_credentialsC
Securely save credentials
Args:
site: Website domain
username: User's username
password: Password
Inputs: site (required), username (required), password (required).
tool_set_page_load_timeoutC
Set page load timeout.
Inputs: seconds (required).
tool_set_script_timeoutC
Set script execution timeout.
Inputs: seconds (required).
tool_set_window_sizeC
Set the browser window size.
Inputs: width (required), height (required).
tool_switch_to_default_contentD
Switch back to default content.
Inputs: no named parameters.
tool_switch_to_frameC
Switch to a specific frame.
Inputs: frame_reference (required).
tool_switch_to_windowC
Switch to a specific window.
Inputs: window_handle (required).
tool_take_screenshotC
Save a screenshot of the current page.
Inputs: filename.
tool_typeA
Type text into an element.
This tool finds an input element and types the specified text into it.
It will clear any existing text in the element before typing.
Args:
selector (str): The selector to find the element
text (str): The text to type into the element
by (str, optional): The selector type. Either "css" or "xpath". Defaults to "css"
Returns:
Dict[str, Any]: A dictionary containing:
- success (bool): Whether the operation was successful
- message (str): Status message
Example:
{"tool": "type", "args": {"selector": "#search-input", "text": "search query"}}
{"tool": "type", "args": {"selector": "//input[@name='q']", "text": "search", "by": "xpath"}}
Inputs: selector (required), text (required), by.
tool_web_loginA
Perform website login
This tool attempts to log in to the provided URL. It waits for automatic
input prevention (CAPTCHA) to be detected before allowing the user to manually resolve it.
Args:
url (str): Login page URL
credentials (Dict[str, str]): Login credentials
- username: User ID
- password: Password
selectors (Dict[str, str]): CSS selectors for login form elements
- username: ID input field selector
- password: Password input field selector
- submit: Login button selector
auth_type (str, optional): Authentication type. Defaults to "form"
- form: Regular form-based login
- oauth: OAuth authentication
- api: API-based authentication
wait_for (Optional[str], optional): CSS selector for element to wait for after login
Returns:
Dict[str, Any]: Login result
- success (bool): Login success status
- message (str): Status message
- session_data (Dict): Login success session information
- cookies: Cookie information
- localStorage: Local storage data
- sessionStorage: Session storage data
Special handling:
1. CAPTCHA detection
- If reCAPTCHA or standard CAPTCHA is detected, wait for user to manually resolve
- Automatically continue login process after resolution
2. Naver login
- Automatic detection of various special situations like automatic input prevention, 2-step authentication
- Detailed error message analysis and return
Example:
>>> result = tool_web_login(
... url="https://nid.naver.com/nidlogin.login",
... credentials={
... "username": "your_username",
... "password": "your_password"
... },
... selectors={
... "username": "#id",
... "password": "#pw",
... "submit": ".btn_login"
... }
... )
>>> if not result["success"] and "CAPTCHA" in result["message"]:
... # Wait for user input for CAPTCHA resolution
... print("Please solve the CAPTCHA in the browser")
Inputs: url (required), credentials (required), selectors (required), auth_type, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 36 tools
Most tools have distinct purposes (e.g., navigate, click, type), but tool_web_login overlaps with multiple basic tools and could cause ambiguity. Additionally, tool_get_text and tool_get_elements have similar functionality.
All tools follow a consistent 'tool_verb_noun' snake_case pattern. While tool_web_login deviates slightly, the overall pattern is uniform and predictable.
36 tools is excessive for a browser automation server. Many low-level tools (e.g., tool_implicitly_wait, tool_set_page_load_timeout) could be combined or made optional, leading to unnecessary complexity.
Covers core browser actions (navigation, clicking, typing, cookies, frames, windows) but lacks explicit element wait conditions, alert handling, and attribute retrieval. The login tool partially addresses high-level needs.
Related MCP Connectors
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables MCP clients to drive a real, logged-in Chrome browser for web automation tasks like navigation, clicking, typing, and screenshotting.2 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables browser automation over MCP using a real Chrome browser with existing profile, supporting real tabs, downloads, cookies, and RPA workflows.166 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables MCP clients to control a real local browser window for web automation tasks such as clicking, typing, scrolling, and taking screenshots.11 npm-
- FlicenseNot gradedqualityDmaintenanceDrive your real, signed-in Chrome browser from any MCP client, enabling browser automation such as navigation, clicking, typing, and screenshots through standard MCP tools.1-