Two things separate it from a scripted headless browser. Several isolated instances run at once with different device profiles, so "test the signup on three phones and a desktop" is one instruction rather than four runs. And the input path is deliberate — one device-appropriate event per tap instead of both touch and mouse, trusted keystrokes so autocomplete and masks behave, key codes following the emulated layout. `gdd_get_manual` is the tell: the agent reads the manual itself rather than you pasting usage into the prompt.
A local browser farm exposed over MCP. Ask for three iPhones and a desktop and you get four isolated Chromium instances, each with its own profile, cookies, device emulation, geolocation and network conditions, all addressable by player number from the same conversation. The headless server is the MCP backend; a separate desktop app adds a live grid of thumbnails you can click into and take over by hand.
- N browsers added with a device preset, removed individually, and listed with their current state — `gdd_add_players`, `gdd_remove_player`, `gdd_list_windows`
- Navigation with a real wait rather than a sleep — `gdd_navigate`, `gdd_wait`, `gdd_reload`, `gdd_back`, `gdd_forward`
- Input that behaves like a person's: a single device-appropriate event per tap, trusted keystrokes through CDP so masks and maxlength behave normally, physical key codes following the emulated layout, and an optional humanised cursor path — `gdd_tap`, `gdd_type`, `gdd_press`, `gdd_hover`, `gdd_swipe`, `gdd_drag`, `gdd_scroll`, `gdd_select`, `gdd_dialog`
- Content read back and screenshots captured at CSS pixel resolution — `gdd_read`, `gdd_read_all`, `gdd_screenshot`
- Emulation changed at runtime: device preset, viewport, geolocation with timezone and locale, network conditions, language, and response headers — including stripping X-Frame-Options and CSP to allow framing — `gdd_set_device`, `gdd_set_viewport`, `gdd_set_location`, `gdd_set_network`, `gdd_set_language`, `gdd_set_headers`
- Diagnostics per browser: state, console output with uncaught exceptions, network requests with timing and status, push notifications, and performance metrics — `gdd_get_state`, `gdd_get_console`, `gdd_get_network`, `gdd_get_notifications`, `gdd_get_performance`, `gdd_clear_logs`
- Auto-registration and login with generated credentials, and arbitrary JavaScript execution — `gdd_quick_auth`, `gdd_execute_js`
- Storage and cookies read, written and cleared — `gdd_storage`, `gdd_cookies`
- The full manual served to the agent so it can teach itself, plus in-place updates — `gdd_get_manual`, `gdd_check_update`, `gdd_update`
Runs on your own machine and needs no account. Download the headless server for Linux, macOS ARM, macOS Intel or Windows, or run `docker run -p 9700:9700 ghcr.io/cap-of-tea/gdd`. Connect over HTTP by adding `{"url": "http://localhost:9700/mcp"}` to `.mcp.json` — no command, no path. Claude Desktop users can open the `.mcpb` file from Releases instead and skip the config entirely. The server runs on port 9700 and the desktop app on 9800, so both can run side by side. The desktop app needs WebView2 on Windows. The licence is free for personal use.
Build from source — clone the repository and build it, then point your client at the binary
