chromiumfish_mcp
Page management: list, open, select, close pages/tabs with stable IDs.
Navigation: navigate to URLs, back/forward, reload; reports HTTP status, final URL, title.
Content inspection: capture screenshots (viewport, full page, element), retrieve visible text, list interactive elements (snapshot with ARIA roles, stable references), enumerate frames/iframes with IDs.
Interaction: click elements (by reference, CSS selector, or coordinates), hover, type text (with clear/submit), select dropdowns, set checkboxes/radios, press keys, scroll, and drag-and-drop (with human-like path).
Waiting: wait for element presence/absence, text visibility, URL patterns, page load states, or fixed duration.
Challenge handling: detect and solve browser interstitials or checkbox-style CAPTCHAs.
Dialog handling: pre-arm responses for JavaScript alerts, confirms, prompts.
File operations: upload files to inputs (requires
--upload-dir), list downloads (requires--download-dir).Advanced (requires explicit flags): execute arbitrary JavaScript (
evaluate) and run native autonomous agent (run_task).Security: restrict navigation to allowed hosts, require directories for uploads/downloads, disable eval/native agent by default, isolate browser contexts.
Click on "Install 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., "@chromiumfish_mcpgo to example.com and show me what's clickable"
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.
chromiumfish_mcp
chromiumfish_mcp is an independent Model Context Protocol (MCP) server for ChromiumFish. It lets Claude Code, Claude Desktop, Cursor, and other MCP clients drive a ChromiumFish browser through structured tools.
It uses the official ChromiumFish npm package and ships no Chromium source or binaries — on the first tool call that needs a page, the upstream SDK downloads and caches the matching browser build. See docs/USAGE.md for detailed tool usage.
Requirements
Node.js 20 or later.
An OS and architecture supported by ChromiumFish.
Network access for the initial browser download. If no prebuilt asset matches your platform, build ChromiumFish locally and point to it with
--chrome-pathorCHROME_BIN.
Related MCP server: mcp-chrome-server
Install
npm install --global github:LowOrbitLab/chromiumfish_mcp
chromiumfish_mcp --persona-seed aliceOr run without installing: npx --yes github:LowOrbitLab/chromiumfish_mcp --persona-seed alice.
Configure
Add the server to your MCP client config:
{
"mcpServers": {
"chromiumfish": {
"command": "chromiumfish_mcp",
"args": ["--persona-seed", "alice"]
}
}
}To run from GitHub instead of a global install, set "command": "npx" and prepend "--yes", "github:LowOrbitLab/chromiumfish_mcp" to args. On Windows, use npx.cmd if your client cannot resolve npx.
Tools
Tool | Purpose |
| Manage pages by stable |
| Navigate and use page history |
| List visible interactive elements with |
| Retrieve page or frame content; |
| Interact with the page |
| Drag onto another element or by a pixel offset, with a human-like path |
| Arm the answer for the next |
| Attach local files to a file input — requires |
| Report what was downloaded and where it landed — requires |
| Click absolute coordinates (for widgets |
| List frames/iframes with stable IDs |
| Detect and clear interstitial / framed challenges; the result says whether one was observed, interacted with, and verified |
| Run arbitrary JavaScript — requires |
| Native ChromiumFish agent — requires |
A JavaScript dialog is answered the instant it opens, because a page left waiting on one freezes and no later call could finish. Unarmed the answer is dismiss — which is what Playwright already did silently — so a click that only raised confirm("Delete?") did not delete, and the action result now says so under dialogs. Call handle_dialog to arm the next answer, then repeat the action. The four navigation tools also report the HTTP status, since a 404 or a 500 loads like any other page.
Every navigation and interaction tool reports the resulting url, title, navigated, and any newPages, so a client only needs a follow-up snapshot when the page actually changed; returnSnapshot: true returns the action result and a fresh snapshot in one call. An action that navigates waits for the new document before reporting, so those fields describe the page it arrived on; one whose navigation is still in flight after ten seconds reports navigationPending: true rather than describing the page being left as though nothing happened, and one whose navigation was cancelled outright — blocked by --allowed-host, an unresolvable host — reports navigationFailed with the browser's own reason instead of waiting out that bound for a page that is never coming. Reference numbers are never reused, so one held across a snapshot fails with an error instead of acting on a different element; snapshot also reports ARIA roles, so role=button[name="Submit"] works in any target field as a re-render-proof alternative. The server ships MCP instructions describing this workflow, reference lifetime, and the challenge sequence.
Snapshot references, frame-aware interaction, waiting, and the cross-origin challenge workflow are covered in docs/USAGE.md.
Command-line options
--persona-seed VALUE Use a stable browser fingerprint persona
--chrome-path PATH Use a local ChromiumFish executable
--browser-version VERSION Select an upstream ChromiumFish build version (rejected with --chrome-path)
--headed Show the browser window
--window-size WIDTHxHEIGHT Set the browser window size
--timezone ZONE Use an IANA time zone, auto, or system (default: auto)
--proxy URL Route browser traffic through a proxy
--allowed-host HOST Allow top-level navigation to a bare host and its subdomains; repeatable
--max-text-chars N Set the hard limit for text and snapshot output
--upload-dir PATH Allow upload_file to read this directory; repeatable
--download-dir PATH Save downloads here; without it they are discarded
--allow-eval Enable arbitrary JavaScript execution
--allow-native-agent Enable the native ChromiumFish browser agentProxy credentials can be embedded in the proxy URL, but are then exposed in the client config. Never commit config files containing proxy passwords, cookies, or API keys.
Security
stdio only — do not expose the Chromium DevTools endpoint to the public internet.
evaluateand the native agent are disabled by default; enable them only in trusted environments.--allowed-host example.comrestricts top-level HTTP/HTTPS navigation (redirects, links, form posts, popups) to a host and its subdomains. Give it a bare host name: matching is on the host alone, so a scheme, path, port, leading dot, or wildcard is rejected at startup rather than quietly matching nothing. Third-party subframes and page assets remain reachable — it is a navigation guard, not a network egress filter. A blocked navigation is reported asnavigationFailedwith reasonnet::ERR_BLOCKED_BY_CLIENT, rather than as a click that appeared to do nothing. Enabling it also turns on request interception, which disables the browser's HTTP cache for the session: expect slower asset-heavy pages, and note that a browser re-fetching everything on a repeat visit is itself a signal to sites that profile behavior.upload_filesends host files to whatever origin the page posts to, so it is unregistered until--upload-dirnames at least one directory, and every path must resolve inside one. Both the path and the roots are resolved through symlinks first, so a link planted inside a root cannot reach outside it. Scope the roots to the files a task actually needs — a page can influence which file the model picks.Downloads are written only when
--download-dirnames a directory; without it the transfer still runs (so the page's own flow is unchanged) but nothing is kept, and the action result saysdiscarded. The file name comes from the remote server'sContent-Disposition, so it is reduced to a bare base name and the resolved path is checked against the root before anything is written.A page can raise
confirm()to guard a destructive action. Unarmed dialogs are dismissed, so that guard holds by default;handle_dialogwithaccept: truedeliberately answers the next one. Keep human confirmation in front of it for anything irreversible.Clients can click and type with real side effects. Keep human confirmation for purchases, publishing, deletion, and permission changes.
solve_challengereturnsok: truewhenever the page is not blocked, including on pages that were never challenged. ReadchallengeObserved,interactionPerformed, andclearanceVerifiedbefore recording or reporting that a challenge was cleared —okalone will overstate what happened.Each process runs an independent browser context; this is not a shared multi-tenant service.
Development
npm ci
npm test
node dist/index.js --helpThe suite uses an in-memory MCP transport to verify tool discovery, dangerous-tool opt-in, and results. It does not download or launch a browser.
License
MIT. ChromiumFish code and trademarks belong to their respective contributors; see NOTICE for attribution. This is an independent wrapper, not an official ChromiumFish release.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityCmaintenanceEnables browser automation using the Selenium WebDriver through MCP, supporting browser management, element location, and both basic and advanced user interactions.903424MIT
- FlicenseCqualityDmaintenanceEnables browser automation, including navigation, form filling, login with CAPTCHA handling, and element manipulation, using a Chrome-based MCP server.364
- Alicense-qualityBmaintenanceEnables MCP clients to drive a real, logged-in Chrome browser for web automation tasks like navigation, clicking, typing, and screenshotting.11MIT
- Alicense-qualityCmaintenanceEnables browser automation over MCP using a real Chrome browser with existing profile, supporting real tabs, downloads, cookies, and RPA workflows.98MIT
Related MCP Connectors
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Access Kernel's cloud-based browsers and app actions via MCP (remote HTTP + OAuth).
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/LowOrbitLab/chromiumfish_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server