Oculo

io.github.xidik12Published by GitHub account xidik12v0.4.1Updated Oct 24, 2026

AI-powered native browser with 12 MCP tools. ~30 tokens per page.

Overview

AI-generated overview

Oculo is a desktop Chromium browser with an MCP bridge that lets an assistant read, click, fill and extract from real web pages using compact text responses.

What you can do
  • Inspect and navigate pages: describe the current page, navigate, click, hover, scroll, type, press keys, manage tabs and cookies, pre-fetch URLs
  • Fill and submit forms by label or placeholder matching, including vault-based logins
  • Extract structured data such as search results, tables, lists and articles, and translate page content
  • Run multi-step pipelines with conditionals and cached replay, plus deep multi-tab web research
  • Generate images or video, analyze the page visually, and run non-interactive shell commands
  • Discover and invoke page-declared tools through the WebMCP protocol
When to use it
Useful when an assistant needs to operate real websites on the user's machine — logging in, filling forms, scraping structured content, or repeating a browsing workflow — rather than only fetching raw HTML. Also suited to multi-step research and scripted browser automation.
Requirements
A local desktop install of the Oculo browser (release build or built from source with Node.js 20+ and npm) on macOS, Windows or Linux; the npm package oculo-mcp is a stdio bridge to the running app. The app must be running for tool execution; it writes a port and auth token to a file in the home directory that the bridge reads. Optional headless/Docker mode and a Python SDK exist.
Before you install
The assistant can drive a real logged-in browser: clicks, form submissions, downloads, OAuth, proxy changes and shell commands are gated by permission levels, and headless auto-approve can skip confirmations. A credential vault stores site logins in the OS keychain and fills them without exposing passwords, but the model can trigger logins. Responses are redacted for secrets and PII, and page content is treated as untrusted, yet prompt injection from web pages remains a risk. Shell execution…

Installation

In SourceWeft

  1. Open Oculo in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[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.]

[GitHub stars] [Latest release] [Electron 34] [TypeScript 5.7] [React 19] [12 MCP tools] [MIT License]

Website · Download · Quick Start · MCP Tools · Architecture · Contributing


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.

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
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 browserFull Chromium engine — not a wrapper, extension, or headless scraper
12 MCP toolspage, act, fill, read, run, media, shell, tabs, research, preview, translate, lens
< 300 tokens / flowCompact text responses by default — cheaper than screenshot-based approaches
Self-healing automationSelector caching + DOM diffing — 44%+ faster on repeated workflows
Multi-provider AIBuilt-in chat with Claude, OpenAI, Gemini, Grok, OpenClaw, Ollama
4-level securityauto / notify / confirm / blocked permission gate on every action
OS keychain vaultCredentials encrypted via electron.safeStorage (macOS Keychain / Windows DPAPI)
PII redactionCredit cards, SSNs, JWTs, API keys, Bearer tokens stripped from every MCP response
Anti-injectionContent boundary markers + regex-based prompt-injection detection
19 stealth patchesNavigator, WebGL, canvas, WebRTC, audio, font, battery, and screen fingerprint defenses
Headless modeRun without a window — Docker support included
Cross-platformmacOS, Windows, Linux
Python SDKpip install oculo — sync and async clients
[Section: The Toolbelt — one verb per call]

Each tool does one thing and returns the smallest useful answer. Token cost is the response size the agent pays for.

ToolWhat it doesToken cost
pageDescribe the current page — headings, forms, buttons, links. Compact, a11y (ref-tagged), and markdown modes~30–80
actNavigate, click, hover, scroll, type, press keys, login via vault, manage tabs, cookies, proxy, recording~1 line
fillFill form fields by label/placeholder matching, optional submit. Text, select, checkbox, contenteditable~1 line
readExtract structured data — search results, tables, lists, articlescompact
runMulti-step pipeline with conditionals (page/act/fill/read/wait/if). Cached for replayheader + last
mediaGenerate images (Nano Banana 2 / DALL·E 3) or video (Veo 3.1); image-to-image editingfile path
shellExecute shell commands non-interactively (ls, npm, git, python, …)stdout + stderr
tabsList all open browser tabs with URLs and titlescompact
researchDeep web research — opens multiple tabs, reads pages, synthesizes findingssynthesized
previewPre-fetch a URL without navigating away from the current pagepage description
translateTranslate page content or specific text to any languagetranslated text
lensVisual analysis of the current page via screenshot + AI visiondescription

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.gitcd oculonpm installnpm 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):

json
{  "mcpServers": {    "oculo": {      "command": "node",      "args": ["/path/to/oculo/bin/oculo-mcp.mjs"]    }  }}

3. (Optional) Headless & Docker

Run without a visible window for CI/CD, scraping, or server-side automation:

bash
node bin/oculo-headless.mjs                          # convenience launchernpx electron . --headless                            # or raw flagsnpx electron . --headless --headless-auto-approve    # auto-approve CONFIRM actionsOCULO_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 pageclient.act("navigate", url="https://example.com")client.fill({"Email": "[email protected]", "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.

Permission levels

LevelActionsBehavior
Autonavigate, page, read, scroll, screenshot, back, forward, reload, hover, listTabs, switchTab, preview, translate, lensExecutes silently
Notifyclick, type, fill, select, press, submit, newTab, closeTabExecutes + OS notification
Confirmpayment, delete_account, change_password, send_email, download, oauth, shell, evaluate, setProxy, startRecordingNative dialog approval required
Blockedread_vault, export_cookies, export_tokens, disable_securityAlways rejected

Credential vault

  • Encrypted with electron.safeStorage → OS Keychain (macOS) / DPAPI (Windows).
  • Passwords are never returned via IPC or MCP — only domain + username are exposed.
  • act({action: "login", site: "github.com"}) retrieves and fills credentials without the model ever seeing them.

Redaction & anti-injection

  • Every MCP response passes through a redactor that strips credit-card numbers, SSNs, JWTs, API keys, private keys, and Bearer tokens.
  • Page content handed to the model is wrapped in boundary markers, and regex-based detection blocks prompt-injection attempts embedded in that content.

Stealth (19 patches)

Navigator (webdriver, languages, plugins, mimeTypes, connection, hardwareConcurrency, deviceMemory), window (chrome API, dimensions), WebGL (vendor/renderer spoofing), canvas (per-call fingerprint randomization), WebRTC (IP-leak prevention), AudioContext, font enumeration blocking, Battery API, and screen-resolution randomization.

Self-healing automation

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:

ProviderAuthModels
ClaudeAPI key or CLI subscriptionOpus, Sonnet, Haiku
OpenAIAPI key or Codex CLIGPT-4o, GPT-4o mini, o1, o3
GeminiAPI key2.0 Flash, 1.5 Pro, 1.5 Flash
GrokAPI keyGrok 2, Grok 2 Mini
OllamaLocal (no key)Any pulled model
OpenClawAPI keyOpenClaw models

Building from source

bash
npm run build          # production buildnpm run dist:mac       # macOS DMG + ZIPnpm run dist:win       # Windows NSIS + portablenpm run dist:linux     # Linux AppImage + deb
npm run typecheck      # TypeScriptnpm run lint           # ESLintnpm run test           # Vitest

Prerequisites: Node.js 20+, npm (not pnpm/yarn — native modules require npm), macOS / Windows / Linux.

Project structure
src/  main/                    Electron main process    ai/agent.ts            Multi-provider AI controller    captcha/               CAPTCHA detection + solvers    data/                  Bookmarks, downloads, history, session recording    engine/                Page describer, extractor, form-detector, pipeline, resolver,                           selector-cache, dom-differ, tab-manager    mcp/server.ts          HTTP MCP server (ports 19516–19520, auth token)    mcp/tools/             act, fill, page, read, run tool handlers    network/proxy.ts       HTTP/SOCKS proxy manager    security/              Vault, permissions, redactor, audit, anti-injection  preload/index.ts         contextBridge API  renderer/    App.tsx                Root browser UI component    components/            TabBar, AddressBar, ChatPanel, WebViewContainer,                           bookmarks, downloads, find, history, layout, common  shared/                  Types, constants, IPC channels, AI provider definitionsbin/  oculo-mcp.mjs            stdio-to-HTTP MCP bridge (for Claude Code / Cursor)  oculo-headless.mjs       Headless mode launchersdk/python/                Python SDK (pip install oculo)Dockerfile                 Container deploymentdocker-compose.yml         Docker Compose for headless mode

Contributing

See CONTRIBUTING.md for development setup, architecture details, and how to add a new MCP tool.

Donate

If Oculo saves you time, you can support development — BTC: 12yRGpUfFznzZoz4yVfZKRxLSkAwbanw2B

License

MIT © 2026 Salakhitdinov Khidayotullo


Built by Salakhitdinov Khidayotullo · getoculo.com

Source: README.md at commit 97c7239

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.4.1LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts