Secure Browser MCP
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., "@Secure Browser MCPnavigate to https://github.com and get the page text"
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.
Secure Browser MCP
An MCP server that gives an AI client (Claude, etc.) controlled access to a real headless browser on your server — with domain allowlisting, SSRF protection, per-session isolation, an audit log, and cookies/state that survive restarts.
Why "secure" specifically
Browser-automation MCPs are risky by default because the LLM effectively gets a pair of hands on a live browser that can reach anywhere on the internet (and, if misconfigured, your internal network). This server closes the common holes:
Risk | Mitigation |
SSRF (browser tricked into hitting internal services / cloud metadata endpoint) |
|
DNS rebinding (domain allowlisted, but later resolves to an internal IP) | DNS is re-resolved and IP-checked on every navigation, not cached |
| Scheme is rejected before anything touches the browser |
Unrestricted destinations | Hard allowlist via |
Unauthenticated access to the MCP endpoint | Bearer token required on every request ( |
Session/cookie leakage across tasks | Each |
Resource exhaustion |
|
Silent/undetectable misuse | Every tool call is written to a SQLite |
Oversized responses blowing up context | Text and screenshot payloads are size-capped |
Drive-by downloads |
|
This covers the common attack surface, but you're still exposing a browser to
an LLM. Keep ALLOWED_DOMAINS as narrow as your task allows, and run this on
a host/container with no access to anything sensitive — treat it like you
would a CI runner that executes untrusted code.
Related MCP server: mcp-browser-server
Persistent storage — what's actually persisted
Two things, both in SQLite at ./data/browser-mcp.db (path configurable via
DATA_DIR):
Browser state — cookies + localStorage per session, captured via Playwright's
storageState()and restored on the nextbrowser_navigatecall for thatsessionId. This is what lets a session stay logged in to a site across server restarts. Callbrowser_persist_sessionto save explicitly, orbrowser_close_session(which persists automatically).Audit log — every tool invocation, its params, and outcome, so you can review what the browser actually did later (
browser_audit_log).
If you'd rather keep this in Supabase instead of local SQLite (e.g. so
multiple server instances share state), swap storage.ts for Supabase calls
— the function signatures are small and self-contained, so it's a drop-in
replacement.
Setup
npm install
npx playwright install --with-deps chromium # downloads the browser binary
cp .env.example .env
# edit .env: set MCP_AUTH_TOKEN and ALLOWED_DOMAINS
npm run build
npm startFor local iteration without building: npm run dev.
The server listens on POST http://localhost:8787/mcp (Streamable HTTP
transport). Point your MCP client at that URL with:
Authorization: Bearer <your MCP_AUTH_TOKEN>Tools exposed
browser_navigate(sessionId, url)— allowlist + SSRF-checked navigationbrowser_get_text(sessionId, selector?)— read page/element textbrowser_click(sessionId, selector)browser_type(sessionId, selector, text)browser_screenshot(sessionId)— base64 PNGbrowser_persist_session(sessionId)— force-save cookies/localStoragebrowser_close_session(sessionId)— persist + free browser resourcesbrowser_list_sessions()browser_audit_log(sessionId, limit?)
sessionId is any string you choose (e.g. "pranav-github-login") — reuse
the same one to keep continuity (logged-in state, cookies) across calls.
Deploying on your existing server
Render: same pattern you used for the MongoDB MCP — set env vars in the dashboard (don't bake
MCP_AUTH_TOKENinto the image), expose port8787, and set the health check toGET /mcpreturning 401 (expected, since it's unauthenticated) rather than a 200.Put this behind HTTPS (Render/most PaaS do this for you) — the bearer token is meaningless over plain HTTP.
If the server also hosts other things, run this in its own container so the idle-session reaper and
MAX_SESSIONScap actually bound its resource use independently.
Extending
To let the LLM choose domains dynamically instead of a static allowlist, add an approval step (return a tool result asking for confirmation) rather than opening
ALLOWED_DOMAINSwide.To persist to Supabase instead of SQLite, replace the functions in
src/storage.ts; the audit log schema maps directly to a Postgres table.The MCP TypeScript SDK evolves — if
npm installpulls a version with a differentStreamableHTTPServerTransportAPI, check https://github.com/modelcontextprotocol/typescript-sdk for the current signature.
This server cannot be deployed
Maintenance
Related MCP Connectors
A paid remote MCP for AI agent browser MCP session, built to return verdicts, receipts, usage logs,
A paid remote MCP for AI agent browser approval MCP, built to return verdicts, receipts, usage logs,
MCP server for Mint — AI-powered QA that runs your app in a real browser on every PR.
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceAn open-source MCP server that provides browser automation capabilities to external AI systems, enabling navigation, DOM interaction, and web content extraction.20Apache 2.0- AlicenseAqualityDmaintenanceA MCP server that gives AI assistants full browser control, enabling navigation, clicking, form filling, and screenshots via any MCP client.8MIT
- AlicenseBqualityAmaintenanceA headless, agent-controllable real browser as an MCP server that enables AI agents to navigate, click, fill, eval JavaScript, and take screenshots on localhost and allowed hosts, with no GUI required.274MIT
- AlicenseAqualityAmaintenanceAn MCP server that enables AI assistants to visually inspect and interact with rendered web pages via a persistent headless Chromium browser, supporting navigation, screenshots, clicks, viewport resizing, and console log retrieval.81MIT