Local-first AI browser agent and MCP server for Chrome — runs on Ollama or any cloud model. Open-source alternative to OpenAI Operator.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http
verified
reported
listed in the official MCP registry counts 10 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
browser_click
-
browser_extract
-
browser_navigate
-
browser_press
-
browser_screenshot
-
browser_scroll
-
browser_snapshot
-
browser_solve_captcha
-
browser_type
-
weboperator_execute_goal
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit a92ed89 · analyzer v33 · 2d ago
skills & prompt files 1
danger signals1
- over-broad OAuth scope https://mail.google.com/ KazKozDev-WebOperator-a92ed89/core/src/lib/page-state.test.ts :7
url: 'https://mail.google.com/mail/u/0/#search/newer_than%3A3d',
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 130
filesystem 7
- fs (weak) KazKozDev-WebOperator-a92ed89/core/vite.config.ts :5
import fs from 'node:fs'; - fs (weak) KazKozDev-WebOperator-a92ed89/scripts/changelog-section.mjs :4
import { readFile } from 'node:fs/promises'; - fs (weak) KazKozDev-WebOperator-a92ed89/scripts/eval-extension.mjs :3
import { readFile, mkdir, rm, writeFile } from 'node:fs/promises'; - fs (weak) KazKozDev-WebOperator-a92ed89/scripts/eval-fixtures.mjs :2
import { readFile } from 'node:fs/promises'; - fs (weak) KazKozDev-WebOperator-a92ed89/scripts/eval-repeat.mjs :2
import { mkdir, readFile, stat, writeFile } from 'node:fs/promises'; - fs (weak) KazKozDev-WebOperator-a92ed89/scripts/fetch-assistantbench.mjs :8
import { writeFile, mkdir } from 'node:fs/promises'; - fs KazKozDev-WebOperator-a92ed89/weboperator-bridge/bridge.js :6
const fs = require('fs');
shell / exec 3
- shell (weak) KazKozDev-WebOperator-a92ed89/scripts/bridge-smoke.mjs :4
import { spawn } from 'node:child_process'; - shell (weak) KazKozDev-WebOperator-a92ed89/scripts/eval-extension.mjs :8
import { spawn } from 'node:child_process'; - shell (weak) KazKozDev-WebOperator-a92ed89/scripts/eval-repeat.mjs :6
import { spawn } from 'node:child_process';
network 13
- net KazKozDev-WebOperator-a92ed89/core/src/lib/anthropic-client.ts :119
const res = await fetch('https://api.anthropic.com/v1/messages', { - net KazKozDev-WebOperator-a92ed89/core/src/lib/captcha-solver.ts :1735
const res = await fetch('https://api.openai.com/v1/audio/transcriptions', { - net KazKozDev-WebOperator-a92ed89/core/src/lib/deepseek-client.ts :60
const res = await fetch('https://api.deepseek.com/chat/completions', { - net KazKozDev-WebOperator-a92ed89/core/src/lib/file-reader.ts :92
const res = await fetch(target.url); - net KazKozDev-WebOperator-a92ed89/core/src/lib/http-retry.ts :38
const res = await fetch(input, { ...init, signal }); - net KazKozDev-WebOperator-a92ed89/core/src/lib/ollama-client.ts :121
const send = (thinking: boolean, withImages: boolean) => fetch(`${targetUrl}/api/chat`, { - net KazKozDev-WebOperator-a92ed89/core/src/lib/screenshot.ts :15
const blob = await (await fetch(dataUrl)).blob(); - net (weak) KazKozDev-WebOperator-a92ed89/scripts/bridge-smoke.mjs :5
import net from 'node:net'; - net (weak) KazKozDev-WebOperator-a92ed89/scripts/eval-extension.mjs :2
import { createServer } from 'node:http'; - net (weak) KazKozDev-WebOperator-a92ed89/scripts/fetch-assistantbench.mjs :19
const res = await fetch(SOURCE); - net KazKozDev-WebOperator-a92ed89/weboperator-bridge/agent-client.js :3
const net = require('net'); - net KazKozDev-WebOperator-a92ed89/weboperator-bridge/bridge.js :3
const http = require('http');
show 1 more
- net KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :8
const net = require('net');
secrets 4
- secrets (weak) KazKozDev-WebOperator-a92ed89/scripts/eval-extension.mjs :573
const apiKey = args.apiKey ?? process.env.WEBOPERATOR_API_KEY; - secrets KazKozDev-WebOperator-a92ed89/weboperator-bridge/agent-client.js :7
const token = process.env.WEBOPERATOR_API_TOKEN || ''; - secrets KazKozDev-WebOperator-a92ed89/weboperator-bridge/bridge.js :11
const API_TOKEN = process.env.WEBOPERATOR_API_TOKEN || ''; - secrets KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :18
const API_TOKEN = process.env.WEBOPERATOR_API_TOKEN || '';
tool registrations 10
- browser_snapshot KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :30
- browser_navigate KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :39
- browser_click KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :54
- browser_type KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :72
- browser_press KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :99
- browser_scroll KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :114
- browser_screenshot KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :133
- browser_extract KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :142
- browser_solve_captcha KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :160
- weboperator_execute_goal KazKozDev-WebOperator-a92ed89/weboperator-bridge/mcp-server.js :175
declared dependencies 22
- @huggingface/transformers@^4.2.0
- dexie@^4.4.5
- pdfmake@^0.3.11
- react@^19.2.8
- react-dom@^19.2.8
- @crxjs/vite-plugin@^2.7.1
- @eslint/js@^10.0.1
- @types/chrome@^0.2.7
- @types/pdfmake@^0.3.3
- @types/react@^19.2.18
- @types/react-dom@^19.2.5
- @vitejs/plugin-react@^6.1.1
show 10 more
- @vitest/coverage-v8@^4.1.11
- eslint@^10.9.1
- eslint-plugin-react-hooks@^7.1.1
- globals@^17.11.0
- knip@^6.33.0
- playwright@^1.62.1
- typescript@^5.5.3
- typescript-eslint@^8.68.0
- vite@^8.2.2
- vitest@^4.1.5