cloakbrowser-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cloakbrowser-mcp-serverNavigate to example.com and click the login button"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cloakbrowser-mcp-server
Headed wrapper around swimmwatch/cloakbrowser-mcp that exposes the Chromium browser over VNC so a human can watch the same session an MCP client is driving over Streamable HTTP.
The whole project is one Python launcher + one Dockerfile. It starts Xvfb + openbox so Chromium runs headed (required by anti-bot probes that inspect window/widget state), mirrors the display with x11vnc, then execs the upstream cloakbrowser-mcp CLI in Streamable HTTP mode.
Quick start
docker build -t cloakbrowser-mcp-server .
docker run --rm \
-p 3000:3000 \
-e VNC_PASSWORD=changeme \
cloakbrowser-mcp-serverThen:
MCP client — point it at
http://localhost:3000/mcp(any Streamable HTTP MCP client: Claude Desktop viaclaude mcp add --transport http cloakbrowser http://localhost:3000/mcp, Codex CLI, Cursor, etc.)VNC viewer — connect to
localhost:5900, passwordchangeme. macOS built-in:open vnc://localhost:5900. Any VNC client works.
Related MCP server: agent-browser-mcp
Architecture
┌────────────────────────────────────────────┐
│ container │
host ── 3000 ──► │ cloakbrowser-mcp (Streamable HTTP) │
│ └─ Playwright MCP ──► Chromium headed │
host ── 5900 ──► │ Xvfb :99 + openbox ◄── x11vnc mirror │
│ │
│ /data (bind-mounted, persistent profile) │
└────────────────────────────────────────────┘scripts/launcher.py orchestrates the whole thing in one process:
SIGKILL any leftover Chromium from an earlier unclean container death — otherwise it keeps holding the SingletonLock on
/dataand the next run starts with the upstreamUser data directory is already active in this processerror. Then remove any staleSingletonLock/SingletonSocket/SingletonCookiefiles just in case.Xvfb :99at 1920x1080x24openbox(window manager so Chromium honours--start-maximized)x11vncon:5900, password from$VNC_PASSWORDor openexecnode /opt/cloakbrowser-mcp/dist/cli.js --transport streamable-http --http-host 0.0.0.0 --http-port 3000force
PLAYWRIGHT_MCP_HEADLESS=falsein the child env (the wrapper's whole reason to exist)wait for SIGTERM/SIGINT, tear down X + VNC
Configuration
Environment variables (wrapper-specific)
Var | Default | Effect |
| unset | If set, VNC requires this plaintext password. If unset, VNC is unauthenticated ( |
|
| If |
Any PLAYWRIGHT_MCP_* and CLOAK_PLAYWRIGHT_MCP_* variable is forwarded to the upstream cloakbrowser-mcp CLI untouched. See Configuration in the upstream docs for the full list. The wrapper only overrides:
PLAYWRIGHT_MCP_HEADLESS=false(always)--transport streamable-http --http-host 0.0.0.0 --http-port 3000(always)
MCP auth, persistent profiles, Chrome extensions, regional proxies, humanized input — all configured via upstream env vars.
Hardcoded (cannot be changed via env)
Thing | Value | Reason |
MCP transport |
| The wrapper exists to expose the MCP server over HTTP, not stdio. |
MCP HTTP host |
| Containerised; operator maps ports on |
MCP HTTP port |
| Same. |
MCP endpoint |
| Upstream default. |
Display |
| Xvfb + WM + Chromium all agree. |
VNC port |
| Operator maps with |
Volume
Bind-mount /data to persist Chromium's profile across container runs:
docker run --rm \
-p 3000:3000 -p 5900:5900 \
-v ~/cloak-mcp-data:/data \
-e VNC_PASSWORD=changeme \
cloakbrowser-mcp-serverWithout the mount, /data lives inside the container and is lost on docker rm.
Port mapping
The internal MCP port is always 3000 and the internal VNC port is always 5900, regardless of what you map them to on the host:
# default: same ports on host and container
-p 3000:3000 -p 5900:5900
# remap both
-p 8080:3000 -p 5999:5900Project layout
cloakbrowser-mcp-server/
├── Dockerfile # FROM swimmwatch/cloakbrowser-mcp:latest + X stack
├── README.md
├── pyproject.toml # ruff config (lint + format)
├── scripts/
│ └── launcher.py # single-file orchestrator
└── tests/
└── test_launcher.py # stdlib unittest, no test framework dependencyNo build system, no CI — keep it boring.
Lint & test
ruff check . # lint
ruff format --check . # format check
ruff format . # format fix
python3 -m unittest discover -s tests -v # 12 unit tests, stdlib only
docker build -t cloakbrowser-mcp-server . # full image build (~30s with cached base)License
Inherits MIT from cloakbrowser-mcp.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server to assist with JxBrowser development.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Host your MCP tool over streamable HTTP in one command.
Remote MCP server exposing SMI Aware tools, resources, and skills over Streamable HTTP.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables remote desktop control with screen capture and mouse/keyboard simulation through an MCP server exposed via a WebSocket tunnel.-
- AlicenseBqualityAmaintenanceMCP server that drives your real Chrome/Edge/Opera browser through a Chrome extension and DevTools Protocol, preserving logins and session state, and can also perform OS-level mouse and keyboard input behind approval.552MIT

BrowserAgentofficial
AlicenseNot gradedqualityAmaintenanceMCP server for Puppeteer-based browser automation with a unified observe (a11y snapshot + pixel overlay), diff engine, event layer, and action primitives.792 npmApache 2.0- AlicenseBqualityBmaintenanceEnables low-latency, structured browser automation through a local MCP server, supporting safe navigation, observation, table extraction, and verified clicks on Windows with a dedicated Edge profile.14Apache 2.0