A side-by-side look at the Chrome MCP and Gecko MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Chrome MCP for browser automation work as a local process; choose Gecko MCP for browser automation as a local process. You can also run both side by side in one mcpServers block.
CHROME_MCP_TOKEN, CHROME_MCP_EXTENSION_DIR.tabs_list, screenshot, get_text.list_tabs, open_tab, get_active_tab.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Browser Automation | Browser Automation |
| Quality signal | 64/100 · Good | 57/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Not declared | Not declared |
| Required env vars | CHROME_MCP_TOKENCHROME_MCP_EXTENSION_DIR | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 6 | 2 |
| Directory activity | 2 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 22 | 41 |
| Full listing | View Chrome MCP | View Gecko MCP |
tabs_listList open browser tabs.screenshotCapture a screenshot (page or element). Default is JPEG (quality 70) at CSS-pixel size, which is several times smaller than PNG and reads fine. Pass format:"png" for lossless, quality 1-100 for JPEG, scale 2 for device pixels on a Retina display or 0.5 to shrink.get_textGet visible text of the page or an element.get_htmlGet HTML of the page or an element. Output is capped (see maxBytes) and cut at a tag boundary; narrow it with `selector` rather than raising the cap when you can. Password field values are always blanked.snapshotAccessibility snapshot: interactive elements with refs to target by `ref` (more reliable than guessing CSS selectors). Pass diff:true to get only what changed since the last snapshot of this tab - far cheaper in a click/read loop. Password fields appear as secret:true with no value.page_watchSave a local page checkpoint and compare it later. Actions: create (name), compare (watchId), list, delete. Stores accessibility labels and state, never form values. Site allowlist still applies.get_cookiesCookies for the tab's URL (or url); values need --enable-cookie-values.storageRead/write localStorage (or sessionStorage). op: get|set|remove|clear.wait_forWait for a selector or text to appear/disappear.extract_linksExtract anchors from the page or a subtree. dedupe=true collapses links sharing an href (nav/footer noise); limit caps the count.read_as_markdownRead the page (or subtree) as readable markdown.frames_listList the tab's frames (the top document plus every iframe the extension can reach), with each frame's id and URL. Use it when a selector that should match does not: the element is probably in one of these frames, and you can then pass frameId (or allFrames:true) to act inside it.list_tabsList all open tabs in Floorp (title, URL, browserId, and whether each is active or pinned). Use the browserId to target other tools.open_tabOpen a URL in a new Floorp tab.get_active_tabReturn the active tab's title, URL and browserId. Note: with multiple browser windows open, 'active' is ambiguous — prefer the browserId returned by open_tab, or pick from list_tabs.navigate_tabNavigate a tab to a new URL. Targets the active tab unless a browserId is given.close_tabClose a tab by its browserId (from list_tabs).read_pageRead a tab's content. Returns clean Markdown by default; can also return raw HTML or the accessibility tree. Output is capped (default 25 KB) to protect the context — to LOCATE a specific element use `find` (cheaper) instead. Targets the active tab unless a browserId is given.screenshotTake a screenshot of a tab and return it as a PNG image. Targets the active tab unless a browserId is given.findLocate elements on a tab by visible text and/or tag and get a ready-to-use CSS `selector` for each — one fast call that searches the page server-side and returns ~1 KB instead of the whole HTML. Use this INSTEAD of read_page to find a button, link, or field, then pass the returned selector straight to click/type/etc. Provide `text`, `tag`, or both. Active tab unless browserId given.clickClick an element by CSS selector OR by a `ref` (fingerprint) from `snapshot`. Auto-scrolls the element into view first (fixes off-screen 'not actionable'). Targets the active tab unless a browserId is given.snapshotCapture a structured snapshot of a tab: clean Markdown with inline fingerprint refs (`<!--fp:...-->`) and an 'Element Selector Map' (fp | tag | text). Use this instead of read_page+grep to locate elements, then pass a `ref` to `click`. Targets the active tab unless a browserId is given.type_textType text into an input or textarea by CSS selector (clears it first by default). Targets the active tab unless a browserId is given.fill_formFill multiple form fields at once. `fields` maps CSS selectors (or field names) to values. Targets the active tab unless a browserId is given.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"chrome-mcp": {
"command": "npx",
"args": [
"-y",
"mcp-browser-extension@latest"
],
"env": {
"CHROME_MCP_TOKEN": "YOUR_CHROME_MCP_TOKEN_HERE",
"CHROME_MCP_EXTENSION_DIR": "YOUR_CHROME_MCP_EXTENSION_DIR_HERE"
}
}
}
}
{
"mcpServers": {
"gecko-mcp": {
"command": "npx",
"args": [
"-y",
"gecko-mcp"
]
}
}
}