playwright_mcp is a free, open source data extraction & web scraping project written in Python and released under MIT. It has 865 GitHub stars, 115 forks and 6 open issues, and was last pushed 29 hours ago. On this registry it ranks #130 of 155 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available.

What is playwright_mcp?

Invisible Playwright MCP is a Python, MIT-licensed Model Context Protocol server that gives developers and their AI assistants an anti-detect stealth Firefox browser, so agents can browse, scrape and perform computer-use tasks without being stopped by anti-bot checks and captchas.

What it is

Invisible Playwright MCP runs as a Playwright MCP server in an AI assistant's toolchain. It is distributed as a Claude Code plugin, a Codex plugin and a Gemini CLI extension, and it ships a standalone local web UI with chat on the left and a live browser on the right. The engine is an anti-detect stealth Firefox build; the project is Python under the MIT licence.

AI browser agents get captchas and are visible to anti-bot systems; the README says other agents get captchas, while this one is invisible to anti-bots. It serves tasks that need a real browser rather than an API and a person's judgement about the page, and it replaces the captcha-prone browser agent an assistant would otherwise drive through MCP.

Key capabilities

  • It installs into Claude Code with claude plugin marketplace add oss-invisible/playwright_mcp and claude plugin install invisible-playwright-mcp@oss-invisible, into Codex with matching codex plugin commands, and into Gemini CLI with gemini extensions install https://github.com/oss-invisible/playwright_mcp.
  • The standalone web UI runs at http://127.0.0.1:8765 with chat on the left and the live browser on the right, driven by an OpenRouter key.
  • The engine is pinned: --binary accepts an existing stealth Firefox build only if it matches the seal, otherwise startup refuses; this skips the download, not the version check.
  • A --seed integer gives the same browser identity every run, and --profile-dir keeps a profile so logins and cookies survive restarts.
  • --proxy accepts http://user:pass@proxy.example.com:8080 or socks5://proxy.example.com:1080, requires host and port, and makes timezone, locale and egress follow the proxy.
  • --model accepts an OpenRouter model id or INVISIBLE_MCP_MODEL and defaults to z-ai/glm-5.3-flash.
  • A .env beside the command is read at startup with precedence --flag over environment over .env over default; it reads only the current directory and names applied variables without printing values.

Who uses it and how

  • Developers inside Claude Code, Codex or Gemini CLI can add the project as a plugin or extension and let the assistant operate the stealth browser over MCP.
  • A single local operator can run the standalone UI with an OpenRouter key, watch the live browser beside the chat, and keep it bound to 127.0.0.1:8765.
  • Job-search and job-hunting workflows are listed as topics; the README's example is a one-way Milan-to-Lisbon economy fare search, checking every date from the 12th to the 16th of next month by clicking calendar days and reading the cheapest fare without guessing.
  • Operators needing repeatable runs can fix identity with --seed, preserve logins with --profile-dir, and route timezone, locale and egress through --proxy.

Getting started

Install uv, then run uvx invisible-playwright-mcp ui --openrouter-key sk-or-... and open http://127.0.0.1:8765; the README also gives plugin installs for Claude Code, Codex and Gemini CLI.

How it compares

It fits among the browser-use, Operator-style and computer-use agents compared in its wiki, and the README references OpenAI Operator. Its distinction is the anti-detect stealth Firefox engine and MCP plugin packaging.

When to use it — and when not to

Choose it when a task needs a real browser—calendar widgets, fare checks, logins that survive restarts—and a local, single-user OpenRouter setup is acceptable. A self-hoster must install uv, supply an OpenRouter key, and keep a stealth Firefox binary matching the pinned build; the web UI has no authentication, changing --host exposes it, and passing --openrouter-key puts the key in shell history and on Linux in the process list. It is a poor fit for teams needing an authenticated multi-user hosted service, or anyone unwilling to run a local binary and manage the key and proxy.

project readme (upstream, from github) — read inline
invisible_playwright_mcp, a browser agent anti-bots cannot see. An animation: asked in Claude Code for the cheapest fare on five dates, it opens its Firefox, clicks each day, reads every fare and answers; or it runs on its own with a web UI.

Other AI browser agents get captchas.
This one is invisible to anti-bots.


Two ways to use this browser agent

1. From your assistant, over MCP

Windows, in PowerShell:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"

Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env

Then install it in your assistant.

Claude Code:

claude plugin marketplace add oss-invisible/playwright_mcp
claude plugin install invisible-playwright-mcp@oss-invisible

Codex:

codex plugin marketplace add oss-invisible/playwright_mcp
codex plugin add invisible-playwright-mcp@oss-invisible

Gemini CLI:

gemini extensions install https://github.com/oss-invisible/playwright_mcp

2. Standalone: the web UI

We bring the interface, you bring an OpenRouter key. Chat on the left, the live browser on the right.

Windows, in PowerShell:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
uvx invisible-playwright-mcp ui --openrouter-key sk-or-...

Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uvx invisible-playwright-mcp ui --openrouter-key sk-or-...

Then open http://127.0.0.1:8765 and type the same thing.


What to ask a web browsing agent

Anything that needs real web automation: a browser rather than an API, and a person's judgement about what is on the page.

Go to ``. One way, Milan to Lisbon, economy, one checked bag, one adult. Check every date from the 12th to the 16th of next month, one at a time, and read the cheapest fare for each day. The date field is a calendar widget, so click the days rather than typing them. If a date has no availability, say so. Do not guess a number.

It drives the page the way a person would: the pointer moves, keys are pressed.

Options: proxy, profile, seed

  • --openrouter-key Your key, or the OPENROUTER_API_KEY variable.
  • --model An OpenRouter model id, or INVISIBLE_MCP_MODEL. Defaults to z-ai/glm-5.3-flash.
  • --proxy Optional. http://user:pass@proxy.example.com:8080 or socks5://proxy.example.com:1080. Host and port are both required. The timezone, locale and egress follow it.
  • --binary An engine binary you already have. It must be the build the seal pins, or startup refuses: this skips the download, not the version check.
  • --seed An integer. Same seed, same browser identity, every run.
  • --profile-dir A directory to keep the profile in, so logins and cookies survive restarts.
  • --headed Show the browser window. The interface shows you the page anyway.
  • --host, --port 127.0.0.1 and 8765. Changing the host exposes an interface that has no authentication.

A .env beside the command

Rather than retyping the key and the binary path, put them in a .env in the directory you run from:

OPENROUTER_API_KEY=sk-or-...
STEALTHFOX_BINARY=/path/to/firefox

It is read at startup, and on the way in it never overrides something already set, so the order is --flag > the environment > .env > the default. Only the directory you are in is read - there is no search upwards, so running from a subfolder cannot silently pick up a different key. The startup line names the variables it applied and never prints their values.

Passing --openrouter-key puts the key in your shell history, and on Linux in the process list. OPENROUTER_API_KEY in the environment or in a .env avoids both.

The wiki: AI browser-agent guides

The reading room around the agent lives in the wiki: the AI browser-agent landscape: browser-use, Operator-style and computer-use agents compared, what to check when an agent gets blocked, and what happened to OpenAI Operator, among others. Worked examples, transcripts and their outputs live in articles/.

The rest of the family: engine, core

The MCP server from option 1 ships inside this package: invisible_playwright_mcp with no subcommand is the server, invisible-playwright-mcp ui the interface. Its config blocks for clients that take a file, its settings and its tools are on the wiki page The MCP server.

  • invisible_playwright The engine, as a Python library, for writing code instead of prompts. The API is Playwright's.
  • invisible_core Seed to fingerprint to preferences, proxy and geolocation.

Using it responsibly

This automates a browser under your control. Read the terms of the sites you point it at, respect their rate limits, and do not submit anything a human has not read.

Privacy Policy

This browser agent runs on your machine and has no server of its own. What leaves your computer, and to whom:

  • The sites you visit see the browser, as they would any Firefox.
  • Your model provider. The web UI sends the conversation and what the agent reads on the page to OpenRouter under your key. Over MCP, the client you plugged it into does the same with whichever model it uses.
  • GitHub. The engine is downloaded from a GitHub release the first time the server or the interface starts, and a GeoIP database is when a proxy is set. Each browser launch also fetches a one-line counter file from a GitHub release, which is how launches are counted: the request carries no identifier and nothing of yours, and GitHub sees what any HTTPS request shows, your IP address.

Nothing else is collected and nothing is sent to the author. Sessions, profiles and screenshots are stored locally, under INVISIBLE_MCP_HOME if set and otherwise in the application-data directory of your system, and are yours to delete; nothing is retained anywhere else. Questions go to the issues.

License

MIT. Everything distributed before 2 September 2026 was released under AGPL-3.0 and stays under it.

Frequently asked questions

Is playwright_mcp free to use?

playwright_mcp is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does playwright_mcp do?

invisible playwright mcp: Playwright MCP server undetected by anti-bots and captchas: AI agent browses the web on anti-detect stealth Firefox, Python, undetecte

What is playwright_mcp written in?

playwright_mcp is primarily written in Python. Its source is publicly available at https://github.com/oss-invisible/playwright_mcp, and it has 865 GitHub stars.