Skip to main content
Glama

Chromaphore-mcp

Discord

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:install

The 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-mcp

Then /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

browser_install

Downloads and unpacks the latest release, checked against its published SHA-256, replacing an older one; check_only reports what is installed and what the latest release is, and downloads nothing

browser_open / browser_close

Launches with a new, temporary or existing profile, a fixed or random fingerprint seed, with or without a window

tab_list / tab_new / tab_select / tab_close

Tabs, including those the page opens

navigate

A URL, back, forward or reload; answers with the settled page's listing

observe / view

The listing, and its screenshot with each element outlined and labelled

click / hover / type / press / scroll

Human-timed input; each answers with what changed

select / fill_date / pick_color / upload

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

drag

Native drag and drop, pointer-driven libraries and sliders, with a real carry

paste

A real Ctrl+V from the browser's own clipboard (the machine's is never touched)

dialog

Answers an alert, confirm or prompt

fetch

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

record_start / record_stop

Records all the browser's traffic from inside it: HAR with bodies, a request index, a summary

fingerprint

What the browser shows sites about the machine for this launch

eval_js

Evaluates an expression in the page

screenshot

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, then node build.mjs bundles it into plugin/dist/ and writes plugin/THIRD_PARTY_NOTICES.md, plugin/LICENSE and plugin/NOTICE.

    • server/test/: smoke.mjs and phase2.mjs drive the bundled server over stdio through every tool on local test pages (node test/smoke.mjs <chrome.exe>); claude_session.mjs loads the plugin into a real claude -p --plugin-dir session and checks the browser closes cleanly afterwards (with --temp, that its temporary profile is deleted); temp_profile.mjs checks temporary profiles are deleted after browser_close and after the session ends; migrate.mjs moves 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.mjs runs browser_install.

    • server/spikes/: the experiments the design rests on (the pipe, shutdown, automation signals, window values, ECH). They take the browser from CHROMAPHORE_BROWSER or 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 tools
browser_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 URLA
Read-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 reportB
Read-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 pageA
Read-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 tabsA
Read-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 pageA
Read-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

    B3/5.0

    Scored across 28 tools

    Disambiguation4/5

    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.

    Naming Consistency3/5

    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.

    Tool Count3/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      A 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.
      14
      14 npm
      6
      MIT
    • A
      license
      Not graded
      quality
      A
      maintenance
      MCP 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
    • A
      license
      Not graded
      quality
      A
      maintenance
      A 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 npm
      ISC