| name | chrome-devtools-mcp-manager |
| description | Manage chrome-devtools-mcp service and OpenClaw's built-in Chrome browser for MCP-based browser automation. Use when user needs to use chrome-devtools-mcp functionality, ensure the browser is ready for MCP operations, or manage the browser/MCP lifecycle. |
Chrome DevTools MCP Manager
Manage OpenClaw's built-in Chrome browser and chrome-devtools-mcp integration for browser automation via MCP protocol.
Overview
This skill manages two components:
- OpenClaw's Built-in Chrome (
openclaw profile) - The browser instance
- chrome-devtools-mcp - The MCP server that exposes browser control tools
Architecture
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ OpenClaw โโโโโโถโ Built-in Chrome โโโโโโโ chrome-devtoolsโ
โ (browser tool)โ โ (CDP Port 18800) โ โ -mcp (MCP srv) โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ MCP Client โ
โ (mcporter etc) โ
โโโโโโโโโโโโโโโโโโโ
Built-in Chrome (openclaw profile)
- CDP Port: 18800
- Managed by: OpenClaw's
browser tool
- Auto-start: Yes, via
browser(action: "open")
- Profile isolation: Separate user data directory
chrome-devtools-mcp
- Type: MCP (Model Context Protocol) server
- Transport: stdio (not HTTP)
- Lifecycle: Runs per MCP client session
- Connection: Connects to Chrome via CDP on port 18800
Component Status Check
1. Check Built-in Chrome Status
browser({
action: "status",
profile: "openclaw"
})
Expected running state:
{
"enabled": true,
"profile": "openclaw",
"running": true,
"cdpReady": true,
"cdpPort": 18800,
"cdpUrl": "http://127.0.0.1:18800"
}
2. Verify CDP Endpoint
Invoke-WebRequest -Uri "http://localhost:18800/json/version" -Method GET
Expected response:
{
"Browser": "Chrome/134.0.0.0",
"Protocol-Version": "1.3",
"User-Agent": "Mozilla/5.0...",
"V8-Version": "...",
"WebKit-Version": "...",
"webSocketDebuggerUrl": "ws://localhost:18800/devtools/browser/..."
}
3. Check MCP Server Status
Since chrome-devtools-mcp runs as a stdio service per MCP client session, there's no persistent process to check. Instead, verify the MCP configuration is correct.
Managing Built-in Chrome
Start Built-in Chrome
browser({
action: "open",
profile: "openclaw",
url: "about:blank"
})
browser({
action: "open",
profile: "openclaw",
url: "https://chat.deepseek.com/"
})
Stop Built-in Chrome
browser({
action: "stop",
profile: "openclaw"
})
Restart Built-in Chrome
browser({ action: "stop", profile: "openclaw" })
browser({ action: "open", profile: "openclaw", url: "about:blank" })
MCP Server Configuration
For mcporter CLI
Configure mcporter to use chrome-devtools-mcp:
mcporter server add chrome-devtools \
--command "npx" \
--args "chrome-devtools-mcp@latest,--browserUrl,http://127.0.0.1:18800,--no-usage-statistics"
mcporter server add chrome-devtools \
--command "npx" \
--args "chrome-devtools-mcp@latest,--autoConnect,--no-usage-statistics"
For Claude Desktop / Other MCP Clients
Add to claude_desktop_config.json:
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"chrome-devtools-mcp@latest",
"--browserUrl", "http://127.0.0.1:18800",
"--no-usage-statistics"
]
}
}
}
Environment Variables
# Disable usage statistics
$env:CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS = "1"
# Enable debug logging
$env:DEBUG = "*"
Complete Setup Workflow
First-Time Setup
-
Verify built-in Chrome is ready:
const status = await browser({ action: "status", profile: "openclaw" })
if (!status.cdpReady) {
await browser({ action: "open", profile: "openclaw", url: "about:blank" })
}
-
Test CDP connection:
Invoke-WebRequest -Uri "http://localhost:18800/json/version"
-
Configure MCP client (mcporter, Claude Desktop, etc.)
-
Test MCP connection:
mcporter call chrome-devtools.list_pages
Daily Usage Pattern
-
Ensure Chrome is running (before MCP operations):
const status = await browser({ action: "status", profile: "openclaw" })
if (!status.cdpReady) {
await browser({ action: "open", profile: "openclaw", url: "about:blank" })
await new Promise(r => setTimeout(r, 2000))
}
-
Use MCP tools via mcporter or other MCP client
-
Keep Chrome running for subsequent operations
Available MCP Tools
Once connected via chrome-devtools-mcp, these tools are available:
Page Management
list_pages - List all open tabs/pages
new_page - Create new tab
select_page - Switch to specific tab
close_page - Close a tab
navigate_page - Navigate to URL / back / forward / refresh
Interaction
click - Click element by uid
fill - Fill input field
type_text - Type text
press_key - Press keyboard key
select_option - Select dropdown option
Inspection
take_snapshot - Get accessibility tree snapshot
take_screenshot - Capture screenshot
evaluate_script - Execute JavaScript
wait_for - Wait for text/element
Browser State
get_browser_state - Get cookies, localStorage, etc.
set_browser_state - Set cookies, localStorage, etc.
Integration with Other Skills
Example: deepseek-web-query
This skill uses chrome-devtools-mcp via mcporter:
mcporter call chrome-devtools.navigate_page type: "url" url: "https://chat.deepseek.com/"
mcporter call chrome-devtools.take_snapshot
mcporter call chrome-devtools.type_text text: "ๆฅ่ฏขๅ
ๅฎน"
mcporter call chrome-devtools.press_key key: "Enter"
mcporter call chrome-devtools.evaluate_script function: '() => document.body.innerText'
Troubleshooting
"CDP not ready"
Symptoms: browser({ action: "status" }) shows cdpReady: false
Solutions:
- Restart Chrome:
browser({ action: "stop", profile: "openclaw" })
browser({ action: "open", profile: "openclaw", url: "about:blank" })
- Check for port conflicts:
Get-NetTCPConnection -LocalPort 18800
"Cannot connect to Chrome" from MCP
Symptoms: MCP server fails to connect
Solutions:
- Verify CDP endpoint is accessible:
curl http://localhost:18800/json/version
- Check Windows Firewall isn't blocking localhost
- Ensure Chrome was started with remote debugging enabled (built-in profile does this automatically)
MCP server exits immediately
This is normal behavior! The MCP server:
- Waits for JSON-RPC messages on stdin
- Exits when stdin closes (client disconnects)
- Is designed to be launched per-session by MCP clients
Port 18800 conflicts
Check what's using the port:
Get-NetTCPConnection -LocalPort 18800 |
Select-Object LocalPort, State, OwningProcess, @{Name="ProcessName";Expression={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).Name}}
Kill conflicting process:
Get-Process -Id (Get-NetTCPConnection -LocalPort 18800).OwningProcess | Stop-Process -Force
Best Practices
- Always check Chrome status first before MCP operations
- Reuse browser sessions - Don't close Chrome between operations
- Use
about:blank for quick startup when you don't need a specific page
- Configure MCP client once - The config persists across sessions
- Handle login states in your automation logic (e.g., deepseek-web-query handles DeepSeek login)
Quick Reference
| Task | Command |
|---|
| Check Chrome status | browser({ action: "status", profile: "openclaw" }) |
| Start Chrome | browser({ action: "open", profile: "openclaw", url: "about:blank" }) |
| Stop Chrome | browser({ action: "stop", profile: "openclaw" }) |
| Test CDP | Invoke-WebRequest http://localhost:18800/json/version |
| Add MCP to mcporter | mcporter server add chrome-devtools --command "npx" --args "..." |
| List MCP pages | mcporter call chrome-devtools.list_pages |
References