AI-powered native browser with 12 MCP tools. ~30 tokens per page.
io.github.xidik12/oculo MCP Server
io.github.xidik12/oculo is an AI-powered native browser that exposes 12 MCP tools for use by MCP clients. Its typical interaction budget is ~30 tokens per page. The server is positioned to help Claude Code, Cursor, Windsurf, and other MCP clients work against the live web, using tool-based browser actions.
π οΈ Key Features
Native browser with 12 MCP tools
Web automation with credential vault login workflow
Sample agent flow executes a task via tool calls (under 100 tokens)
π Use Cases
βLog into GitHub and star the oculo repoβ via an agent flow
Star or interact with live web content through an MCP client
β‘ Developer Benefits
Works with MCP clients such as Claude Code, Cursor, and Windsurf
Consistent, low overhead estimates (~30 tokens/page, under 100 tokens for the sample flow)
β οΈ Limitations
Token usage is described as approximate (~30 tokens per page); exact performance may vary.
Oculo β an open-source AI browser that gives Claude Code, Cursor, Windsurf, and any MCP client eyes on the live web. A sample agent flow turns the request 'Log into GitHub and star the oculo repo' into four act tool calls that log in via the credential vault and click Star, using under 100 tokens.
Oculo is a full-Chromium desktop browser that speaks the Model Context Protocol. Point Claude Code, Cursor, Windsurf, or any MCP client at it and your agent can see and drive real web pages β read the DOM, click, fill forms, extract data, run multi-step pipelines β through 12 compact tools that answer in under 300 tokens per flow.
Cursor : VSCode :: Oculo : Chrome
See it in action
Your agent describes intent; Oculo resolves it into a few tiny tool calls and hands back terse, redacted results β not megabytes of screenshots.
code
You: "Log into GitHub and star the oculo repo"
Claude Code calls:
1. act({action: "navigate", url: "https://github.com/login"})
2. act({action: "login", site: "github.com"}) # vault lookup, password never leaves the OS keychain
3. act({action: "navigate", url: "https://github.com/xidik12/oculo"})
4. act({action: "click", text: "Star"})
β 4 tool calls, <100 tokens of response
code
You: "Fill out the contact form on example.com"
Claude Code calls:
1. act({action: "navigate", url: "https://example.com/contact"})
2. page() # see the form structure
3. fill({fields: {"Name": "...", "Email": "..."}, submit: true})
β 3 tool calls
Section: Why Oculo β a native engine, not a wrapper
Oculo runs a real Chromium engine on your machine and adds an agent-first control layer on top. That combination is the point:
Capability
Native browser
Full Chromium engine β not a wrapper, extension, or headless scraper
Deep web research β opens multiple tabs, reads pages, synthesizes findings
synthesized
preview
Pre-fetch a URL without navigating away from the current page
page description
translate
Translate page content or specific text to any language
translated text
lens
Visual analysis of the current page via screenshot + AI vision
description
Bonus:webmcp_list and webmcp_call discover and invoke page-declared tools via the WebMCP protocol.
Section: How It Works β stdio to HTTP to webview
Architecture pipeline: an MCP client (Claude Code, Cursor, Windsurf) speaks stdio to the oculo-mcp bridge, which forwards over authenticated HTTP on port 19516 to the Electron main process, which sends IPC to the React renderer, which runs executeJavaScript inside the webview holding the live web page. Tools stay discoverable when idle; Oculo must be running to execute; port and token are published to ~/.oculo-port.
Why HTTP instead of stdio? Electron's <webview> is only reachable from the renderer process. The main process β where stdio lives β can't touch page content. The HTTP bridge crosses that boundary via main-to-renderer IPC.
Port discovery. On startup Oculo writes port:authtoken to ~/.oculo-port. The bin/oculo-mcp.mjs bridge reads it automatically, so tool definitions stay discoverable even when the app is closed β only execution requires Oculo to be running.
Section: Quick Start β clone, run, register
1. Install
Grab the latest build from Releases, or run from source:
bash
git clone https://github.com/xidik12/oculo.git
cd oculo
npm install
npm run dev
2. Register with your MCP client
Claude Code
bash
claude mcp add oculo -- node ~/oculo/bin/oculo-mcp.mjs
Cursor / Windsurf β add to your MCP config (.cursor/mcp.json or equivalent):
Run without a visible window for CI/CD, scraping, or server-side automation:
bash
node bin/oculo-headless.mjs # convenience launcher
npx electron . --headless # or raw flags
npx electron . --headless --headless-auto-approve # auto-approve CONFIRM actions
OCULO_HEADLESS=1 npm run dev # or via env var
docker compose up # containerized headless (Xvfb)
4. (Optional) Python SDK
bash
pip install oculo
python
from oculo import OculoClient
client = OculoClient() # auto-discovers port from ~/.oculo-portprint(client.page()) # describe the page
client.act("navigate", url="https://example.com")
client.fill({"Email": "hi@oculo.com", "Message": "Hello!"}, submit=True)
results = client.read("search results", format="json")
An async AsyncOculoClient with the same surface is also available.
Section: Security Model β gate, vault, redact
Every action passes through a permission gate, and every response is redacted before it reaches the model.
After a successful act/fill, selectors are cached with stability scores β id and data-testid = 10, aria-label = 9, role+name = 8, text = 7, css = 5. On the next run, DOM diffing picks the strategy:
> 80% similarity β replay from cache, no LLM call.
50β80% β fall back to alternative selectors.
< 50% β re-engage the AI for a fresh resolution.
That's where the 44%+ speed-up on repeated workflows comes from.
Built-in AI chat
Oculo also ships a side-panel chat that talks to multiple providers directly:
Provider
Auth
Models
Claude
API key or CLI subscription
Opus, Sonnet, Haiku
OpenAI
API key or Codex CLI
GPT-4o, GPT-4o mini, o1, o3
Gemini
API key
2.0 Flash, 1.5 Pro, 1.5 Flash
Grok
API key
Grok 2, Grok 2 Mini
Ollama
Local (no key)
Any pulled model
OpenClaw
API key
OpenClaw models
Building from source
bash
npm run build # production build
npm run dist:mac # macOS DMG + ZIP
npm run dist:win # Windows NSIS + portable
npm run dist:linux # Linux AppImage + deb
npm run typecheck # TypeScript
npm run lint # ESLint
npm run test# Vitest