Operate your real Chrome browser in a humanized way from Cursor: natural mouse paths, typing cadence, and scroll pauses — so everyday tasks feel like a person, not a bot.
User (Cursor Agent)
→ MCP stdio (packages/mcp-server)
→ WebSocket 127.0.0.1:19501
→ Chrome extension (packages/extension)
→ Humanized click / type / scroll / navigate
| Layer | Role |
|---|---|
| Cursor Agent | Plans the task and calls tools |
| MCP server | Tool surface, pairing token, localhost WS hub |
| Chrome extension | Snapshot + humanized execution on your tabs |
We do not rebuild a daily LLM agent loop — Cursor is the brain. This repo is the hand.
- Node.js 20+
- pnpm 9+ (
npm install -g pnpm) - Google Chrome (or Chromium)
- Cursor with Agent / MCP enabled
pnpm install
pnpm build- Open
chrome://extensions - Enable Developer mode
- Load unpacked → select
packages/extension/dist - Keep the extension enabled
When Cursor starts the MCP server it writes:
~/.humanized-browser/credentials.json—{ token, port }- Token also printed on stderr of the MCP process
Open the Humanized Browser popup → paste token → set port (default 19501) → Connect.
Badge shows ON when connected.
Project config is already at .cursor/mcp.json (absolute path to the built MCP entry). After pnpm build, reload MCP in Cursor (Settings → MCP), or restart Cursor.
If you move the repo, update the args path in .cursor/mcp.json accordingly.
| Tool | Purpose |
|---|---|
browser_status |
Extension online? |
tabs_list |
List tabs |
navigate |
Open URL (humanized pause after load) |
snapshot |
Compressed page tree + refs |
click |
Bezier mouse path + jitter |
type |
Variable key delays |
scroll |
Humanized scroll / scroll-into-view |
wait |
Delay or wait for selector/ref |
screenshot |
Viewport capture (prefer snapshot for actions) |
Use humanized-browser tools: open https://example.com, snapshot the page, and click the “More information…” link if present.
Humanized timing is on by default. Popup Fast mode skips delays for debugging only — do not use it for real sites you care about.
- WebSocket hub binds to 127.0.0.1 only
- Extension must present the pairing token
- No remote browser control in this MVP
packages/shared— protocol + humanize helperspackages/mcp-server— MCP stdio + WS hubpackages/extension— MV3 execution plane
pnpm buildsucceeds- Extension loads from
packages/extension/distwithout errors - Cursor MCP shows
humanized-browserconnected - Popup Connect → status
connected/ badgeON - In Agent: call
browser_status→ connected navigate→snapshot→click/typewith visible humanized motion
- Cursor SDK headless runner
- Native Messaging instead of WS
- Domain allowlists / recording