chromaphore-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Tools for driving the Chromaphore browser, a Chromium build whose input is timed like a person's and whose fingerprint is set per launch. Use them to test or debug a site, reproduce a bug with real input, or read pages through a real browser.
Loop: browser_open, then navigate. Every action (click, type, press, scroll, hover, navigate) waits for the page to settle and answers with what changed, so you rarely need observe after one. Call observe for a full listing of the page; call view only when the text is not enough (it costs about 1,500 tokens).
Elements are named by ids like a12 from the listings. An id stays valid while its element is on the page, across scrolls and later listings; a stale one is refused with the reason. Clicks move a real pointer along a curved path and scroll the element into view first; typing is human-paced, so long texts take seconds.
A JavaScript dialog blocks the page until answered with dialog. The listing marks elements outside the view and covered elements; act on covered ones only after closing what covers them.
Native controls have their own tools (select, fill_date, pick_color, upload, drag); use them rather than typing into such fields. To read a page or call an API without a tab, use fetch. To see a page's network traffic, wrap the steps in record_start and record_stop. The skill chromaphore:browser has more.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| browser_installA | 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. |
| browser_openA | 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. |
| browser_closeA | Closes the browser cleanly. The profile keeps its state, unless it is temporary: then it is deleted. |
| tab_listA | The open tabs, with ids, titles and URLs; the selected one is marked. |
| tab_newB | Opens a tab and selects it; the other tools act on the selected tab. |
| tab_selectA | Brings a tab to the front and makes it the one the other tools act on. Tabs the page opened appear in tab_list. |
| tab_closeD | Closes a tab. |
| navigateA | Loads a URL in the selected tab, or goes back, forward or reloads, then waits for the page to settle and answers with its listing. |
| observeA | 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. |
| viewA | 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). |
| clickA | 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. |
| hoverA | Moves the pointer onto the element and leaves it there; answers with what appeared (a menu, a tooltip). |
| typeA | 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. |
| pressC | Presses a key or a chord: Enter, Escape, Tab, ArrowDown, Ctrl+A, Shift+Tab, F5. |
| scrollB | Turns the mouse wheel like a person, over an element when one is given (the pointer moves there first), else where the pointer is. |
| dialogA | Accepts or dismisses the alert, confirm, prompt or leave-page dialog open on the selected tab. |
| screenshotA | Saves a PNG of the view (or the whole page) to a file and answers with its path; shows you nothing. |
| eval_jsA | 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. |
| selectA | 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. |
| fill_dateA | 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. |
| pick_colorB | Sets an input of type color through its own picker. value as #rrggbb. |
| uploadA | 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. |
| dragA | 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. |
| pasteA | 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. |
| fetchA | 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). |
| record_startC | 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. |
| record_stopA | Ends the recording, closes its files and answers with its summary. |
| fingerprintB | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.