chromaphore-mcp
OfficialChromaphore-mcp
Support: Discussions · Browser releases
A Claude Code plugin that drives the Chromaphore browser, a Chromium build with human-timed input commands and a per-launch fingerprint, through its custom DevTools protocol commands.
What Claude gets:
A page listing with ids, from the browser's own agent snapshot: roles, names, values, states, what is open on top, live-region announcements. After each action, only what changed.
Input a person would make: the pointer travels to what it clicks and scrolls it into view with the wheel; typing is paced, with rare corrected typos. Pages see trusted events.
Profiles and fingerprints to come back to: each launch answers with its profile folder and fingerprint seed.
Windows only for now, like the browser.
Install
/plugin install chromaphore --marketplace nodriver-project/chromaphore-mcp
/chromaphore:installThe second command downloads the latest browser release (about 1.6 GB, mostly fonts) to %LOCALAPPDATA%\Chromaphore. To use a Chromaphore you already have instead, set the plugin's Browser option in /config to its chrome.exe.
The plugin needs Node.js 20 or later on PATH.
Claude Code asks before every tool call of a new plugin. To let the browser tools run without asking, add to permissions.allow in ~/.claude/settings.json:
"mcp__plugin_chromaphore_browser__*"Upgrading from chromeleon
Before 0.2.0 the plugin was named chromeleon. Claude Code sees the new name as a new plugin, so swap it once, from a terminal:
claude plugin uninstall chromeleon@chromeleon
claude plugin marketplace remove chromeleon
claude plugin install chromaphore --marketplace nodriver-project/chromaphore-mcpThen /reload-plugins in sessions already running, change the allow rule to the one above, and set the Browser option again if you used it. Nothing is downloaded again: the release and the profiles the old plugin made move from %LOCALAPPDATA%\Chromeleon to %LOCALAPPDATA%\Chromaphore the first time the new plugin starts. Whatever a browser has open at that moment, and a profile used in the last ten minutes, moves at a later start; old profile paths keep working in the new plugin's browser_open.
Related MCP server: mare-browser-mcp
Tools
Tool | What it does |
| Downloads and unpacks the latest release, checked against its published SHA-256, replacing an older one; |
| Launches with a new, temporary or existing profile, a fixed or random fingerprint seed, with or without a window |
| Tabs, including those the page opens |
| A URL, back, forward or reload; answers with the settled page's listing |
| The listing, and its screenshot with each element outlined and labelled |
| Human-timed input; each answers with what changed |
| Native controls worked as a person works them: the dropdown opened and clicked, the date typed part by part, the colour picker, the file chooser answered |
| Native drag and drop, pointer-driven libraries and sliders, with a real carry |
| A real Ctrl+V from the browser's own clipboard (the machine's is never touched) |
| Answers an alert, confirm or prompt |
| Reads a URL through the browser without a tab: HTML as Markdown, anything else as text, or an API call from the site's own origin; reports bot challenges |
| Records all the browser's traffic from inside it: HAR with bodies, a request index, a summary |
| What the browser shows sites about the machine for this launch |
| Evaluates an expression in the page |
| Saves a PNG to a file |
Requires Chromaphore 156 or later.
Where things live
%LOCALAPPDATA%\Chromaphore\browser\<release>\: the browser.%LOCALAPPDATA%\Chromaphore\profiles\: profiles the tools created. Each holds that profile's cookies and logins; delete a folder to forget it.%LOCALAPPDATA%\Chromaphore\temp\: temporary profiles while their browser runs; each is deleted when its browser exits.
The browser is started outside Claude Code's process tree and closes itself cleanly when the session ends.
Layout of this repository
.claude-plugin/marketplace.json: the repository is its own marketplace.plugin/: what Claude Code installs: the manifest, the MCP server config, the bundled server (dist/), the skills.server/: the server's TypeScript source;npm install, thennode build.mjsbundles it intoplugin/dist/and writesplugin/THIRD_PARTY_NOTICES.md,plugin/LICENSEandplugin/NOTICE.server/test/:smoke.mjsandphase2.mjsdrive the bundled server over stdio through every tool on local test pages (node test/smoke.mjs <chrome.exe>);claude_session.mjsloads the plugin into a realclaude -p --plugin-dirsession and checks the browser closes cleanly afterwards (with--temp, that its temporary profile is deleted);temp_profile.mjschecks temporary profiles are deleted afterbrowser_closeand after the session ends;migrate.mjsmoves a pre-0.2.0 install (%LOCALAPPDATA%\Chromeleon) to the new folder, with a browser of it running and then without, and works the list of releases left to delete;install.mjsrunsbrowser_install.server/spikes/: the experiments the design rests on (the pipe, shutdown, automation signals, window values, ECH). They take the browser fromCHROMAPHORE_BROWSERor the installed release.
docs/DESIGN.md: why the server works the way it does: the pipe, the launch outside the process tree, every launch switch, the automation-signal results, how actions settle.
License
Apache License 2.0; see also NOTICE. The npm packages bundled into the server keep their own licenses (notices); the browser has its own license in its repository.
Available Tools
28 toolsbrowser_closeClose the browserA
Closes the browser cleanly. The profile keeps its state, unless it is temporary: then it is deleted.
Inputs: no named parameters.
browser_installInstall the browserA
Downloads the latest Chromaphore release from GitHub (about 1.6 GB with its fonts), checks its SHA-256 and unpacks it under %LOCALAPPDATA%\Chromaphore, replacing an older installed release; downloads nothing when the latest is already installed. With check_only it only reports what is installed and what the latest release is, and never downloads: call that first, and ask the user before a call that would download. Not needed when a browser path is set in the plugin settings.
Inputs: check_only.
browser_openOpen the browserA
Launches the browser. Answers with the profile path and the fingerprint seed in use: pass them back on a later browser_open to return to the same cookies, logins and storage (profile) and the same fingerprint (seed). Headless runs without a window; headed (the default) lets the user watch.
Inputs: url, seed, profile, headless.
clickClickA
Scrolls the element into view, moves the pointer to it along a human path and clicks; answers with what the click led to and what changed. A covered element is refused with what covers it.
Inputs: id (required), count, button, modifiers.
dialogAnswer a dialogA
Accepts or dismisses the alert, confirm, prompt or leave-page dialog open on the selected tab.
Inputs: accept (required), text.
dragDragA
Drags an element with a real pointer: presses, carries (scrolling under itself where needed) and lets go. Drop onto another element (to, with slot before/after/on for sortable lists), onto a point of the view (x, y), or set a slider (value). Works for native drag and drop and for pointer-driven libraries.
Inputs: from (required), x, y, to, +2 more.
eval_jsRun JavaScriptA
Evaluates an expression in the page's main world and answers with its value as JSON (promises are awaited). For reading app state or the DOM; prefer click and type for input, which pages see as real.
Inputs: expression (required).
fetchRead a URLARead-only
Reads a URL through the browser, with its cookies, fingerprint and network, in a hidden page that never becomes a tab: HTML is rendered and returned as Markdown, anything else as text. A method, headers or a body make it an API call from a page of the URL's origin. Says when a bot challenge or a block got in the way. Needs an open browser (headless is fine).
Inputs: url (required), body, mode, links, +3 more.
fill_dateFill a date or time fieldA
Fills an input of type date, time, datetime-local, month or week part by part, as typed by a person. value as the field's value attribute takes it: 2024-05-03, 14:30, 2024-05-03T14:30, 2024-05, 2024-W18.
Inputs: id (required), value (required).
fingerprintFingerprint reportBRead-only
What this browser shows sites about the machine: user agent, GPU, hardware, screen, time zone, languages, fonts, WebRTC, as set for this launch. full: every field as JSON.
Inputs: full.
hoverHoverA
Moves the pointer onto the element and leaves it there; answers with what appeared (a menu, a tooltip).
Inputs: id (required).
observeList the pageARead-only
Waits for the page to settle and lists it: one line per element with its id (a12), role, name, value, states and where it is; what is open on top (a dialog, a menu); and live-region announcements. Elements in view that can be acted on carry the [color] of their outline on the screenshot view shows.
Inputs: scope, offscreen.
pastePasteA
Pastes text with Ctrl+V from the browser's own clipboard (the machine's clipboard is never touched), clicking into the element first when an id is given. Faster than type for long text; the page sees a real paste.
Inputs: text (required), id.
pick_colorPick a colourB
Sets an input of type color through its own picker. value as #rrggbb.
Inputs: id (required), value (required).
pressPress keysC
Presses a key or a chord: Enter, Escape, Tab, ArrowDown, Ctrl+A, Shift+Tab, F5.
Inputs: keys (required), times.
record_startRecord trafficC
Records every request, response and websocket message of the whole browser, from inside the browser (pages cannot see it): a HAR with bodies, a grep-able request list, and a summary. full also keeps every script the pages compiled. The files hold cookies and whatever the pages sent: keep them out of version control.
Inputs: path, level, minutes.
record_stopStop recordingA
Ends the recording, closes its files and answers with its summary.
Inputs: no named parameters.
screenshotSave a screenshotA
Saves a PNG of the view (or the whole page) to a file and answers with its path; shows you nothing.
Inputs: path, full_page.
scrollScrollB
Turns the mouse wheel like a person, over an element when one is given (the pointer moves there first), else where the pointer is.
Inputs: direction (required), id, pace, amount.
selectPick in a dropdownA
Picks options in a the way a person does (opens its list and clicks, or uses the keys when the list cannot open). values: one for a dropdown, the exact set for a multiple list; each matches an option by its visible text or its value. A wrong value is refused with the options there are.
Inputs: id (required), values (required).
tab_closeClose a tabD
Closes a tab.
Inputs: tab (required).
tab_listList tabsARead-only
The open tabs, with ids, titles and URLs; the selected one is marked.
Inputs: no named parameters.
tab_newOpen a tabB
Opens a tab and selects it; the other tools act on the selected tab.
Inputs: url.
tab_selectSelect a tabA
Brings a tab to the front and makes it the one the other tools act on. Tabs the page opened appear in tab_list.
Inputs: tab (required).
typeTypeA
Types text at a human pace (about 6 characters a second), clicking into the element first when an id is given. Rare typos are made and corrected at once, as a person would, except in fields where a wrong character matters (passwords, numbers, codes, card fields); exact: true turns them off.
Inputs: text (required), id, clear, exact, +1 more.
uploadChoose filesA
Clicks a file field (or the button or label that opens one) and answers its file chooser with these files, as a person picking them would. Paths are on this machine; relative ones are from the working folder. For a folder field, one folder.
Inputs: id (required), files (required).
viewSee the pageARead-only
The screenshot of a snapshot_id from observe or an action, each actionable element outlined with its id in a badge of the same color. Costs about 1,500 tokens; use it when the text listing is not enough (layout, an image, a visual state).
Inputs: snapshot_id (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 28 tools
Each tool targets a distinct browser capability (navigation, tabs, pointer actions, form controls, lifecycle, recording), and descriptions explicitly delimit the subtle cases (type vs paste vs fill_date, click vs press, observe vs view). The one real soft spot is the trio of observation tools — observe (text listing), view (annotated image, ~1,500 tokens) and screenshot (writes a PNG, 'shows you nothing') — where view and screenshot could be picked wrongly at a glance. Overall boundaries are clear.
All names are snake_case and readable, but ordering conventions are mixed: noun_verb families (tab_list, tab_new, tab_select, tab_close, browser_open, record_start) sit alongside verb_noun names (fill_date, pick_color) and bare verbs (press, click, type, scroll, navigate, observe, fetch). The grouping by prefix (tab_*, browser_*, record_*) helps, but there is no single predictable pattern.
28 tools is on the heavy side of the rubric, though a full browser-automation domain plausibly needs this breadth and nearly every tool covers a distinct interaction. Some niche entries (pick_color, fill_date, fingerprint as a standalone read) could plausibly be folded into broader tools. It sits at the borderline rather than being genuinely bloated.
Coverage is strong: browser lifecycle and install, tabs, navigation, observation, the full range of input primitives, dialogs, uploads, drag/slider, network fetch and HAR recording. Gaps are minor and workaroundable — no explicit download handling, no cookie/storage management tool (though eval_js can reach app state) and no frame/iframe targeting tool. Agents can proceed without dead ends for most workflows.
Maintenance
Related MCP Connectors
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP Server for Chrome DevTools, following the Chrome DevTools Protocol. Integrates with Claude Desktop and Claude Code.315MIT
- AlicenseAqualityCmaintenanceA lean, LLM-first browser automation MCP server that gives Claude (or any MCP client) a real Chromium browser to navigate, interact with, and debug web apps.1414 npm6MIT
- AlicenseNot gradedqualityAmaintenanceMCP server to control a real Chrome browser from Claude, enabling navigation, DOM snapshots, clicks, typing, screenshots, and JS execution via a Chrome extension bridge.MIT
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets AI coding tools drive the user's actual, already-logged-in Chrome browser — snapshotting pages, clicking, typing, navigating, reading content, taking screenshots, and inspecting cookies, network traffic, and console output. Browser automation happens through a Chrome extension using Native Messaging, so no remote-debugging port is exposed and all communication stays on the local machine.1 npmISC