See the page, not the markup.
A pruned accessibility tree keeps roles, names, state, and values. Scripts, styles, and wrapper divs stay out.
Give your existing agent a way to navigate, read, and act on the web. Callisto connects over MCP and returns a concise view of the page.
Raw markup can be large and difficult to navigate. A task may need only a small part of the page.
Elements move, disappear, or become covered. An action needs to check the page as it exists now.
Agents need a browser connection, an interface, and a way to understand the result of each action.
A useful response makes it easier for the agent to inspect the page and decide what to do next.
Callisto runs a local Chromium and exposes it over MCP. The agent navigates, reads a bounded accessibility tree, and acts on page refs — without a separate Playwright install or model API key.
Callisto speaks stdio MCP. OpenCode, Claude Code, Codex, or your own host launches one process. The host supplies the model; Callisto requires Node.js and a local Chromium or Chrome binary.
Give the agent the page it needs to act on, not the markup the browser happened to build.
<div class="sc-1x2y3z"> <div class="header__nav"> <button class="btn btn--primary">Add to Cart</button> </div> <script>window.__DATA__ = {…}</script>Markup mixes the page structure with implementation details.
navigation "Main" [ax-3] link "Home" [ax-12] button "Add to Cart" {clickable} [ax-18] textbox "Search" [ax-24] heading "Featured"Actionable nodes first, page refs, bounded output. The agent decides with less noise.
A pruned accessibility tree keeps roles, names, state, and values. Scripts, styles, and wrapper divs stay out.
Click and fill check visibility, stability, enabled state, and hit testing before they touch the page.
Snapshots default to 12,000 characters. Page with nextOffset or search the full tree with callisto_find.
The host agent stays in charge. Callisto is the hands and eyes: a browser process, a protocol, and a readable page.
The agent stays the decision maker. Callisto only exposes the page and performs the action you asked for.
With Node.js 20+ and Chrome or Chromium available, clone the repo and build Mini.
git clone https://github.com/Lothnic/callisto.git
cd callisto
npm --prefix packages/mini ci
npm --prefix packages/mini run build
OpenCode can use the included project configuration. For other MCP hosts, use an absolute path to the compiled server.
{
"mcpServers": {
"callisto": {
"command": "node",
"args": ["/absolute/path/to/callisto/packages/mini/dist/mcp.js"]
}
}
}
The first browser call starts an isolated session. Set CHROME_PATH if your browser is not discovered.
Open Hacker News and summarize
the top three Show HN posts.
Prefer a CLI? callisto-sidecar speaks the same engine over JSON-RPC on stdio.
No. Callisto is a CDP engine with a Playwright-shaped subset. It exposes structured MCP actions, not arbitrary JavaScript. Treat it as a lean runtime, not a drop-in Playwright replacement.
By default Callisto starts an isolated browser. An experimental bridge can open its own tab through a paired browse extension, but it cannot yet adopt existing tabs or provide browse’s handoff and stop controls. Background input is refused. Read connected-mode limitations ↗
No. Your host agent supplies the model. Callisto only supplies the browser and the page representation.
MCP snapshots default to 12,000 characters. Use nextOffset to page through the last capture, or callisto_find to search the full tree without sending all of it.
Callisto is not a sandbox. Browser actions can change real websites, and snapshots are not a general secret filter. Use a dedicated profile and your own approval layer for sensitive work. The experimental connected mode requires an origin allowlist; it does not block all subresources.
The CDP engine, the MCP server, bounded snapshots, same-origin frame actions, batching, and an eval kit. Cross-origin frames, human handoff, and full Playwright compatibility are still open work. The project is experimental and says so.
LOCAL · ISOLATED · NO API KEY