dawg-mcp
dawg-mcp gives AI agents access to the DAWG platform for remote stealth browser automation, web scraping, and account monitoring — purpose-built for the Russian web (Runet).
Browser Lifecycle
Provision on-demand remote stealth Chromium browsers with optional Russian residential proxies and geolocation (city slug like
moskvaorlat,loncoordinates)Release browsers back to the pool; list all active sessions
Browser Interaction & Navigation
Navigate to URLs, go back/forward in history
Capture ARIA accessibility snapshots with
[ref=eN]markers for precise element targetingClick (single/double, any mouse button), type, fill forms, select dropdown options, hover, and press keyboard keys (e.g.,
Enter,Control+a)Wait for text to appear/disappear or a fixed duration
Get visible page text or full HTML (optionally scoped to a CSS selector)
Take PNG screenshots (full page or specific element)
Evaluate arbitrary JavaScript on the page and retrieve JSON results
Manage tabs: list, open, select, or close
Web Scraping
Scrape a single page returning content as markdown, text, or HTML (with optional JS rendering, main content extraction, and link discovery)
Start crawl jobs from a seed URL with configurable depth, page limits, concurrency, and URL include/exclude glob patterns
Start batch scrape jobs over many URLs concurrently
Poll or block-wait on crawl/batch job status; cancel running jobs
Account Management
Retrieve current tariff plan, usage consumption, and remaining quota limits for the API key
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dawg-mcp Scrape example.com and return as markdown"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dawg-mcp
An MCP server that gives AI agents (Claude Code, Codex, …) direct access to the DAWG platform.
🇷🇺 Built for Runet. DAWG is purpose-built for the Russian segment of the web: Russian residential proxies and geolocation (city slugs like
moskva,spb, …) and stealth fingerprints tuned for RU sites. If your agent needs to browse or scrape Russian sites (Yandex, Ozon, Wildberries, Avito, gosuslugi, banks, …), this is the tool it was made for.
🌐 Remote stealth browser — provision an on-demand Chromium (RU proxy, geo, stealth baked in) and drive it with snapshot/click/type/screenshot tools.
🔎 Web scraping — single-page scrape plus crawl/batch jobs returning clean markdown/text/html.
📊 Account usage — read the current plan, limits and consumption for your API key.
The browser tools mirror the interaction model of the official
@playwright/mcp: the agent takes an accessibility
snapshot of the page (an ARIA tree with [ref=eN] markers), then targets elements by ref. This
is far more reliable and token-efficient than screenshot-and-guess.
Browsers run on DAWG infrastructure — no local browser is launched or downloaded; the server only attaches to the remote Chromium over CDP.
Requirements
Python ≥ 3.10
A DAWG API key (
X-API-Key) from https://dawgswarm.ruuv(recommended) foruvx/uv run
Related MCP server: browser-control-mcp-server
Install / run
# Recommended — straight from PyPI (fast: downloads a prebuilt wheel)
uvx dawg-mcp
# Or with pip
pip install dawg-mcp && dawg-mcp
# From GitHub (no PyPI), pinned to a tag:
uvx --from git+https://github.com/dawgswarm/dawg-mcp@v0.1.0 dawg-mcp
# Local checkout (development) — run from the repo root
uv run dawg-mcp
# As a module
python -m dawg_mcpDAWG_API_KEY must be set in the environment. No playwright install is needed — the server
connects to a remote browser and never launches Chromium locally.
Register with an agent
Claude Code
Project scope — commit .mcp.json (it reads ${DAWG_API_KEY} from your shell):
{
"mcpServers": {
"dawg": {
"type": "stdio",
"command": "uvx",
"args": ["dawg-mcp"],
"env": {
"DAWG_API_KEY": "${DAWG_API_KEY}",
"DAWG_BASE_URL": "${DAWG_BASE_URL:-https://dawgswarm.ru}"
}
}
}
}Or via the CLI:
claude mcp add dawg --scope user --env DAWG_API_KEY=your_key -- uvx dawg-mcp
# local working tree:
claude mcp add dawg --scope user --env DAWG_API_KEY=your_key \
-- uv run --directory /path/to/dawg-mcp dawg-mcpCodex
Add to ~/.codex/config.toml (see examples/codex_config.toml):
[mcp_servers.dawg]
command = "uvx"
args = ["dawg-mcp"]
[mcp_servers.dawg.env]
DAWG_API_KEY = "your_key"
DAWG_BASE_URL = "https://dawgswarm.ru"Configuration
Env var | Required | Default | Description |
| yes | — | Your DAWG API key |
| no |
| Platform base URL |
| no |
| Max seconds to wait for a browser to be ready |
| no |
| Seconds between readiness polls |
| no |
| Default navigation timeout |
| no |
| Default action timeout |
| no |
| Truncate snapshot/content output |
| no |
| Max concurrent browsers |
| no |
| Log level (logs go to stderr) |
Tools
Browser — lifecycle
Tool | Description |
| Provision a remote stealth Chromium. |
| Release a browser back to the pool. |
| List active sessions. |
Browser — driving
All take an optional session_id (defaults to the sole active session) and return a fresh AI
snapshot after acting. Target elements by ref from the latest browser_snapshot.
Tool | Description |
| Go to a URL. |
| History navigation. |
| See the page — ARIA tree with |
| Click an element by |
| Type into a field by |
| Fill many fields at once ( |
| Choose |
| Hover an element. |
| Press a key ( |
| Wait for text / its disappearance / a delay. |
| Get page text or HTML. |
| PNG image (visual verification only). |
| Run JS, return JSON result. |
|
|
Scraper
Tool | Description |
| Scrape one URL → content. |
| Start a crawl job → |
| Start a batch job → |
| Poll a crawl/batch job. |
| Cancel a job. |
Account
Tool | Description |
| Current usage and tariff plan. |
Typical agent flow
browser_provision() → session_id + snapshot
browser_navigate(url="https://...") → snapshot with [ref=eN] markers
browser_click(element="Login", ref="e12") → fresh snapshot
browser_type(element="Email", ref="e8", text="...", submit=true)
browser_take_screenshot() → PNG to confirm visually
browser_release()If a ref is stale (the page changed), the tool returns an error with a fresh snapshot
appended so the agent can re-select.
Development
uv venv && uv pip install -e ".[dev]"
uv run pytest # 21 unit/integration tests (no network)
uv run ruff check .
# Live end-to-end smoke test (needs a real key):
DAWG_API_KEY=... uv run python examples/smoke_test.py
# Inspect over stdio with the MCP Inspector:
DAWG_API_KEY=... npx @modelcontextprotocol/inspector uv run dawg-mcpLicense
MIT — see LICENSE.
Available Tools
24 toolsaccount_usageA
Get the current account usage and tariff plan for the configured API key.
Returns minute/token consumption, limits and the active plan so the agent can reason about remaining quota before running expensive operations.
Inputs: no named parameters.
browser_clickB
Click an element identified by ref from the latest snapshot.
element is a short human description (e.g. "Login button") used for
diagnostics. Returns a fresh AI snapshot after the click.
Inputs: element (required), ref (required), session_id, double, +1 more.
browser_evaluateA
Evaluate a JavaScript function and return its (JSON-serializable) result.
function is a JS function expression, e.g. "() => document.title" or,
when ref is given, "(el) => el.textContent" receiving the element.
Inputs: function (required), session_id, ref.
browser_fill_formA
Fill multiple form fields in one call.
fields is a list of {"element": desc, "ref": ref, "value": value}.
Returns a fresh AI snapshot.
Inputs: fields (required), session_id.
browser_get_textC
Get the page's visible text or HTML (optionally scoped to a CSS selector).
Inputs: session_id, format, selector.
browser_hoverC
Hover over an element identified by ref. Returns a fresh AI snapshot.
Inputs: element (required), ref (required), session_id.
browser_list_sessionsB
List active provisioned browser sessions.
Inputs: no named parameters.
browser_press_keyC
Press a keyboard key (e.g. "Enter", "Escape", "ArrowDown", "Control+a").
Inputs: key (required), session_id.
browser_provisionA
Provision a remote stealth Chromium and connect to it.
Args: proxy: Optional proxy URL, e.g. "socks5://user:pass@host:port". geo: Optional geolocation — a city slug (e.g. "moskva") or "lat,lon" coordinates (e.g. "55.75,37.61").
Returns session_id (pass it to other browser_* tools), browser_id, the current url/title, and an initial AI snapshot.
Inputs: proxy, geo.
browser_releaseC
Release a provisioned browser back to the pool.
Inputs: session_id.
browser_select_optionB
Select one or more options in a identified by ref.
Inputs: element (required), ref (required), values (required), session_id.
browser_snapshotA
Capture an AI accessibility snapshot of the active page.
This is the primary way to "see" the page: it returns an ARIA tree with [ref=eN] markers. Use those refs with browser_click / browser_type / etc.
Inputs: session_id.
browser_tabsA
Manage tabs: list, open a new tab (optional url), close, or select by index.
list returns the tab list; new/select/close return a fresh AI snapshot of the now-active tab.
Inputs: action, session_id, index, url.
browser_take_screenshotA
Take a PNG screenshot for visual verification.
To act on elements use browser_snapshot (not this); screenshots are for
visually confirming what the page looks like. Pass ref to shoot a
single element, or full_page=true for the whole scrollable page.
Inputs: session_id, full_page, ref.
browser_typeB
Type text into the field identified by ref.
Set clear=true to empty the field first, submit=true to press Enter after. Returns a fresh AI snapshot.
Inputs: element (required), ref (required), text (required), session_id, +2 more.
browser_wait_forA
Wait for text to appear, text to disappear, or a fixed time.
Provide exactly one of text, text_gone, or time_ms.
Returns a fresh AI snapshot.
Inputs: session_id, text, text_gone, time_ms.
scrape_batchB
Start a batch scrape over many URLs. Returns immediately with a job_id.
Poll progress with scrape_job_status(job_id).
Inputs: urls (required), format, concurrency, main_content, +1 more.
scrape_cancel_jobC
Cancel a running crawl/batch job.
Inputs: job_id (required).
scrape_crawlA
Start a crawl job from a seed URL. Returns immediately with a job_id.
Poll progress with scrape_job_status(job_id). Use include_patterns / exclude_patterns (URL glob patterns) to scope the crawl.
Inputs: url (required), format, max_depth, max_pages, +5 more.
scrape_job_statusA
Get the status (and any completed pages) of a crawl/batch job.
Args: job_id: The job id returned by scrape_crawl / scrape_batch. wait: If true, block until the job leaves "running" (or wait_timeout). wait_timeout: Max seconds to wait when wait=true.
Inputs: job_id (required), wait, wait_timeout.
scrape_pageA
Scrape a single URL and return extracted content (no browser session needed).
Args: url: Target URL. format: "markdown" (default), "text", or "html". main_content: Strip nav/footer/ads boilerplate. include_links: Include discovered links in the result. render: None/"auto" (auto-detect, SPA fallback), "http" (no browser, cheapest), or "browser" (force full browser render). timeout_ms: Page fetch timeout in milliseconds.
Inputs: url (required), format, main_content, include_links, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 24 tools
Each browser_ tool has a distinct action (navigate, click, type, screenshot, etc.) and each scrape_ tool has a distinct purpose (single page, batch, crawl, status). The only potential overlap is between browser_snapshot and browser_take_screenshot, but they serve different use cases (interaction vs visual verification). Overall, tools are clearly differentiated.
All tools follow a consistent verb_noun pattern: browser_* for browser operations and scrape_* for scraping operations. All use snake_case. No mixing of conventions, making it predictable and easy to understand.
24 tools is on the higher side but still reasonable for a server that combines browser automation and web scraping. Each tool serves a clear purpose, and the count is justified by the breadth of functionality. Could be reduced slightly, but not overwhelming.
The browser tools cover most common actions (navigation, clicks, form filling, tabs, screenshots, session management). The scraping tools provide single page, batch, and crawl operations with status checks and cancellation. Missing some advanced browser features (e.g., file upload, iframe handling), but the core workflows are well-covered.
Maintenance
Related MCP Connectors
Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
Cloud browser, web extraction, screenshots, and remote CDP tools for AI agents.
Scraper API for HTML, Markdown, and screenshots, web search, and account usage for AI agents.
Cloud browsers for AI agents: saved logins, residential IPs, live human takeover, 57 browser tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides cloud browser automation capabilities for AI agents, including creating, managing, and retrieving recordings and logs from browser sessions.MIT
- AlicenseAqualityCmaintenanceEnables AI agents to fully control a browser for web automation, including navigation, clicking, typing, scrolling, screenshots, and DOM inspection, with session persistence and anti-bot bypass.4043 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control browsers with human-like behavior, stealth anti-detection, and 70 tools for navigation, interaction, and monitoring.10 npm1MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to perform stealth browser automation and anti-detection web interaction, including session management, humanized interactions, and bypassing anti-bot/WAF protections.MIT