Runs a local fleet of isolated Chromium instances that Claude can orchestrate through 36 MCP tools. You get parallel browser control across 22 device profiles (iPhone 15 Pro, Desktop 1080p, etc.), each with separate cookies, console access, and network conditions. The tools cover navigation, element interaction (tap, type, scroll), screenshots, console log extraction, and device emulation. Think testing a responsive signup flow on three phones and a desktop simultaneously, or scraping content that requires different geolocations and user agents. Connects via HTTP on localhost:9700, so it works with Claude Code, Cursor, and VS Code based IDEs. Available as standalone binaries for Linux, macOS, Windows, or a Docker image with Chromium pre installed.
AI-controlled browser farm on your machine
Simulate multiple real users across 22 device types — test your site like it's launch day.
You: Open 3 iPhones and a desktop, navigate to myapp.com, test the signup form on all devices
Claude Code creates 4 browsers with device emulation, navigates each to your app, fills in the form, takes screenshots, checks console for errors — all in parallel.
gdd_add_players(3, device="iPhone 15 Pro") → players [1, 2, 3]
gdd_add_players(1, device="Desktop 1080p") → player [4]
gdd_navigate(1, "https://myapp.com") → all 4 browsers open your app
gdd_tap(1, "#signup-btn") → taps signup on iPhone
gdd_screenshot(1) → captures the result
gdd_get_console(1, level="error") → checks for JS errors
GDD runs N isolated Chromium instances, each with its own profile, cookies, device emulation, geolocation, and network conditions. It exposes 37 MCP tools via HTTP on localhost:9700.
| Platform | Download | Run |
|---|---|---|
| Linux | GDD-Server-Linux.tar.gz | chmod +x GDD.Headless && ./GDD.Headless |
| macOS ARM | GDD-Server-macOS-ARM.tar.gz | bash Scripts/setup-macos.sh && ./GDD.Headless |
| macOS Intel | GDD-Server-macOS-Intel.tar.gz | bash Scripts/setup-macos.sh && ./GDD.Headless |
| Windows | GDD-Server-Windows.zip | .\GDD.Headless.exe |
| Windows GUI | GDD-Desktop-Windows.zip | Extract, run GDD.exe (WebView2 required) |
| Docker | ghcr.io/cap-of-tea/gdd | docker run -p 9700:9700 ghcr.io/cap-of-tea/gdd |
| Claude Desktop | Win / Mac ARM / Mac Intel (.mcpb) | Open .mcpb file — installs as desktop extension |
Self-contained binary, ~70 MB. No .NET installation needed. Chromium downloads automatically on first launch.
One-liner (Linux):
curl -sL https://github.com/Cap-of-tea/GDD/releases/latest/download/GDD-Server-Linux.tar.gz | tar xz && chmod +x GDD.Headless && ./GDD.Headless
# Run (headless, port 9700)
docker run -p 9700:9700 ghcr.io/cap-of-tea/gdd
# Or build locally
docker build -t gdd .
docker run -p 9700:9700 gdd
The Docker image runs in headless mode with all Chromium dependencies pre-installed.
By default, browsers launch in headed mode (visible windows). Add --headless for CI/CD.
Add to .mcp.json and restart your AI client:
{
"mcpServers": {
"gdd": {
"url": "http://localhost:9700/mcp"
}
}
}
That's it. Start GDD, tell Claude or Cursor to test your app.
Claude Desktop users: Download the
.mcpbfile from Releases and open it — GDD installs as a one-click desktop extension. No manual config needed.
| Client | Project config | Global config |
|---|---|---|
| Claude Code | <project>/.mcp.json | ~/.claude/.mcp.json |
| Cursor | <project>/.cursor/mcp.json | ~/.cursor/mcp.json |
| VS Code / Windsurf / Antigravity | <project>/.vscode/mcp.json | IDE settings.json |
Global and project configs are merged — servers from both are available simultaneously. Changes are picked up only when restarting the AI client session.
VS Code-based IDEs use a different config format than Claude Code / Cursor.
Project config — .vscode/mcp.json:
{
"servers": {
"gdd": {
"type": "http",
"url": "http://localhost:9700/mcp"
}
}
}
Global config — open via Cmd+Shift+P → "Open User Settings (JSON)":
{
"mcp": {
"servers": {
"gdd": {
"type": "http",
"url": "http://localhost:9700/mcp"
}
}
}
}
Global settings.json location: macOS — ~/Library/Application Support/<IDE>/User/settings.json, Linux — ~/.config/<IDE>/User/settings.json, Windows — %APPDATA%/<IDE>/User/settings.json. Replace <IDE> with your editor name (Code, Windsurf, Antigravity, etc.).
stdio-proxy alternative (.vscode/mcp.json):
{
"servers": {
"gdd": {
"type": "stdio",
"command": "bash",
"args": ["/absolute/path/to/Scripts/mcp-proxy.sh"]
}
}
}
By default, Claude Code asks for confirmation on every MCP tool call. To allow GDD tools without prompts, add to ~/.claude/settings.json:
{
"permissions": {
"allow": [
"mcp__gdd__*"
]
}
}
This single wildcard covers all 37 GDD tools. Restart Claude Code after editing.
Proxy scripts start GDD automatically when your AI client connects:
Windows:
{
"mcpServers": {
"gdd": {
"command": "powershell",
"args": ["-ExecutionPolicy", "Bypass", "-File", "C:/path/to/Scripts/mcp-proxy.ps1"]
}
}
}
Linux / macOS:
{
"mcpServers": {
"gdd": {
"command": "bash",
"args": ["/path/to/Scripts/mcp-proxy.sh"]
}
}
}
Add "--headless" to the args array for CI/CD.
Tip: On first launch, GDD downloads Chromium (~80 MB). If your AI client times out, run GDD manually first, then reconnect.
macOS (launchd):
bash Scripts/install-launchd.sh # headed (default)
bash Scripts/install-launchd.sh --headless # for CI/CD
Manage: launchctl list | grep gdd / bash Scripts/install-launchd.sh --uninstall
Linux (systemd):
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/gdd.service << 'EOF'
[Unit]
Description=GDD Multi-Browser Testing Server
[Service]
ExecStart=/path/to/GDD.Headless
WorkingDirectory=/path/to/gdd-directory
Restart=on-failure
[Install]
WantedBy=default.target
EOF
systemctl --user daemon-reload
systemctl --user enable --now gdd
curl -X POST http://localhost:9700/mcp -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"gdd_add_players","arguments":{"count":1}}}'
GDD uses standard JSON-RPC 2.0 — works with curl, Python, Node.js, or any HTTP client.
humanize=true moves the mouse along a cubic Bézier curve with natural easing and micro-jitter before clickingghcr.io/cap-of-tea/gdd), listed on the MCP Registry| Tool | Description |
|---|---|
gdd_add_players | Add N browser instances with optional device preset |
gdd_remove_player | Remove a browser instance by player ID |
gdd_list_windows | List all active browsers with current state |
| Tool | Description |
|---|---|
gdd_navigate | Navigate to a URL |
gdd_wait | Wait for a CSS selector to appear (with timeout) |
gdd_reload | Reload page (hard=true bypasses cache) |
gdd_back | Navigate back |
gdd_forward | Navigate forward |
| Tool | Description |
|---|---|
gdd_tap | Tap element by CSS selector or coordinates; dispatches touch + mouse/click events. humanize=true moves mouse along a Bézier curve |
gdd_swipe | Swipe gesture (up/down/left/right) |
gdd_drag | Drag an element to (x, y) or onto another element via real pointer events (drives dnd-kit & HTML5 drag-and-drop) |
gdd_scroll | Scroll page or element |
gdd_type | Type text into input fields |
gdd_hover | Hover over element. humanize=true moves mouse along a Bézier curve |
gdd_select | Select option from <select> dropdown |
gdd_dialog | Handle JS alert/confirm/prompt dialogs |
| Tool | Description |
|---|---|
gdd_read | Read text content of an element |
gdd_read_all | Read text from all matching elements |
gdd_screenshot | Capture JPEG screenshot at CSS pixel resolution |
| Tool | Description |
|---|---|
gdd_set_device | Set device preset (22 devices: phones, tablets, desktops) |
gdd_set_viewport | Set custom viewport dimensions |
gdd_set_location | Set geolocation, timezone, and locale |
gdd_set_network | Set network conditions (4G, 3G, offline) |
gdd_set_language | Set browser language |
| Tool | Description |
|---|---|
gdd_get_state | Browser state: URL, title, device, auth status |
gdd_get_console | Console output and uncaught exceptions |
gdd_get_network | Network requests with timing and status |
gdd_get_notifications | Received push notifications |
gdd_get_performance | Performance metrics (JS heap, DOM nodes, FPS) |
gdd_clear_logs | Clear console and/or network logs |
| Tool | Description |
|---|---|
gdd_quick_auth | Auto-register and login with generated credentials |
gdd_execute_js | Execute JavaScript and return result |
| Tool | Description |
|---|---|
gdd_storage | Read/write/clear localStorage/sessionStorage |
gdd_cookies | Read or clear browser cookies |
| Tool | Description |
|---|---|
gdd_get_manual | Full GDD manual for AI self-learning |
gdd_check_update | Check for newer versions |
gdd_update | Download and install update (restarts GDD) |
| Device | Resolution | Scale | Touch |
|---|---|---|---|
| iPhone SE | 375 x 667 | 2.0x | Yes |
| iPhone 14 | 390 x 844 | 3.0x | Yes |
| iPhone 15 Pro | 393 x 852 | 3.0x | Yes |
| iPhone 15 Pro Max | 430 x 932 | 3.0x | Yes |
| iPhone 16 Pro | 402 x 874 | 3.0x | Yes |
| iPhone 16 Pro Max | 440 x 956 | 3.0x | Yes |
| Pixel 9 | 412 x 915 | 2.625x | Yes |
| Pixel 9 Pro | 412 x 915 | 2.625x | Yes |
| Galaxy S24 | 360 x 780 | 3.0x | Yes |
| Galaxy S24 Ultra | 412 x 915 | 3.0x | Yes |
| OnePlus 12 | 412 x 915 | 3.5x | Yes |
| Device | Resolution | Scale |
|---|---|---|
| iPad Mini | 744 x 1133 | 2.0x |
| iPad Air | 820 x 1180 | 2.0x |
| iPad Pro 11" | 834 x 1194 | 2.0x |
| iPad Pro 13" | 1024 x 1366 | 2.0x |
| Galaxy Tab S9 | 800 x 1280 | 2.0x |
| Pixel Tablet | 800 x 1280 | 2.0x |
| Device | Resolution | Scale |
|---|---|---|
| Laptop HD | 1366 x 768 | 1.0x |
| Laptop HiDPI | 1440 x 900 | 2.0x |
| Desktop 1080p | 1920 x 1080 | 1.0x |
| Desktop 1440p | 2560 x 1440 | 1.0x |
| Desktop 4K | 3840 x 2160 | 2.0x |
Client (AI agent / curl / script)
│ POST /mcp (JSON-RPC 2.0)
▼
McpServer (:9700)
Streamable HTTP + SSE
│
▼
McpToolRegistry (37 tools)
Player · Navigation · Interaction · Read
Emulation · Auth · State · Diagnostics
│
▼
IPlayerManager
MainViewModel (WPF) / HeadlessPlayerManager
│
▼
IBrowserEngine Instances
WebView2 (Win GUI) | Playwright (Headless/Headed)
Each: own profile, CDP session, emulation
| Windows GUI | Headed (default) | Headless | |
|---|---|---|---|
| Binary | GDD.exe | GDD.Headless | GDD.Headless --headless |
| Engine | WebView2 | Playwright | Playwright |
| UI | WPF video wall | Visible Chromium windows | HTTP API only |
| Platforms | Windows | Windows, Linux, macOS | Windows, Linux, macOS |
| Layer | Technology |
|---|---|
| Runtime | .NET 8.0 (self-contained) |
| UI (Windows) | WPF + CommunityToolkit.Mvvm |
| Browser (GUI) | Microsoft WebView2 |
| Browser (Headless) | Microsoft Playwright |
| Protocol | MCP (Model Context Protocol) |
| Browser Control | Chrome DevTools Protocol (CDP) |
| Logging | Serilog |
BrowserXn.sln
├── src/
│ ├── GDD.Core/ ← Shared library (net8.0)
│ │ ├── Abstractions/ ← IBrowserEngine, IPlayerManager, ...
│ │ ├── Mcp/ ← MCP server, tools, protocol
│ │ ├── Models/ ← Device, Location, Network presets
│ │ ├── Services/ ← CDP, Emulation, Monitoring services
│ │ └── Collections/ ← RingBuffer
│ ├── BrowserXn/ ← Windows GUI (WPF + WebView2)
│ │ ├── Engines/ ← WebView2ControlAdapter
│ │ ├── ViewModels/ ← MVVM (MainViewModel : IPlayerManager)
│ │ ├── Views/ ← XAML + VideoWallPanel
│ │ └── ...
│ └── GDD.Headless/ ← Cross-platform CLI (Playwright)
│ ├── Engines/ ← PlaywrightEngine
│ ├── Platform/ ← HeadlessPlayerManager
│ └── Scripts/ ← mcp-proxy.sh, mcp-proxy.ps1
└── .github/workflows/ ← CI/CD (5 platform targets + auto-release)
appsettings.json next to the executable:
{
"GDD": {
"FrontendUrl": "about:blank",
"BackendUrl": "http://localhost:8080/api/v1",
"BotToken": "",
"McpPort": 9700,
"DataFolderRoot": ""
}
}
| Key | Description | Default |
|---|---|---|
FrontendUrl | Default URL for new browsers | about:blank |
BackendUrl | Backend API for auth service | http://localhost:8080/api/v1 |
BotToken | Telegram bot token (for TG testing) | — |
McpPort | MCP server port (auto-fallback +1..+9) | 9700 |
DataFolderRoot | Browser profile storage root | %LOCALAPPDATA%\GDD\Profiles (Win), ~/.local/share/GDD/Profiles (Linux/macOS) |
Headed | Visible browser windows | true (override with --headless) |
Requires .NET 8 SDK.
# Windows GUI (requires Windows 10/11 + WebView2)
dotnet publish src/BrowserXn/BrowserXn.csproj -c Release -p:PublishSingleFile=true -o ./publish/win-gui
# Cross-platform headless
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r linux-x64 --self-contained -o ./publish/linux-x64
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r osx-arm64 --self-contained -o ./publish/osx-arm64
dotnet publish src/GDD.Headless/GDD.Headless.csproj -c Release -r win-x64 --self-contained -o ./publish/win-x64
Chromium installs automatically on first run.
GDD runs entirely on your local machine. No telemetry, no analytics, no data collection.
%LOCALAPPDATA%\GDD\Profiles (Windows) or ~/.local/share/GDD/Profiles (Linux/macOS)gdd_check_update makes a single read-only request to api.github.com. Opt out by not calling the tool, or set CheckForUpdates: false in appsettings.jsonlocalhost only (default port 9700), never exposed to the networkContact: 2vsmirnov@gmail.com
imVS©, free for personal use.
Source Available — Non-Commercial. Free for personal use, education, and research. Commercial use requires a paid license. See LICENSE for full terms.
Commercial licensing: 2vsmirnov@gmail.com
therealtimex/browser-use
jae-jae/fetcher-mcp
merajmehrabi/puppeteer-mcp-server
com.thenextgennexus/playwright-mcp-server
saik0s/mcp-browser-use