A browser made for agents
Your coding agent opens your web app in Pudu, signs in, clicks through it and tells you what broke. You watch it happen, and take over at any moment.
Log
On github.com, search for repositories about mcp server and sort them by most stars. Read the first three.
- navigatehttps://github.com2.76s
- clicke90.69s
- fille113 "mcp server"0.51s
- presse113 Enter1.65s
- clicke1660.40s
- clicke2371.44s
✓ 6 calls, 16.9 s
- punkpeye/awesome-mcp-servers★ 96,133
- headroomlabs-ai/headroom★ 75,060
- zylon-ai/private-gpt★ 57,564
A logged run from the measurements: 6 calls in 16.9 s, 7.4 s of it the page. The same task on Playwright MCP took 10 calls and 22.4 s.
Browsers were made for people. Agents use them differently.
- 01
An agent that reads the whole page at every step pays for it in tokens and in steps.
Pudu tells it only what changed.
- 02
An agent in a browser that holds your sessions can reach your accounts.
Pudu starts on a profile that keeps nothing.
- 03
A test the agent already did costs a model again every time it is repeated.
Pudu replays it without one.
Fast and light
Fewer steps, less time, fewer tokens
Each action tells the agent only what changed on the page, so it reads less and decides sooner. Against Playwright MCP, on six public sites, Pudu took fewer steps, less time and fewer input tokens on all six. It cost less on three, about the same on two and more on MercadoLibre.
- Steps, six sites
- 42
- Playwright MCP: 72
- Time, seconds, six sites
- 149.9
- Playwright MCP: 221.5
- Input tokens, six sites
- 433k
- Playwright MCP: 1385k
- Cost, US dollars, six sites
- 0.65
- Playwright MCP: 1.06
- Pudu
- Playwright MCP
Steps
- Airbnb
- 611
- Kayak
- 1023
- Booking
- 1215
- MercadoLibre
- 58
- GitHub
- 610
- YouTube
- 35
Time, seconds
- Airbnb
- 24.032.9
- Kayak
- 43.869.8
- Booking
- 28.548.7
- MercadoLibre
- 24.531.2
- GitHub
- 15.521.4
- YouTube
- 13.517.5
Input tokens
- Airbnb
- 58k290k
- Kayak
- 112k644k
- Booking
- 131k201k
- MercadoLibre
- 60k85k
- GitHub
- 48k108k
- YouTube
- 25k56k
Cost, US dollars
- Airbnb
- 0.090.26
- Kayak
- 0.140.41
- Booking
- 0.160.16
- MercadoLibre
- 0.120.07
- GitHub
- 0.080.07
- YouTube
- 0.050.08
The sums are of each site's median. Medians of three runs per site, as of 2026-10-11. Each run is Claude Code on Opus given one task and one browser, Pudu or @playwright/mcp@0.0.83, with no window. Three runs are few: a small difference between two bars says nothing.
The table, with the lowest and highest run
| Site | Browser | Steps | Time, seconds | Input tokens | Cost, US dollars |
|---|---|---|---|---|---|
| Airbnb | Pudu | 6 4 to 8 | 24.0 22.2 to 28.1 | 58k 42k to 70k | 0.09 0.09 to 0.10 |
| Playwright MCP | 11 11 to 11 | 32.9 30.3 to 38.8 | 290k 262k to 291k | 0.26 0.26 to 0.30 | |
| Kayak | Pudu | 10 9 to 13 | 43.8 41.9 to 52.9 | 112k 84k to 153k | 0.14 0.13 to 0.23 |
| Playwright MCP | 23 22 to 25 | 69.8 63.0 to 69.9 | 644k 554k to 646k | 0.41 0.39 to 0.44 | |
| Booking | Pudu | 12 11 to 12 | 28.5 26.8 to 28.7 | 131k 111k to 133k | 0.16 0.15 to 0.17 |
| Playwright MCP | 15 14 to 18 | 48.7 43.7 to 52.2 | 201k 199k to 343k | 0.16 0.15 to 0.27 | |
| MercadoLibre | Pudu | 5 5 to 6 | 24.5 23.1 to 26.8 | 60k 59k to 78k | 0.12 0.12 to 0.13 |
| Playwright MCP | 8 8 to 10 | 31.2 29.4 to 32.2 | 85k 84k to 185k | 0.07 0.07 to 0.26 | |
| GitHub | Pudu | 6 6 to 6 | 15.5 15.3 to 16.9 | 48k 48k to 54k | 0.08 0.08 to 0.08 |
| Playwright MCP | 10 10 to 10 | 21.4 20.9 to 22.4 | 108k 108k to 108k | 0.07 0.07 to 0.08 | |
| YouTube | Pudu | 3 3 to 3 | 13.5 12.4 to 14.5 | 25k 24k to 25k | 0.05 0.05 to 0.05 |
| Playwright MCP | 5 5 to 5 | 17.5 16.8 to 20.8 | 56k 55k to 66k | 0.08 0.07 to 0.16 |
Isolated
Each profile keeps its own sessions
A profile is a name with its own cookies, logins and storage, kept between runs, so the same test runs as different users of your app. The temporary profile keeps nothing, and it is the one a first launch uses.
An agent can switch to any saved profile without asking. Keep your real accounts out of the profiles you give it.
- temporarykeeps nothing, has no variablesin use
- adminapp.example.com · ${EMAIL} ${PASSWORD}
- customerapp.example.com · ${EMAIL} ${PASSWORD}
- signed-outno variables
+ new profile: name and return
Careful with credentials
Passwords stay in the keychain
A profile holds values such as an email and a password. They are stored in the keychain, each tied to a site, and typed only on pages of that site: a page elsewhere cannot be handed one.
The agent types a value by its name, and the name is what it gets back. That keeps a password out of the conversation; it does not hide it from an agent that goes looking for it in the page.
You can stop the agent at any moment with ⌘. and take over the page yourself.
app.example.com
fill e12 ${PASSWORD}
Typed. The agent gets back ${PASSWORD}, not the value.
example-login.net
fill e7 ${PASSWORD}
The variable ${PASSWORD} belongs to example.com and this window is on example-login.net, so nothing was typed. A variable is typed only on its own site and that site's subdomains.
Flows
Recorded once, replayed without a model
While the agent drives the page, Pudu records what it does as a flow: one JSON file of steps, each finding its element by role and name. Replaying it needs no model, from the window, from the agent or from a terminal.
It exits with 0 when every step passed and 1 when one did not, so it runs in CI. A replay stops at the first step that fails and keeps a screenshot of it. When a button is renamed, the step can still find it by its CSS selector, and says so.
$ pudu run flow.json --var EMAIL=ana@example.com Flow "Sign in": PASSED (5 of 5 steps passed) ✓ 1. navigate https://app.example.com/login ✓ 2. fill textbox "Email" ✓ 3. fill textbox "Password" ✓ 4. click button "Sign in" (its name changed; found by selector) ✓ 5. waitForText Welcome back $ echo $? 0
Install
Give it to your agent
Pudu is a Model Context Protocol server. Add it to your project's .mcp.json and the agent launches it when it needs a browser; it quits when the agent disconnects.
Opened from Finder, it is just a browser.
{
"mcpServers": {
"pudu": {
"command": "/Applications/Pudu.app/Contents/MacOS/Pudu"
}
}
}Let your agent open your app
Recently shipped
0.2.0 2026-10-13
- hover, for menus and tooltips that open only under the pointer.
- console: what the page wrote to its console and the errors nothing caught.
- A page the server answered with a 4xx or 5xx says so before its content.
- Form fields say what they ask for: required, their type, a dropdown's options.
0.1.0 2026-10-12
- First release: the window, the MCP server, flows, profiles and the pudu command.