New in 0.5.0: credentials with 2FA

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.

Download for macOS

Free · Pudu 0.5.0 · 1.3 MB · macOS 26 or later

Then add it to your agent's .mcp.json ↓
github.com/search?q=mcp+server&type=repositories&s=stars&o=desc
  1. navigatehttps://github.com2.76s
  2. clicke90.69s
  3. fille113 "mcp server"0.51s
  4. presse113 Enter1.65s
  5. clicke1660.40s
  6. clicke2371.44s

Returned4,593 characters

Navigated to a new page.

Elements (28 of 127, those on screen, without 35 the page before had too…):

[e267] button "Sort by: Most stars"

[e274] link "headroomlabs-ai/headroom" -> /headroomlabs-ai/headroom

Against Playwright MCP Pudu Playwright

Calls
6
10
Seconds
16.9
22.4
Characters read
15.7k
162.2k
mcp server
  • Explore GitHub Actions
  • Explore Blog
  • Explore CI/CD
  • Explore Code review
  • Search syntax tips

Change is constant.

GitHub keeps you ahead.

Enter your emailSign up for GitHub
Sort by: Most stars
  • Best match
  • Most stars
  • Fewest stars
  • Most forks
  • Fewest forks
  • Recently updated
  • Least recently updated
  • 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, and 15.7k characters read. The same task on Playwright MCP took 10 calls, 22.4 s and 162.2k characters.

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.

Steps, six sites
Pudu42
Playwright MCP72
Time, seconds, six sites
Pudu149.9
Playwright MCP221.5
Input tokens, six sites
Pudu433k
Playwright MCP1.38M
  • Pudu
  • Playwright MCP

Steps

Airbnb
6
11
Kayak
10
23
Booking
12
15
MercadoLibre
5
8
GitHub
6
10
YouTube
3
5

Time, seconds

Airbnb
24.0
32.9
Kayak
43.8
69.8
Booking
28.5
48.7
MercadoLibre
24.5
31.2
GitHub
15.5
21.4
YouTube
13.5
17.5

Input tokens

Airbnb
58k
290k
Kayak
112k
644k
Booking
131k
201k
MercadoLibre
60k
85k
GitHub
48k
108k
YouTube
25k
56k

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
SiteBrowserStepsTime, secondsInput tokens
AirbnbPudu6 4 to 824.0 22.2 to 28.158k 42k to 70k
Playwright MCP11 11 to 1132.9 30.3 to 38.8290k 262k to 291k
KayakPudu10 9 to 1343.8 41.9 to 52.9112k 84k to 153k
Playwright MCP23 22 to 2569.8 63.0 to 69.9644k 554k to 646k
BookingPudu12 11 to 1228.5 26.8 to 28.7131k 111k to 133k
Playwright MCP15 14 to 1848.7 43.7 to 52.2201k 199k to 343k
MercadoLibrePudu5 5 to 624.5 23.1 to 26.860k 59k to 78k
Playwright MCP8 8 to 1031.2 29.4 to 32.285k 84k to 185k
GitHubPudu6 6 to 615.5 15.3 to 16.948k 48k to 54k
Playwright MCP10 10 to 1021.4 20.9 to 22.4108k 108k to 108k
YouTubePudu3 3 to 313.5 12.4 to 14.525k 24k to 25k
Playwright MCP5 5 to 517.5 16.8 to 20.856k 55k to 66k

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.

Profiles
  • 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.

The same variable, asked for on two sites

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.

zsh
$ 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.

Download for macOS

Free · Pudu 0.5.0 · 1.3 MB · macOS 26 or later

.mcp.json
{
  "mcpServers": {
    "pudu": {
      "command": "/Applications/Pudu.app/Contents/MacOS/Pudu"
    }
  }
}

Recently shipped

  1. 0.5.0 2026-10-17

    • Credentials: a user, a password and an optional 2FA key for one or more sites, kept in the keychain.
    • fill types ${name.user}, ${name.password} and ${name.otp}, the six-digit code valid when it is typed.
    • list_profiles shows which credentials each profile uses, and never a value.
    • Launched by an agent, the app shows no window and stays out of the Dock until the first command.
    • A profiles file that cannot be read is no longer overwritten by an empty list.
    • A click, fill or press that times out warns that it may still reach the page.
  2. 0.4.0 2026-10-15

    • network: the fetch and XHR requests the page made, with their status and how long they took.
    • An action says which of the page's requests failed while it ran.
    • wait_for checks a request's status, where the page landed, that something is gone and that the console has no errors; flows replay those checks.
    • repair_flow gives one step of a saved flow a new element, without running it.
    • navigate to a file saves it in the session's download folder.
    • A page that never stops loading no longer holds a command to its 60 s limit.
  3. 0.3.0 2026-10-14

    • The window is in English and Spanish, following the system language.
    • Safari's Web Inspector opens on the page the agent is driving.
    • Development servers on localhost load over https with their own certificate.
    • A dialog or notice covering the page is named, with the controls that close it.
    • Sign-ins by HTTP Basic or Digest use the site's HTTP_USER and HTTP_PASSWORD.
    • Navigations and actions return sooner: a change below the fold no longer holds them.
  4. 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.
  5. 0.1.0 2026-10-12

    • First release: the window, the MCP server, flows, profiles and the pudu command.

Let your agent open your app

Download for macOS

Free · Pudu 0.5.0 · 1.3 MB · macOS 26 or later